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 (true)\n"
430                "  f();\ng();");
431   verifyFormat("if constexpr (a)\n"
432                "  if constexpr (b)\n"
433                "    if constexpr (c)\n"
434                "      g();\n"
435                "h();");
436   verifyFormat("if CONSTEXPR (a)\n"
437                "  if CONSTEXPR (b)\n"
438                "    if CONSTEXPR (c)\n"
439                "      g();\n"
440                "h();");
441   verifyFormat("if constexpr (a)\n"
442                "  if constexpr (b) {\n"
443                "    f();\n"
444                "  }\n"
445                "g();");
446   verifyFormat("if CONSTEXPR (a)\n"
447                "  if CONSTEXPR (b) {\n"
448                "    f();\n"
449                "  }\n"
450                "g();");
451 
452   FormatStyle AllowsMergedIf = getLLVMStyle();
453   AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left;
454   AllowsMergedIf.AllowShortIfStatementsOnASingleLine =
455       FormatStyle::SIS_WithoutElse;
456   verifyFormat("if (a)\n"
457                "  // comment\n"
458                "  f();",
459                AllowsMergedIf);
460   verifyFormat("{\n"
461                "  if (a)\n"
462                "  label:\n"
463                "    f();\n"
464                "}",
465                AllowsMergedIf);
466   verifyFormat("#define A \\\n"
467                "  if (a)  \\\n"
468                "  label:  \\\n"
469                "    f()",
470                AllowsMergedIf);
471   verifyFormat("if (a)\n"
472                "  ;",
473                AllowsMergedIf);
474   verifyFormat("if (a)\n"
475                "  if (b) return;",
476                AllowsMergedIf);
477 
478   verifyFormat("if (a) // Can't merge this\n"
479                "  f();\n",
480                AllowsMergedIf);
481   verifyFormat("if (a) /* still don't merge */\n"
482                "  f();",
483                AllowsMergedIf);
484   verifyFormat("if (a) { // Never merge this\n"
485                "  f();\n"
486                "}",
487                AllowsMergedIf);
488   verifyFormat("if (a) { /* Never merge this */\n"
489                "  f();\n"
490                "}",
491                AllowsMergedIf);
492 
493   AllowsMergedIf.ColumnLimit = 14;
494   verifyFormat("if (a) return;", AllowsMergedIf);
495   verifyFormat("if (aaaaaaaaa)\n"
496                "  return;",
497                AllowsMergedIf);
498 
499   AllowsMergedIf.ColumnLimit = 13;
500   verifyFormat("if (a)\n  return;", AllowsMergedIf);
501 }
502 
503 TEST_F(FormatTest, FormatIfWithoutCompoundStatementButElseWith) {
504   FormatStyle AllowsMergedIf = getLLVMStyle();
505   AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left;
506   AllowsMergedIf.AllowShortIfStatementsOnASingleLine =
507       FormatStyle::SIS_WithoutElse;
508   verifyFormat("if (a)\n"
509                "  f();\n"
510                "else {\n"
511                "  g();\n"
512                "}",
513                AllowsMergedIf);
514   verifyFormat("if (a)\n"
515                "  f();\n"
516                "else\n"
517                "  g();\n",
518                AllowsMergedIf);
519 
520   AllowsMergedIf.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always;
521 
522   verifyFormat("if (a) f();\n"
523                "else {\n"
524                "  g();\n"
525                "}",
526                AllowsMergedIf);
527   verifyFormat("if (a) f();\n"
528                "else {\n"
529                "  if (a) f();\n"
530                "  else {\n"
531                "    g();\n"
532                "  }\n"
533                "  g();\n"
534                "}",
535                AllowsMergedIf);
536 }
537 
538 TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
539   FormatStyle AllowsMergedLoops = getLLVMStyle();
540   AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
541   verifyFormat("while (true) continue;", AllowsMergedLoops);
542   verifyFormat("for (;;) continue;", AllowsMergedLoops);
543   verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
544   verifyFormat("while (true)\n"
545                "  ;",
546                AllowsMergedLoops);
547   verifyFormat("for (;;)\n"
548                "  ;",
549                AllowsMergedLoops);
550   verifyFormat("for (;;)\n"
551                "  for (;;) continue;",
552                AllowsMergedLoops);
553   verifyFormat("for (;;) // Can't merge this\n"
554                "  continue;",
555                AllowsMergedLoops);
556   verifyFormat("for (;;) /* still don't merge */\n"
557                "  continue;",
558                AllowsMergedLoops);
559 }
560 
561 TEST_F(FormatTest, FormatShortBracedStatements) {
562   FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
563   AllowSimpleBracedStatements.ColumnLimit = 40;
564   AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine =
565       FormatStyle::SBS_Always;
566 
567   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine =
568       FormatStyle::SIS_WithoutElse;
569   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
570 
571   AllowSimpleBracedStatements.BreakBeforeBraces = FormatStyle::BS_Custom;
572   AllowSimpleBracedStatements.BraceWrapping.AfterFunction = true;
573   AllowSimpleBracedStatements.BraceWrapping.SplitEmptyRecord = false;
574 
575   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
576   verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
577   verifyFormat("if CONSTEXPR (true) {}", AllowSimpleBracedStatements);
578   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
579   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
580   verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
581   verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
582   verifyFormat("if CONSTEXPR (true) { f(); }", AllowSimpleBracedStatements);
583   verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
584   verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
585   verifyFormat("if (true) {\n"
586                "  ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
587                "}",
588                AllowSimpleBracedStatements);
589   verifyFormat("if (true) { //\n"
590                "  f();\n"
591                "}",
592                AllowSimpleBracedStatements);
593   verifyFormat("if (true) {\n"
594                "  f();\n"
595                "  f();\n"
596                "}",
597                AllowSimpleBracedStatements);
598   verifyFormat("if (true) {\n"
599                "  f();\n"
600                "} else {\n"
601                "  f();\n"
602                "}",
603                AllowSimpleBracedStatements);
604 
605   verifyFormat("struct A2 {\n"
606                "  int X;\n"
607                "};",
608                AllowSimpleBracedStatements);
609   verifyFormat("typedef struct A2 {\n"
610                "  int X;\n"
611                "} A2_t;",
612                AllowSimpleBracedStatements);
613   verifyFormat("template <int> struct A2 {\n"
614                "  struct B {};\n"
615                "};",
616                AllowSimpleBracedStatements);
617 
618   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine =
619       FormatStyle::SIS_Never;
620   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
621   verifyFormat("if (true) {\n"
622                "  f();\n"
623                "}",
624                AllowSimpleBracedStatements);
625   verifyFormat("if (true) {\n"
626                "  f();\n"
627                "} else {\n"
628                "  f();\n"
629                "}",
630                AllowSimpleBracedStatements);
631 
632   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
633   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
634   verifyFormat("while (true) {\n"
635                "  f();\n"
636                "}",
637                AllowSimpleBracedStatements);
638   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
639   verifyFormat("for (;;) {\n"
640                "  f();\n"
641                "}",
642                AllowSimpleBracedStatements);
643 
644   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine =
645       FormatStyle::SIS_WithoutElse;
646   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
647   AllowSimpleBracedStatements.BraceWrapping.AfterControlStatement = true;
648 
649   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
650   verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
651   verifyFormat("if CONSTEXPR (true) {}", AllowSimpleBracedStatements);
652   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
653   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
654   verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
655   verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
656   verifyFormat("if CONSTEXPR (true) { f(); }", AllowSimpleBracedStatements);
657   verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
658   verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
659   verifyFormat("if (true)\n"
660                "{\n"
661                "  ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
662                "}",
663                AllowSimpleBracedStatements);
664   verifyFormat("if (true)\n"
665                "{ //\n"
666                "  f();\n"
667                "}",
668                AllowSimpleBracedStatements);
669   verifyFormat("if (true)\n"
670                "{\n"
671                "  f();\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.AllowShortIfStatementsOnASingleLine =
685       FormatStyle::SIS_Never;
686   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
687   verifyFormat("if (true)\n"
688                "{\n"
689                "  f();\n"
690                "}",
691                AllowSimpleBracedStatements);
692   verifyFormat("if (true)\n"
693                "{\n"
694                "  f();\n"
695                "} else\n"
696                "{\n"
697                "  f();\n"
698                "}",
699                AllowSimpleBracedStatements);
700 
701   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
702   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
703   verifyFormat("while (true)\n"
704                "{\n"
705                "  f();\n"
706                "}",
707                AllowSimpleBracedStatements);
708   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
709   verifyFormat("for (;;)\n"
710                "{\n"
711                "  f();\n"
712                "}",
713                AllowSimpleBracedStatements);
714 }
715 
716 TEST_F(FormatTest, ShortBlocksInMacrosDontMergeWithCodeAfterMacro) {
717   FormatStyle Style = getLLVMStyleWithColumns(60);
718   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always;
719   Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse;
720   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
721   EXPECT_EQ("#define A                                                  \\\n"
722             "  if (HANDLEwernufrnuLwrmviferuvnierv)                     \\\n"
723             "  { RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; }\n"
724             "X;",
725             format("#define A \\\n"
726                    "   if (HANDLEwernufrnuLwrmviferuvnierv) { \\\n"
727                    "      RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; \\\n"
728                    "   }\n"
729                    "X;",
730                    Style));
731 }
732 
733 TEST_F(FormatTest, ParseIfElse) {
734   verifyFormat("if (true)\n"
735                "  if (true)\n"
736                "    if (true)\n"
737                "      f();\n"
738                "    else\n"
739                "      g();\n"
740                "  else\n"
741                "    h();\n"
742                "else\n"
743                "  i();");
744   verifyFormat("if (true)\n"
745                "  if (true)\n"
746                "    if (true) {\n"
747                "      if (true)\n"
748                "        f();\n"
749                "    } else {\n"
750                "      g();\n"
751                "    }\n"
752                "  else\n"
753                "    h();\n"
754                "else {\n"
755                "  i();\n"
756                "}");
757   verifyFormat("if (true)\n"
758                "  if constexpr (true)\n"
759                "    if (true) {\n"
760                "      if constexpr (true)\n"
761                "        f();\n"
762                "    } else {\n"
763                "      g();\n"
764                "    }\n"
765                "  else\n"
766                "    h();\n"
767                "else {\n"
768                "  i();\n"
769                "}");
770   verifyFormat("if (true)\n"
771                "  if CONSTEXPR (true)\n"
772                "    if (true) {\n"
773                "      if CONSTEXPR (true)\n"
774                "        f();\n"
775                "    } else {\n"
776                "      g();\n"
777                "    }\n"
778                "  else\n"
779                "    h();\n"
780                "else {\n"
781                "  i();\n"
782                "}");
783   verifyFormat("void f() {\n"
784                "  if (a) {\n"
785                "  } else {\n"
786                "  }\n"
787                "}");
788 }
789 
790 TEST_F(FormatTest, ElseIf) {
791   verifyFormat("if (a) {\n} else if (b) {\n}");
792   verifyFormat("if (a)\n"
793                "  f();\n"
794                "else if (b)\n"
795                "  g();\n"
796                "else\n"
797                "  h();");
798   verifyFormat("if constexpr (a)\n"
799                "  f();\n"
800                "else if constexpr (b)\n"
801                "  g();\n"
802                "else\n"
803                "  h();");
804   verifyFormat("if CONSTEXPR (a)\n"
805                "  f();\n"
806                "else if CONSTEXPR (b)\n"
807                "  g();\n"
808                "else\n"
809                "  h();");
810   verifyFormat("if (a) {\n"
811                "  f();\n"
812                "}\n"
813                "// or else ..\n"
814                "else {\n"
815                "  g()\n"
816                "}");
817 
818   verifyFormat("if (a) {\n"
819                "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
820                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
821                "}");
822   verifyFormat("if (a) {\n"
823                "} else if constexpr (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
824                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
825                "}");
826   verifyFormat("if (a) {\n"
827                "} else if CONSTEXPR (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
828                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
829                "}");
830   verifyFormat("if (a) {\n"
831                "} else if (\n"
832                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
833                "}",
834                getLLVMStyleWithColumns(62));
835   verifyFormat("if (a) {\n"
836                "} else if constexpr (\n"
837                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
838                "}",
839                getLLVMStyleWithColumns(62));
840   verifyFormat("if (a) {\n"
841                "} else if CONSTEXPR (\n"
842                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
843                "}",
844                getLLVMStyleWithColumns(62));
845 }
846 
847 TEST_F(FormatTest, FormatsForLoop) {
848   verifyFormat(
849       "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
850       "     ++VeryVeryLongLoopVariable)\n"
851       "  ;");
852   verifyFormat("for (;;)\n"
853                "  f();");
854   verifyFormat("for (;;) {\n}");
855   verifyFormat("for (;;) {\n"
856                "  f();\n"
857                "}");
858   verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
859 
860   verifyFormat(
861       "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
862       "                                          E = UnwrappedLines.end();\n"
863       "     I != E; ++I) {\n}");
864 
865   verifyFormat(
866       "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
867       "     ++IIIII) {\n}");
868   verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
869                "         aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
870                "     aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
871   verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
872                "         I = FD->getDeclsInPrototypeScope().begin(),\n"
873                "         E = FD->getDeclsInPrototypeScope().end();\n"
874                "     I != E; ++I) {\n}");
875   verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
876                "         I = Container.begin(),\n"
877                "         E = Container.end();\n"
878                "     I != E; ++I) {\n}",
879                getLLVMStyleWithColumns(76));
880 
881   verifyFormat(
882       "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
883       "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
884       "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
885       "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
886       "     ++aaaaaaaaaaa) {\n}");
887   verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
888                "                bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
889                "     ++i) {\n}");
890   verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
891                "     aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
892                "}");
893   verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
894                "         aaaaaaaaaa);\n"
895                "     iter; ++iter) {\n"
896                "}");
897   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
898                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
899                "     aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
900                "     ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
901 
902   // These should not be formatted as Objective-C for-in loops.
903   verifyFormat("for (Foo *x = 0; x != in; x++) {\n}");
904   verifyFormat("Foo *x;\nfor (x = 0; x != in; x++) {\n}");
905   verifyFormat("Foo *x;\nfor (x in y) {\n}");
906   verifyFormat("for (const Foo<Bar> &baz = in.value(); !baz.at_end(); ++baz) {\n}");
907 
908   FormatStyle NoBinPacking = getLLVMStyle();
909   NoBinPacking.BinPackParameters = false;
910   verifyFormat("for (int aaaaaaaaaaa = 1;\n"
911                "     aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
912                "                                           aaaaaaaaaaaaaaaa,\n"
913                "                                           aaaaaaaaaaaaaaaa,\n"
914                "                                           aaaaaaaaaaaaaaaa);\n"
915                "     aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
916                "}",
917                NoBinPacking);
918   verifyFormat(
919       "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
920       "                                          E = UnwrappedLines.end();\n"
921       "     I != E;\n"
922       "     ++I) {\n}",
923       NoBinPacking);
924 
925   FormatStyle AlignLeft = getLLVMStyle();
926   AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
927   verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft);
928 }
929 
930 TEST_F(FormatTest, RangeBasedForLoops) {
931   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
932                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
933   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
934                "     aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
935   verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
936                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
937   verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
938                "     aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
939 }
940 
941 TEST_F(FormatTest, ForEachLoops) {
942   verifyFormat("void f() {\n"
943                "  foreach (Item *item, itemlist) {}\n"
944                "  Q_FOREACH (Item *item, itemlist) {}\n"
945                "  BOOST_FOREACH (Item *item, itemlist) {}\n"
946                "  UNKNOWN_FORACH(Item * item, itemlist) {}\n"
947                "}");
948 
949   // As function-like macros.
950   verifyFormat("#define foreach(x, y)\n"
951                "#define Q_FOREACH(x, y)\n"
952                "#define BOOST_FOREACH(x, y)\n"
953                "#define UNKNOWN_FOREACH(x, y)\n");
954 
955   // Not as function-like macros.
956   verifyFormat("#define foreach (x, y)\n"
957                "#define Q_FOREACH (x, y)\n"
958                "#define BOOST_FOREACH (x, y)\n"
959                "#define UNKNOWN_FOREACH (x, y)\n");
960 }
961 
962 TEST_F(FormatTest, FormatsWhileLoop) {
963   verifyFormat("while (true) {\n}");
964   verifyFormat("while (true)\n"
965                "  f();");
966   verifyFormat("while () {\n}");
967   verifyFormat("while () {\n"
968                "  f();\n"
969                "}");
970 }
971 
972 TEST_F(FormatTest, FormatsDoWhile) {
973   verifyFormat("do {\n"
974                "  do_something();\n"
975                "} while (something());");
976   verifyFormat("do\n"
977                "  do_something();\n"
978                "while (something());");
979 }
980 
981 TEST_F(FormatTest, FormatsSwitchStatement) {
982   verifyFormat("switch (x) {\n"
983                "case 1:\n"
984                "  f();\n"
985                "  break;\n"
986                "case kFoo:\n"
987                "case ns::kBar:\n"
988                "case kBaz:\n"
989                "  break;\n"
990                "default:\n"
991                "  g();\n"
992                "  break;\n"
993                "}");
994   verifyFormat("switch (x) {\n"
995                "case 1: {\n"
996                "  f();\n"
997                "  break;\n"
998                "}\n"
999                "case 2: {\n"
1000                "  break;\n"
1001                "}\n"
1002                "}");
1003   verifyFormat("switch (x) {\n"
1004                "case 1: {\n"
1005                "  f();\n"
1006                "  {\n"
1007                "    g();\n"
1008                "    h();\n"
1009                "  }\n"
1010                "  break;\n"
1011                "}\n"
1012                "}");
1013   verifyFormat("switch (x) {\n"
1014                "case 1: {\n"
1015                "  f();\n"
1016                "  if (foo) {\n"
1017                "    g();\n"
1018                "    h();\n"
1019                "  }\n"
1020                "  break;\n"
1021                "}\n"
1022                "}");
1023   verifyFormat("switch (x) {\n"
1024                "case 1: {\n"
1025                "  f();\n"
1026                "  g();\n"
1027                "} break;\n"
1028                "}");
1029   verifyFormat("switch (test)\n"
1030                "  ;");
1031   verifyFormat("switch (x) {\n"
1032                "default: {\n"
1033                "  // Do nothing.\n"
1034                "}\n"
1035                "}");
1036   verifyFormat("switch (x) {\n"
1037                "// comment\n"
1038                "// if 1, do f()\n"
1039                "case 1:\n"
1040                "  f();\n"
1041                "}");
1042   verifyFormat("switch (x) {\n"
1043                "case 1:\n"
1044                "  // Do amazing stuff\n"
1045                "  {\n"
1046                "    f();\n"
1047                "    g();\n"
1048                "  }\n"
1049                "  break;\n"
1050                "}");
1051   verifyFormat("#define A          \\\n"
1052                "  switch (x) {     \\\n"
1053                "  case a:          \\\n"
1054                "    foo = b;       \\\n"
1055                "  }",
1056                getLLVMStyleWithColumns(20));
1057   verifyFormat("#define OPERATION_CASE(name)           \\\n"
1058                "  case OP_name:                        \\\n"
1059                "    return operations::Operation##name\n",
1060                getLLVMStyleWithColumns(40));
1061   verifyFormat("switch (x) {\n"
1062                "case 1:;\n"
1063                "default:;\n"
1064                "  int i;\n"
1065                "}");
1066 
1067   verifyGoogleFormat("switch (x) {\n"
1068                      "  case 1:\n"
1069                      "    f();\n"
1070                      "    break;\n"
1071                      "  case kFoo:\n"
1072                      "  case ns::kBar:\n"
1073                      "  case kBaz:\n"
1074                      "    break;\n"
1075                      "  default:\n"
1076                      "    g();\n"
1077                      "    break;\n"
1078                      "}");
1079   verifyGoogleFormat("switch (x) {\n"
1080                      "  case 1: {\n"
1081                      "    f();\n"
1082                      "    break;\n"
1083                      "  }\n"
1084                      "}");
1085   verifyGoogleFormat("switch (test)\n"
1086                      "  ;");
1087 
1088   verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
1089                      "  case OP_name:              \\\n"
1090                      "    return operations::Operation##name\n");
1091   verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
1092                      "  // Get the correction operation class.\n"
1093                      "  switch (OpCode) {\n"
1094                      "    CASE(Add);\n"
1095                      "    CASE(Subtract);\n"
1096                      "    default:\n"
1097                      "      return operations::Unknown;\n"
1098                      "  }\n"
1099                      "#undef OPERATION_CASE\n"
1100                      "}");
1101   verifyFormat("DEBUG({\n"
1102                "  switch (x) {\n"
1103                "  case A:\n"
1104                "    f();\n"
1105                "    break;\n"
1106                "    // fallthrough\n"
1107                "  case B:\n"
1108                "    g();\n"
1109                "    break;\n"
1110                "  }\n"
1111                "});");
1112   EXPECT_EQ("DEBUG({\n"
1113             "  switch (x) {\n"
1114             "  case A:\n"
1115             "    f();\n"
1116             "    break;\n"
1117             "  // On B:\n"
1118             "  case B:\n"
1119             "    g();\n"
1120             "    break;\n"
1121             "  }\n"
1122             "});",
1123             format("DEBUG({\n"
1124                    "  switch (x) {\n"
1125                    "  case A:\n"
1126                    "    f();\n"
1127                    "    break;\n"
1128                    "  // On B:\n"
1129                    "  case B:\n"
1130                    "    g();\n"
1131                    "    break;\n"
1132                    "  }\n"
1133                    "});",
1134                    getLLVMStyle()));
1135   EXPECT_EQ("switch (n) {\n"
1136             "case 0: {\n"
1137             "  return false;\n"
1138             "}\n"
1139             "default: {\n"
1140             "  return true;\n"
1141             "}\n"
1142             "}",
1143             format("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                    getLLVMStyle()));
1153   verifyFormat("switch (a) {\n"
1154                "case (b):\n"
1155                "  return;\n"
1156                "}");
1157 
1158   verifyFormat("switch (a) {\n"
1159                "case some_namespace::\n"
1160                "    some_constant:\n"
1161                "  return;\n"
1162                "}",
1163                getLLVMStyleWithColumns(34));
1164 
1165   FormatStyle Style = getLLVMStyle();
1166   Style.IndentCaseLabels = true;
1167   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never;
1168   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1169   Style.BraceWrapping.AfterCaseLabel = true;
1170   Style.BraceWrapping.AfterControlStatement = true;
1171   EXPECT_EQ("switch (n)\n"
1172             "{\n"
1173             "  case 0:\n"
1174             "  {\n"
1175             "    return false;\n"
1176             "  }\n"
1177             "  default:\n"
1178             "  {\n"
1179             "    return true;\n"
1180             "  }\n"
1181             "}",
1182             format("switch (n) {\n"
1183                    "  case 0: {\n"
1184                    "    return false;\n"
1185                    "  }\n"
1186                    "  default: {\n"
1187                    "    return true;\n"
1188                    "  }\n"
1189                    "}",
1190                    Style));
1191   Style.BraceWrapping.AfterCaseLabel = false;
1192   EXPECT_EQ("switch (n)\n"
1193             "{\n"
1194             "  case 0: {\n"
1195             "    return false;\n"
1196             "  }\n"
1197             "  default: {\n"
1198             "    return true;\n"
1199             "  }\n"
1200             "}",
1201             format("switch (n) {\n"
1202                    "  case 0:\n"
1203                    "  {\n"
1204                    "    return false;\n"
1205                    "  }\n"
1206                    "  default:\n"
1207                    "  {\n"
1208                    "    return true;\n"
1209                    "  }\n"
1210                    "}",
1211                    Style));
1212 }
1213 
1214 TEST_F(FormatTest, CaseRanges) {
1215   verifyFormat("switch (x) {\n"
1216                "case 'A' ... 'Z':\n"
1217                "case 1 ... 5:\n"
1218                "case a ... b:\n"
1219                "  break;\n"
1220                "}");
1221 }
1222 
1223 TEST_F(FormatTest, ShortCaseLabels) {
1224   FormatStyle Style = getLLVMStyle();
1225   Style.AllowShortCaseLabelsOnASingleLine = true;
1226   verifyFormat("switch (a) {\n"
1227                "case 1: x = 1; break;\n"
1228                "case 2: return;\n"
1229                "case 3:\n"
1230                "case 4:\n"
1231                "case 5: return;\n"
1232                "case 6: // comment\n"
1233                "  return;\n"
1234                "case 7:\n"
1235                "  // comment\n"
1236                "  return;\n"
1237                "case 8:\n"
1238                "  x = 8; // comment\n"
1239                "  break;\n"
1240                "default: y = 1; break;\n"
1241                "}",
1242                Style);
1243   verifyFormat("switch (a) {\n"
1244                "case 0: return; // comment\n"
1245                "case 1: break;  // comment\n"
1246                "case 2: return;\n"
1247                "// comment\n"
1248                "case 3: return;\n"
1249                "// comment 1\n"
1250                "// comment 2\n"
1251                "// comment 3\n"
1252                "case 4: break; /* comment */\n"
1253                "case 5:\n"
1254                "  // comment\n"
1255                "  break;\n"
1256                "case 6: /* comment */ x = 1; break;\n"
1257                "case 7: x = /* comment */ 1; break;\n"
1258                "case 8:\n"
1259                "  x = 1; /* comment */\n"
1260                "  break;\n"
1261                "case 9:\n"
1262                "  break; // comment line 1\n"
1263                "         // comment line 2\n"
1264                "}",
1265                Style);
1266   EXPECT_EQ("switch (a) {\n"
1267             "case 1:\n"
1268             "  x = 8;\n"
1269             "  // fall through\n"
1270             "case 2: x = 8;\n"
1271             "// comment\n"
1272             "case 3:\n"
1273             "  return; /* comment line 1\n"
1274             "           * comment line 2 */\n"
1275             "case 4: i = 8;\n"
1276             "// something else\n"
1277             "#if FOO\n"
1278             "case 5: break;\n"
1279             "#endif\n"
1280             "}",
1281             format("switch (a) {\n"
1282                    "case 1: x = 8;\n"
1283                    "  // fall through\n"
1284                    "case 2:\n"
1285                    "  x = 8;\n"
1286                    "// comment\n"
1287                    "case 3:\n"
1288                    "  return; /* comment line 1\n"
1289                    "           * comment line 2 */\n"
1290                    "case 4:\n"
1291                    "  i = 8;\n"
1292                    "// something else\n"
1293                    "#if FOO\n"
1294                    "case 5: break;\n"
1295                    "#endif\n"
1296                    "}",
1297                    Style));
1298   EXPECT_EQ("switch (a) {\n" "case 0:\n"
1299             "  return; // long long long long long long long long long long long long comment\n"
1300             "          // line\n" "}",
1301             format("switch (a) {\n"
1302                    "case 0: return; // long long long long long long long long long long long long comment line\n"
1303                    "}",
1304                    Style));
1305   EXPECT_EQ("switch (a) {\n"
1306             "case 0:\n"
1307             "  return; /* long long long long long long long long long long long long comment\n"
1308             "             line */\n"
1309             "}",
1310             format("switch (a) {\n"
1311                    "case 0: return; /* long long long long long long long long long long long long comment line */\n"
1312                    "}",
1313                    Style));
1314   verifyFormat("switch (a) {\n"
1315                "#if FOO\n"
1316                "case 0: return 0;\n"
1317                "#endif\n"
1318                "}",
1319                Style);
1320   verifyFormat("switch (a) {\n"
1321                "case 1: {\n"
1322                "}\n"
1323                "case 2: {\n"
1324                "  return;\n"
1325                "}\n"
1326                "case 3: {\n"
1327                "  x = 1;\n"
1328                "  return;\n"
1329                "}\n"
1330                "case 4:\n"
1331                "  if (x)\n"
1332                "    return;\n"
1333                "}",
1334                Style);
1335   Style.ColumnLimit = 21;
1336   verifyFormat("switch (a) {\n"
1337                "case 1: x = 1; break;\n"
1338                "case 2: return;\n"
1339                "case 3:\n"
1340                "case 4:\n"
1341                "case 5: return;\n"
1342                "default:\n"
1343                "  y = 1;\n"
1344                "  break;\n"
1345                "}",
1346                Style);
1347   Style.ColumnLimit = 80;
1348   Style.AllowShortCaseLabelsOnASingleLine = false;
1349   Style.IndentCaseLabels = true;
1350   EXPECT_EQ("switch (n) {\n"
1351             "  default /*comments*/:\n"
1352             "    return true;\n"
1353             "  case 0:\n"
1354             "    return false;\n"
1355             "}",
1356             format("switch (n) {\n"
1357                    "default/*comments*/:\n"
1358                    "  return true;\n"
1359                    "case 0:\n"
1360                    "  return false;\n"
1361                    "}",
1362                    Style));
1363   Style.AllowShortCaseLabelsOnASingleLine = true;
1364   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1365   Style.BraceWrapping.AfterCaseLabel = true;
1366   Style.BraceWrapping.AfterControlStatement = true;
1367   EXPECT_EQ("switch (n)\n"
1368             "{\n"
1369             "  case 0:\n"
1370             "  {\n"
1371             "    return false;\n"
1372             "  }\n"
1373             "  default:\n"
1374             "  {\n"
1375             "    return true;\n"
1376             "  }\n"
1377             "}",
1378             format("switch (n) {\n"
1379                    "  case 0: {\n"
1380                    "    return false;\n"
1381                    "  }\n"
1382                    "  default:\n"
1383                    "  {\n"
1384                    "    return true;\n"
1385                    "  }\n"
1386                    "}",
1387                    Style));
1388 }
1389 
1390 TEST_F(FormatTest, FormatsLabels) {
1391   verifyFormat("void f() {\n"
1392                "  some_code();\n"
1393                "test_label:\n"
1394                "  some_other_code();\n"
1395                "  {\n"
1396                "    some_more_code();\n"
1397                "  another_label:\n"
1398                "    some_more_code();\n"
1399                "  }\n"
1400                "}");
1401   verifyFormat("{\n"
1402                "  some_code();\n"
1403                "test_label:\n"
1404                "  some_other_code();\n"
1405                "}");
1406   verifyFormat("{\n"
1407                "  some_code();\n"
1408                "test_label:;\n"
1409                "  int i = 0;\n"
1410                "}");
1411 }
1412 
1413 //===----------------------------------------------------------------------===//
1414 // Tests for classes, namespaces, etc.
1415 //===----------------------------------------------------------------------===//
1416 
1417 TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
1418   verifyFormat("class A {};");
1419 }
1420 
1421 TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1422   verifyFormat("class A {\n"
1423                "public:\n"
1424                "public: // comment\n"
1425                "protected:\n"
1426                "private:\n"
1427                "  void f() {}\n"
1428                "};");
1429   verifyFormat("export class A {\n"
1430                "public:\n"
1431                "public: // comment\n"
1432                "protected:\n"
1433                "private:\n"
1434                "  void f() {}\n"
1435                "};");
1436   verifyGoogleFormat("class A {\n"
1437                      " public:\n"
1438                      " protected:\n"
1439                      " private:\n"
1440                      "  void f() {}\n"
1441                      "};");
1442   verifyGoogleFormat("export class A {\n"
1443                      " public:\n"
1444                      " protected:\n"
1445                      " private:\n"
1446                      "  void f() {}\n"
1447                      "};");
1448   verifyFormat("class A {\n"
1449                "public slots:\n"
1450                "  void f1() {}\n"
1451                "public Q_SLOTS:\n"
1452                "  void f2() {}\n"
1453                "protected slots:\n"
1454                "  void f3() {}\n"
1455                "protected Q_SLOTS:\n"
1456                "  void f4() {}\n"
1457                "private slots:\n"
1458                "  void f5() {}\n"
1459                "private Q_SLOTS:\n"
1460                "  void f6() {}\n"
1461                "signals:\n"
1462                "  void g1();\n"
1463                "Q_SIGNALS:\n"
1464                "  void g2();\n"
1465                "};");
1466 
1467   // Don't interpret 'signals' the wrong way.
1468   verifyFormat("signals.set();");
1469   verifyFormat("for (Signals signals : f()) {\n}");
1470   verifyFormat("{\n"
1471                "  signals.set(); // This needs indentation.\n"
1472                "}");
1473   verifyFormat("void f() {\n"
1474                "label:\n"
1475                "  signals.baz();\n"
1476                "}");
1477 }
1478 
1479 TEST_F(FormatTest, SeparatesLogicalBlocks) {
1480   EXPECT_EQ("class A {\n"
1481             "public:\n"
1482             "  void f();\n"
1483             "\n"
1484             "private:\n"
1485             "  void g() {}\n"
1486             "  // test\n"
1487             "protected:\n"
1488             "  int h;\n"
1489             "};",
1490             format("class A {\n"
1491                    "public:\n"
1492                    "void f();\n"
1493                    "private:\n"
1494                    "void g() {}\n"
1495                    "// test\n"
1496                    "protected:\n"
1497                    "int h;\n"
1498                    "};"));
1499   EXPECT_EQ("class A {\n"
1500             "protected:\n"
1501             "public:\n"
1502             "  void f();\n"
1503             "};",
1504             format("class A {\n"
1505                    "protected:\n"
1506                    "\n"
1507                    "public:\n"
1508                    "\n"
1509                    "  void f();\n"
1510                    "};"));
1511 
1512   // Even ensure proper spacing inside macros.
1513   EXPECT_EQ("#define B     \\\n"
1514             "  class A {   \\\n"
1515             "   protected: \\\n"
1516             "   public:    \\\n"
1517             "    void f(); \\\n"
1518             "  };",
1519             format("#define B     \\\n"
1520                    "  class A {   \\\n"
1521                    "   protected: \\\n"
1522                    "              \\\n"
1523                    "   public:    \\\n"
1524                    "              \\\n"
1525                    "    void f(); \\\n"
1526                    "  };",
1527                    getGoogleStyle()));
1528   // But don't remove empty lines after macros ending in access specifiers.
1529   EXPECT_EQ("#define A private:\n"
1530             "\n"
1531             "int i;",
1532             format("#define A         private:\n"
1533                    "\n"
1534                    "int              i;"));
1535 }
1536 
1537 TEST_F(FormatTest, FormatsClasses) {
1538   verifyFormat("class A : public B {};");
1539   verifyFormat("class A : public ::B {};");
1540 
1541   verifyFormat(
1542       "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1543       "                             public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
1544   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1545                "    : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1546                "      public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
1547   verifyFormat(
1548       "class A : public B, public C, public D, public E, public F {};");
1549   verifyFormat("class AAAAAAAAAAAA : public B,\n"
1550                "                     public C,\n"
1551                "                     public D,\n"
1552                "                     public E,\n"
1553                "                     public F,\n"
1554                "                     public G {};");
1555 
1556   verifyFormat("class\n"
1557                "    ReallyReallyLongClassName {\n"
1558                "  int i;\n"
1559                "};",
1560                getLLVMStyleWithColumns(32));
1561   verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1562                "                           aaaaaaaaaaaaaaaa> {};");
1563   verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1564                "    : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1565                "                                 aaaaaaaaaaaaaaaaaaaaaa> {};");
1566   verifyFormat("template <class R, class C>\n"
1567                "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1568                "    : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
1569   verifyFormat("class ::A::B {};");
1570 }
1571 
1572 TEST_F(FormatTest, BreakInheritanceStyle) {
1573   FormatStyle StyleWithInheritanceBreakBeforeComma = getLLVMStyle();
1574   StyleWithInheritanceBreakBeforeComma.BreakInheritanceList =
1575           FormatStyle::BILS_BeforeComma;
1576   verifyFormat("class MyClass : public X {};",
1577                StyleWithInheritanceBreakBeforeComma);
1578   verifyFormat("class MyClass\n"
1579                "    : public X\n"
1580                "    , public Y {};",
1581                StyleWithInheritanceBreakBeforeComma);
1582   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA\n"
1583                "    : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n"
1584                "    , public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};",
1585                StyleWithInheritanceBreakBeforeComma);
1586   verifyFormat("struct aaaaaaaaaaaaa\n"
1587                "    : public aaaaaaaaaaaaaaaaaaa< // break\n"
1588                "          aaaaaaaaaaaaaaaa> {};",
1589                StyleWithInheritanceBreakBeforeComma);
1590 
1591   FormatStyle StyleWithInheritanceBreakAfterColon = getLLVMStyle();
1592   StyleWithInheritanceBreakAfterColon.BreakInheritanceList =
1593           FormatStyle::BILS_AfterColon;
1594   verifyFormat("class MyClass : public X {};",
1595                StyleWithInheritanceBreakAfterColon);
1596   verifyFormat("class MyClass : public X, public Y {};",
1597                StyleWithInheritanceBreakAfterColon);
1598   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA :\n"
1599                "    public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1600                "    public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};",
1601                StyleWithInheritanceBreakAfterColon);
1602   verifyFormat("struct aaaaaaaaaaaaa :\n"
1603                "    public aaaaaaaaaaaaaaaaaaa< // break\n"
1604                "        aaaaaaaaaaaaaaaa> {};",
1605                StyleWithInheritanceBreakAfterColon);
1606 }
1607 
1608 TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
1609   verifyFormat("class A {\n} a, b;");
1610   verifyFormat("struct A {\n} a, b;");
1611   verifyFormat("union A {\n} a;");
1612 }
1613 
1614 TEST_F(FormatTest, FormatsEnum) {
1615   verifyFormat("enum {\n"
1616                "  Zero,\n"
1617                "  One = 1,\n"
1618                "  Two = One + 1,\n"
1619                "  Three = (One + Two),\n"
1620                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1621                "  Five = (One, Two, Three, Four, 5)\n"
1622                "};");
1623   verifyGoogleFormat("enum {\n"
1624                      "  Zero,\n"
1625                      "  One = 1,\n"
1626                      "  Two = One + 1,\n"
1627                      "  Three = (One + Two),\n"
1628                      "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1629                      "  Five = (One, Two, Three, Four, 5)\n"
1630                      "};");
1631   verifyFormat("enum Enum {};");
1632   verifyFormat("enum {};");
1633   verifyFormat("enum X E {} d;");
1634   verifyFormat("enum __attribute__((...)) E {} d;");
1635   verifyFormat("enum __declspec__((...)) E {} d;");
1636   verifyFormat("enum {\n"
1637                "  Bar = Foo<int, int>::value\n"
1638                "};",
1639                getLLVMStyleWithColumns(30));
1640 
1641   verifyFormat("enum ShortEnum { A, B, C };");
1642   verifyGoogleFormat("enum ShortEnum { A, B, C };");
1643 
1644   EXPECT_EQ("enum KeepEmptyLines {\n"
1645             "  ONE,\n"
1646             "\n"
1647             "  TWO,\n"
1648             "\n"
1649             "  THREE\n"
1650             "}",
1651             format("enum KeepEmptyLines {\n"
1652                    "  ONE,\n"
1653                    "\n"
1654                    "  TWO,\n"
1655                    "\n"
1656                    "\n"
1657                    "  THREE\n"
1658                    "}"));
1659   verifyFormat("enum E { // comment\n"
1660                "  ONE,\n"
1661                "  TWO\n"
1662                "};\n"
1663                "int i;");
1664   // Not enums.
1665   verifyFormat("enum X f() {\n"
1666                "  a();\n"
1667                "  return 42;\n"
1668                "}");
1669   verifyFormat("enum X Type::f() {\n"
1670                "  a();\n"
1671                "  return 42;\n"
1672                "}");
1673   verifyFormat("enum ::X f() {\n"
1674                "  a();\n"
1675                "  return 42;\n"
1676                "}");
1677   verifyFormat("enum ns::X f() {\n"
1678                "  a();\n"
1679                "  return 42;\n"
1680                "}");
1681 }
1682 
1683 TEST_F(FormatTest, FormatsEnumsWithErrors) {
1684   verifyFormat("enum Type {\n"
1685                "  One = 0; // These semicolons should be commas.\n"
1686                "  Two = 1;\n"
1687                "};");
1688   verifyFormat("namespace n {\n"
1689                "enum Type {\n"
1690                "  One,\n"
1691                "  Two, // missing };\n"
1692                "  int i;\n"
1693                "}\n"
1694                "void g() {}");
1695 }
1696 
1697 TEST_F(FormatTest, FormatsEnumStruct) {
1698   verifyFormat("enum struct {\n"
1699                "  Zero,\n"
1700                "  One = 1,\n"
1701                "  Two = One + 1,\n"
1702                "  Three = (One + Two),\n"
1703                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1704                "  Five = (One, Two, Three, Four, 5)\n"
1705                "};");
1706   verifyFormat("enum struct Enum {};");
1707   verifyFormat("enum struct {};");
1708   verifyFormat("enum struct X E {} d;");
1709   verifyFormat("enum struct __attribute__((...)) E {} d;");
1710   verifyFormat("enum struct __declspec__((...)) E {} d;");
1711   verifyFormat("enum struct X f() {\n  a();\n  return 42;\n}");
1712 }
1713 
1714 TEST_F(FormatTest, FormatsEnumClass) {
1715   verifyFormat("enum class {\n"
1716                "  Zero,\n"
1717                "  One = 1,\n"
1718                "  Two = One + 1,\n"
1719                "  Three = (One + Two),\n"
1720                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1721                "  Five = (One, Two, Three, Four, 5)\n"
1722                "};");
1723   verifyFormat("enum class Enum {};");
1724   verifyFormat("enum class {};");
1725   verifyFormat("enum class X E {} d;");
1726   verifyFormat("enum class __attribute__((...)) E {} d;");
1727   verifyFormat("enum class __declspec__((...)) E {} d;");
1728   verifyFormat("enum class X f() {\n  a();\n  return 42;\n}");
1729 }
1730 
1731 TEST_F(FormatTest, FormatsEnumTypes) {
1732   verifyFormat("enum X : int {\n"
1733                "  A, // Force multiple lines.\n"
1734                "  B\n"
1735                "};");
1736   verifyFormat("enum X : int { A, B };");
1737   verifyFormat("enum X : std::uint32_t { A, B };");
1738 }
1739 
1740 TEST_F(FormatTest, FormatsTypedefEnum) {
1741   FormatStyle Style = getLLVMStyle();
1742   Style.ColumnLimit = 40;
1743   verifyFormat("typedef enum {} EmptyEnum;");
1744   verifyFormat("typedef enum { A, B, C } ShortEnum;");
1745   verifyFormat("typedef enum {\n"
1746                "  ZERO = 0,\n"
1747                "  ONE = 1,\n"
1748                "  TWO = 2,\n"
1749                "  THREE = 3\n"
1750                "} LongEnum;",
1751                Style);
1752   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1753   Style.BraceWrapping.AfterEnum = true;
1754   verifyFormat("typedef enum {} EmptyEnum;");
1755   verifyFormat("typedef enum { A, B, C } ShortEnum;");
1756   verifyFormat("typedef enum\n"
1757                "{\n"
1758                "  ZERO = 0,\n"
1759                "  ONE = 1,\n"
1760                "  TWO = 2,\n"
1761                "  THREE = 3\n"
1762                "} LongEnum;",
1763                Style);
1764 }
1765 
1766 TEST_F(FormatTest, FormatsNSEnums) {
1767   verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
1768   verifyGoogleFormat(
1769       "typedef NS_CLOSED_ENUM(NSInteger, SomeName) { AAA, BBB }");
1770   verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
1771                      "  // Information about someDecentlyLongValue.\n"
1772                      "  someDecentlyLongValue,\n"
1773                      "  // Information about anotherDecentlyLongValue.\n"
1774                      "  anotherDecentlyLongValue,\n"
1775                      "  // Information about aThirdDecentlyLongValue.\n"
1776                      "  aThirdDecentlyLongValue\n"
1777                      "};");
1778   verifyGoogleFormat("typedef NS_CLOSED_ENUM(NSInteger, MyType) {\n"
1779                      "  // Information about someDecentlyLongValue.\n"
1780                      "  someDecentlyLongValue,\n"
1781                      "  // Information about anotherDecentlyLongValue.\n"
1782                      "  anotherDecentlyLongValue,\n"
1783                      "  // Information about aThirdDecentlyLongValue.\n"
1784                      "  aThirdDecentlyLongValue\n"
1785                      "};");
1786   verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
1787                      "  a = 1,\n"
1788                      "  b = 2,\n"
1789                      "  c = 3,\n"
1790                      "};");
1791   verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
1792                      "  a = 1,\n"
1793                      "  b = 2,\n"
1794                      "  c = 3,\n"
1795                      "};");
1796   verifyGoogleFormat("typedef CF_CLOSED_ENUM(NSInteger, MyType) {\n"
1797                      "  a = 1,\n"
1798                      "  b = 2,\n"
1799                      "  c = 3,\n"
1800                      "};");
1801   verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
1802                      "  a = 1,\n"
1803                      "  b = 2,\n"
1804                      "  c = 3,\n"
1805                      "};");
1806 }
1807 
1808 TEST_F(FormatTest, FormatsBitfields) {
1809   verifyFormat("struct Bitfields {\n"
1810                "  unsigned sClass : 8;\n"
1811                "  unsigned ValueKind : 2;\n"
1812                "};");
1813   verifyFormat("struct A {\n"
1814                "  int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
1815                "      bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
1816                "};");
1817   verifyFormat("struct MyStruct {\n"
1818                "  uchar data;\n"
1819                "  uchar : 8;\n"
1820                "  uchar : 8;\n"
1821                "  uchar other;\n"
1822                "};");
1823 }
1824 
1825 TEST_F(FormatTest, FormatsNamespaces) {
1826   FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
1827   LLVMWithNoNamespaceFix.FixNamespaceComments = false;
1828 
1829   verifyFormat("namespace some_namespace {\n"
1830                "class A {};\n"
1831                "void f() { f(); }\n"
1832                "}",
1833                LLVMWithNoNamespaceFix);
1834   verifyFormat("namespace N::inline D {\n"
1835                "class A {};\n"
1836                "void f() { f(); }\n"
1837                "}",
1838                LLVMWithNoNamespaceFix);
1839   verifyFormat("namespace N::inline D::E {\n"
1840                "class A {};\n"
1841                "void f() { f(); }\n"
1842                "}",
1843                LLVMWithNoNamespaceFix);
1844   verifyFormat("namespace [[deprecated(\"foo[bar\")]] some_namespace {\n"
1845                "class A {};\n"
1846                "void f() { f(); }\n"
1847                "}",
1848                LLVMWithNoNamespaceFix);
1849   verifyFormat("/* something */ namespace some_namespace {\n"
1850                "class A {};\n"
1851                "void f() { f(); }\n"
1852                "}",
1853                LLVMWithNoNamespaceFix);
1854   verifyFormat("namespace {\n"
1855                "class A {};\n"
1856                "void f() { f(); }\n"
1857                "}",
1858                LLVMWithNoNamespaceFix);
1859   verifyFormat("/* something */ namespace {\n"
1860                "class A {};\n"
1861                "void f() { f(); }\n"
1862                "}",
1863                LLVMWithNoNamespaceFix);
1864   verifyFormat("inline namespace X {\n"
1865                "class A {};\n"
1866                "void f() { f(); }\n"
1867                "}",
1868                LLVMWithNoNamespaceFix);
1869   verifyFormat("/* something */ inline namespace X {\n"
1870                "class A {};\n"
1871                "void f() { f(); }\n"
1872                "}",
1873                LLVMWithNoNamespaceFix);
1874   verifyFormat("export namespace X {\n"
1875                "class A {};\n"
1876                "void f() { f(); }\n"
1877                "}",
1878                LLVMWithNoNamespaceFix);
1879   verifyFormat("using namespace some_namespace;\n"
1880                "class A {};\n"
1881                "void f() { f(); }",
1882                LLVMWithNoNamespaceFix);
1883 
1884   // This code is more common than we thought; if we
1885   // layout this correctly the semicolon will go into
1886   // its own line, which is undesirable.
1887   verifyFormat("namespace {};",
1888                LLVMWithNoNamespaceFix);
1889   verifyFormat("namespace {\n"
1890                "class A {};\n"
1891                "};",
1892                LLVMWithNoNamespaceFix);
1893 
1894   verifyFormat("namespace {\n"
1895                "int SomeVariable = 0; // comment\n"
1896                "} // namespace",
1897                LLVMWithNoNamespaceFix);
1898   EXPECT_EQ("#ifndef HEADER_GUARD\n"
1899             "#define HEADER_GUARD\n"
1900             "namespace my_namespace {\n"
1901             "int i;\n"
1902             "} // my_namespace\n"
1903             "#endif // HEADER_GUARD",
1904             format("#ifndef HEADER_GUARD\n"
1905                    " #define HEADER_GUARD\n"
1906                    "   namespace my_namespace {\n"
1907                    "int i;\n"
1908                    "}    // my_namespace\n"
1909                    "#endif    // HEADER_GUARD",
1910                    LLVMWithNoNamespaceFix));
1911 
1912   EXPECT_EQ("namespace A::B {\n"
1913             "class C {};\n"
1914             "}",
1915             format("namespace A::B {\n"
1916                    "class C {};\n"
1917                    "}",
1918                    LLVMWithNoNamespaceFix));
1919 
1920   FormatStyle Style = getLLVMStyle();
1921   Style.NamespaceIndentation = FormatStyle::NI_All;
1922   EXPECT_EQ("namespace out {\n"
1923             "  int i;\n"
1924             "  namespace in {\n"
1925             "    int i;\n"
1926             "  } // namespace in\n"
1927             "} // namespace out",
1928             format("namespace out {\n"
1929                    "int i;\n"
1930                    "namespace in {\n"
1931                    "int i;\n"
1932                    "} // namespace in\n"
1933                    "} // namespace out",
1934                    Style));
1935 
1936   Style.NamespaceIndentation = FormatStyle::NI_Inner;
1937   EXPECT_EQ("namespace out {\n"
1938             "int i;\n"
1939             "namespace in {\n"
1940             "  int i;\n"
1941             "} // namespace in\n"
1942             "} // namespace out",
1943             format("namespace out {\n"
1944                    "int i;\n"
1945                    "namespace in {\n"
1946                    "int i;\n"
1947                    "} // namespace in\n"
1948                    "} // namespace out",
1949                    Style));
1950 }
1951 
1952 TEST_F(FormatTest, NamespaceMacros) {
1953   FormatStyle Style = getLLVMStyle();
1954   Style.NamespaceMacros.push_back("TESTSUITE");
1955 
1956   verifyFormat("TESTSUITE(A) {\n"
1957                "int foo();\n"
1958                "} // TESTSUITE(A)",
1959                Style);
1960 
1961   verifyFormat("TESTSUITE(A, B) {\n"
1962                "int foo();\n"
1963                "} // TESTSUITE(A)",
1964                Style);
1965 
1966   // Properly indent according to NamespaceIndentation style
1967   Style.NamespaceIndentation = FormatStyle::NI_All;
1968   verifyFormat("TESTSUITE(A) {\n"
1969                "  int foo();\n"
1970                "} // TESTSUITE(A)",
1971                Style);
1972   verifyFormat("TESTSUITE(A) {\n"
1973                "  namespace B {\n"
1974                "    int foo();\n"
1975                "  } // namespace B\n"
1976                "} // TESTSUITE(A)",
1977                Style);
1978   verifyFormat("namespace A {\n"
1979                "  TESTSUITE(B) {\n"
1980                "    int foo();\n"
1981                "  } // TESTSUITE(B)\n"
1982                "} // namespace A",
1983                Style);
1984 
1985   Style.NamespaceIndentation = FormatStyle::NI_Inner;
1986   verifyFormat("TESTSUITE(A) {\n"
1987                "TESTSUITE(B) {\n"
1988                "  int foo();\n"
1989                "} // TESTSUITE(B)\n"
1990                "} // TESTSUITE(A)",
1991                Style);
1992   verifyFormat("TESTSUITE(A) {\n"
1993                "namespace B {\n"
1994                "  int foo();\n"
1995                "} // namespace B\n"
1996                "} // TESTSUITE(A)",
1997                Style);
1998   verifyFormat("namespace A {\n"
1999                "TESTSUITE(B) {\n"
2000                "  int foo();\n"
2001                "} // TESTSUITE(B)\n"
2002                "} // namespace A",
2003                Style);
2004 
2005   // Properly merge namespace-macros blocks in CompactNamespaces mode
2006   Style.NamespaceIndentation = FormatStyle::NI_None;
2007   Style.CompactNamespaces = true;
2008   verifyFormat("TESTSUITE(A) { TESTSUITE(B) {\n"
2009                "}} // TESTSUITE(A::B)",
2010                Style);
2011 
2012   EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n"
2013             "}} // TESTSUITE(out::in)",
2014             format("TESTSUITE(out) {\n"
2015                    "TESTSUITE(in) {\n"
2016                    "} // TESTSUITE(in)\n"
2017                    "} // TESTSUITE(out)",
2018                    Style));
2019 
2020   EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n"
2021             "}} // TESTSUITE(out::in)",
2022             format("TESTSUITE(out) {\n"
2023                    "TESTSUITE(in) {\n"
2024                    "} // TESTSUITE(in)\n"
2025                    "} // TESTSUITE(out)",
2026                    Style));
2027 
2028   // Do not merge different namespaces/macros
2029   EXPECT_EQ("namespace out {\n"
2030             "TESTSUITE(in) {\n"
2031             "} // TESTSUITE(in)\n"
2032             "} // namespace out",
2033             format("namespace out {\n"
2034                    "TESTSUITE(in) {\n"
2035                    "} // TESTSUITE(in)\n"
2036                    "} // namespace out",
2037                    Style));
2038   EXPECT_EQ("TESTSUITE(out) {\n"
2039             "namespace in {\n"
2040             "} // namespace in\n"
2041             "} // TESTSUITE(out)",
2042             format("TESTSUITE(out) {\n"
2043                    "namespace in {\n"
2044                    "} // namespace in\n"
2045                    "} // TESTSUITE(out)",
2046                    Style));
2047   Style.NamespaceMacros.push_back("FOOBAR");
2048   EXPECT_EQ("TESTSUITE(out) {\n"
2049             "FOOBAR(in) {\n"
2050             "} // FOOBAR(in)\n"
2051             "} // TESTSUITE(out)",
2052             format("TESTSUITE(out) {\n"
2053                    "FOOBAR(in) {\n"
2054                    "} // FOOBAR(in)\n"
2055                    "} // TESTSUITE(out)",
2056                    Style));
2057 }
2058 
2059 TEST_F(FormatTest, FormatsCompactNamespaces) {
2060   FormatStyle Style = getLLVMStyle();
2061   Style.CompactNamespaces = true;
2062   Style.NamespaceMacros.push_back("TESTSUITE");
2063 
2064   verifyFormat("namespace A { namespace B {\n"
2065 			   "}} // namespace A::B",
2066 			   Style);
2067 
2068   EXPECT_EQ("namespace out { namespace in {\n"
2069             "}} // namespace out::in",
2070             format("namespace out {\n"
2071                    "namespace in {\n"
2072                    "} // namespace in\n"
2073                    "} // namespace out",
2074                    Style));
2075 
2076   // Only namespaces which have both consecutive opening and end get compacted
2077   EXPECT_EQ("namespace out {\n"
2078             "namespace in1 {\n"
2079             "} // namespace in1\n"
2080             "namespace in2 {\n"
2081             "} // namespace in2\n"
2082             "} // namespace out",
2083             format("namespace out {\n"
2084                    "namespace in1 {\n"
2085                    "} // namespace in1\n"
2086                    "namespace in2 {\n"
2087                    "} // namespace in2\n"
2088                    "} // namespace out",
2089                    Style));
2090 
2091   EXPECT_EQ("namespace out {\n"
2092             "int i;\n"
2093             "namespace in {\n"
2094             "int j;\n"
2095             "} // namespace in\n"
2096             "int k;\n"
2097             "} // namespace out",
2098             format("namespace out { int i;\n"
2099                    "namespace in { int j; } // namespace in\n"
2100                    "int k; } // namespace out",
2101                    Style));
2102 
2103   EXPECT_EQ("namespace A { namespace B { namespace C {\n"
2104             "}}} // namespace A::B::C\n",
2105             format("namespace A { namespace B {\n"
2106                    "namespace C {\n"
2107                    "}} // namespace B::C\n"
2108                    "} // namespace A\n",
2109                    Style));
2110 
2111   Style.ColumnLimit = 40;
2112   EXPECT_EQ("namespace aaaaaaaaaa {\n"
2113             "namespace bbbbbbbbbb {\n"
2114             "}} // namespace aaaaaaaaaa::bbbbbbbbbb",
2115             format("namespace aaaaaaaaaa {\n"
2116                    "namespace bbbbbbbbbb {\n"
2117                    "} // namespace bbbbbbbbbb\n"
2118                    "} // namespace aaaaaaaaaa",
2119                    Style));
2120 
2121   EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n"
2122             "namespace cccccc {\n"
2123             "}}} // namespace aaaaaa::bbbbbb::cccccc",
2124             format("namespace aaaaaa {\n"
2125                    "namespace bbbbbb {\n"
2126                    "namespace cccccc {\n"
2127                    "} // namespace cccccc\n"
2128                    "} // namespace bbbbbb\n"
2129                    "} // namespace aaaaaa",
2130                    Style));
2131   Style.ColumnLimit = 80;
2132 
2133   // Extra semicolon after 'inner' closing brace prevents merging
2134   EXPECT_EQ("namespace out { namespace in {\n"
2135             "}; } // namespace out::in",
2136             format("namespace out {\n"
2137                    "namespace in {\n"
2138                    "}; // namespace in\n"
2139                    "} // namespace out",
2140                    Style));
2141 
2142   // Extra semicolon after 'outer' closing brace is conserved
2143   EXPECT_EQ("namespace out { namespace in {\n"
2144             "}}; // namespace out::in",
2145             format("namespace out {\n"
2146                    "namespace in {\n"
2147                    "} // namespace in\n"
2148                    "}; // namespace out",
2149                    Style));
2150 
2151   Style.NamespaceIndentation = FormatStyle::NI_All;
2152   EXPECT_EQ("namespace out { namespace in {\n"
2153             "  int i;\n"
2154             "}} // namespace out::in",
2155             format("namespace out {\n"
2156                    "namespace in {\n"
2157                    "int i;\n"
2158                    "} // namespace in\n"
2159                    "} // namespace out",
2160                    Style));
2161   EXPECT_EQ("namespace out { namespace mid {\n"
2162             "  namespace in {\n"
2163             "    int j;\n"
2164             "  } // namespace in\n"
2165             "  int k;\n"
2166             "}} // namespace out::mid",
2167             format("namespace out { namespace mid {\n"
2168                    "namespace in { int j; } // namespace in\n"
2169                    "int k; }} // namespace out::mid",
2170                    Style));
2171 
2172   Style.NamespaceIndentation = FormatStyle::NI_Inner;
2173   EXPECT_EQ("namespace out { namespace in {\n"
2174             "  int i;\n"
2175             "}} // namespace out::in",
2176             format("namespace out {\n"
2177                    "namespace in {\n"
2178                    "int i;\n"
2179                    "} // namespace in\n"
2180                    "} // namespace out",
2181                    Style));
2182   EXPECT_EQ("namespace out { namespace mid { namespace in {\n"
2183             "  int i;\n"
2184             "}}} // namespace out::mid::in",
2185             format("namespace out {\n"
2186                    "namespace mid {\n"
2187                    "namespace in {\n"
2188                    "int i;\n"
2189                    "} // namespace in\n"
2190                    "} // namespace mid\n"
2191                    "} // namespace out",
2192                    Style));
2193 }
2194 
2195 TEST_F(FormatTest, FormatsExternC) {
2196   verifyFormat("extern \"C\" {\nint a;");
2197   verifyFormat("extern \"C\" {}");
2198   verifyFormat("extern \"C\" {\n"
2199                "int foo();\n"
2200                "}");
2201   verifyFormat("extern \"C\" int foo() {}");
2202   verifyFormat("extern \"C\" int foo();");
2203   verifyFormat("extern \"C\" int foo() {\n"
2204                "  int i = 42;\n"
2205                "  return i;\n"
2206                "}");
2207 
2208   FormatStyle Style = getLLVMStyle();
2209   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2210   Style.BraceWrapping.AfterFunction = true;
2211   verifyFormat("extern \"C\" int foo() {}", Style);
2212   verifyFormat("extern \"C\" int foo();", Style);
2213   verifyFormat("extern \"C\" int foo()\n"
2214                "{\n"
2215                "  int i = 42;\n"
2216                "  return i;\n"
2217                "}",
2218                Style);
2219 
2220   Style.BraceWrapping.AfterExternBlock = true;
2221   Style.BraceWrapping.SplitEmptyRecord = false;
2222   verifyFormat("extern \"C\"\n"
2223                "{}",
2224                Style);
2225   verifyFormat("extern \"C\"\n"
2226                "{\n"
2227                "  int foo();\n"
2228                "}",
2229                Style);
2230 }
2231 
2232 TEST_F(FormatTest, FormatsInlineASM) {
2233   verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
2234   verifyFormat("asm(\"nop\" ::: \"memory\");");
2235   verifyFormat(
2236       "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
2237       "    \"cpuid\\n\\t\"\n"
2238       "    \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
2239       "    : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
2240       "    : \"a\"(value));");
2241   EXPECT_EQ(
2242       "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
2243       "  __asm {\n"
2244       "        mov     edx,[that] // vtable in edx\n"
2245       "        mov     eax,methodIndex\n"
2246       "        call    [edx][eax*4] // stdcall\n"
2247       "  }\n"
2248       "}",
2249       format("void NS_InvokeByIndex(void *that,   unsigned int methodIndex) {\n"
2250              "    __asm {\n"
2251              "        mov     edx,[that] // vtable in edx\n"
2252              "        mov     eax,methodIndex\n"
2253              "        call    [edx][eax*4] // stdcall\n"
2254              "    }\n"
2255              "}"));
2256   EXPECT_EQ("_asm {\n"
2257             "  xor eax, eax;\n"
2258             "  cpuid;\n"
2259             "}",
2260             format("_asm {\n"
2261                    "  xor eax, eax;\n"
2262                    "  cpuid;\n"
2263                    "}"));
2264   verifyFormat("void function() {\n"
2265                "  // comment\n"
2266                "  asm(\"\");\n"
2267                "}");
2268   EXPECT_EQ("__asm {\n"
2269             "}\n"
2270             "int i;",
2271             format("__asm   {\n"
2272                    "}\n"
2273                    "int   i;"));
2274 }
2275 
2276 TEST_F(FormatTest, FormatTryCatch) {
2277   verifyFormat("try {\n"
2278                "  throw a * b;\n"
2279                "} catch (int a) {\n"
2280                "  // Do nothing.\n"
2281                "} catch (...) {\n"
2282                "  exit(42);\n"
2283                "}");
2284 
2285   // Function-level try statements.
2286   verifyFormat("int f() try { return 4; } catch (...) {\n"
2287                "  return 5;\n"
2288                "}");
2289   verifyFormat("class A {\n"
2290                "  int a;\n"
2291                "  A() try : a(0) {\n"
2292                "  } catch (...) {\n"
2293                "    throw;\n"
2294                "  }\n"
2295                "};\n");
2296 
2297   // Incomplete try-catch blocks.
2298   verifyIncompleteFormat("try {} catch (");
2299 }
2300 
2301 TEST_F(FormatTest, FormatSEHTryCatch) {
2302   verifyFormat("__try {\n"
2303                "  int a = b * c;\n"
2304                "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
2305                "  // Do nothing.\n"
2306                "}");
2307 
2308   verifyFormat("__try {\n"
2309                "  int a = b * c;\n"
2310                "} __finally {\n"
2311                "  // Do nothing.\n"
2312                "}");
2313 
2314   verifyFormat("DEBUG({\n"
2315                "  __try {\n"
2316                "  } __finally {\n"
2317                "  }\n"
2318                "});\n");
2319 }
2320 
2321 TEST_F(FormatTest, IncompleteTryCatchBlocks) {
2322   verifyFormat("try {\n"
2323                "  f();\n"
2324                "} catch {\n"
2325                "  g();\n"
2326                "}");
2327   verifyFormat("try {\n"
2328                "  f();\n"
2329                "} catch (A a) MACRO(x) {\n"
2330                "  g();\n"
2331                "} catch (B b) MACRO(x) {\n"
2332                "  g();\n"
2333                "}");
2334 }
2335 
2336 TEST_F(FormatTest, FormatTryCatchBraceStyles) {
2337   FormatStyle Style = getLLVMStyle();
2338   for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
2339                           FormatStyle::BS_WebKit}) {
2340     Style.BreakBeforeBraces = BraceStyle;
2341     verifyFormat("try {\n"
2342                  "  // something\n"
2343                  "} catch (...) {\n"
2344                  "  // something\n"
2345                  "}",
2346                  Style);
2347   }
2348   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
2349   verifyFormat("try {\n"
2350                "  // something\n"
2351                "}\n"
2352                "catch (...) {\n"
2353                "  // something\n"
2354                "}",
2355                Style);
2356   verifyFormat("__try {\n"
2357                "  // something\n"
2358                "}\n"
2359                "__finally {\n"
2360                "  // something\n"
2361                "}",
2362                Style);
2363   verifyFormat("@try {\n"
2364                "  // something\n"
2365                "}\n"
2366                "@finally {\n"
2367                "  // something\n"
2368                "}",
2369                Style);
2370   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2371   verifyFormat("try\n"
2372                "{\n"
2373                "  // something\n"
2374                "}\n"
2375                "catch (...)\n"
2376                "{\n"
2377                "  // something\n"
2378                "}",
2379                Style);
2380   Style.BreakBeforeBraces = FormatStyle::BS_GNU;
2381   verifyFormat("try\n"
2382                "  {\n"
2383                "    // something\n"
2384                "  }\n"
2385                "catch (...)\n"
2386                "  {\n"
2387                "    // something\n"
2388                "  }",
2389                Style);
2390   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2391   Style.BraceWrapping.BeforeCatch = true;
2392   verifyFormat("try {\n"
2393                "  // something\n"
2394                "}\n"
2395                "catch (...) {\n"
2396                "  // something\n"
2397                "}",
2398                Style);
2399 }
2400 
2401 TEST_F(FormatTest, StaticInitializers) {
2402   verifyFormat("static SomeClass SC = {1, 'a'};");
2403 
2404   verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
2405                "    100000000, "
2406                "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
2407 
2408   // Here, everything other than the "}" would fit on a line.
2409   verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
2410                "    10000000000000000000000000};");
2411   EXPECT_EQ("S s = {a,\n"
2412             "\n"
2413             "       b};",
2414             format("S s = {\n"
2415                    "  a,\n"
2416                    "\n"
2417                    "  b\n"
2418                    "};"));
2419 
2420   // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
2421   // line. However, the formatting looks a bit off and this probably doesn't
2422   // happen often in practice.
2423   verifyFormat("static int Variable[1] = {\n"
2424                "    {1000000000000000000000000000000000000}};",
2425                getLLVMStyleWithColumns(40));
2426 }
2427 
2428 TEST_F(FormatTest, DesignatedInitializers) {
2429   verifyFormat("const struct A a = {.a = 1, .b = 2};");
2430   verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
2431                "                    .bbbbbbbbbb = 2,\n"
2432                "                    .cccccccccc = 3,\n"
2433                "                    .dddddddddd = 4,\n"
2434                "                    .eeeeeeeeee = 5};");
2435   verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
2436                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
2437                "    .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
2438                "    .ccccccccccccccccccccccccccc = 3,\n"
2439                "    .ddddddddddddddddddddddddddd = 4,\n"
2440                "    .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
2441 
2442   verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
2443 
2444   verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
2445   verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n"
2446                "                    [2] = bbbbbbbbbb,\n"
2447                "                    [3] = cccccccccc,\n"
2448                "                    [4] = dddddddddd,\n"
2449                "                    [5] = eeeeeeeeee};");
2450   verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
2451                "    [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2452                "    [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2453                "    [3] = cccccccccccccccccccccccccccccccccccccc,\n"
2454                "    [4] = dddddddddddddddddddddddddddddddddddddd,\n"
2455                "    [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};");
2456 }
2457 
2458 TEST_F(FormatTest, NestedStaticInitializers) {
2459   verifyFormat("static A x = {{{}}};\n");
2460   verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
2461                "               {init1, init2, init3, init4}}};",
2462                getLLVMStyleWithColumns(50));
2463 
2464   verifyFormat("somes Status::global_reps[3] = {\n"
2465                "    {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2466                "    {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2467                "    {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
2468                getLLVMStyleWithColumns(60));
2469   verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
2470                      "    {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2471                      "    {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2472                      "    {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
2473   verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
2474                "                  {rect.fRight - rect.fLeft, rect.fBottom - "
2475                "rect.fTop}};");
2476 
2477   verifyFormat(
2478       "SomeArrayOfSomeType a = {\n"
2479       "    {{1, 2, 3},\n"
2480       "     {1, 2, 3},\n"
2481       "     {111111111111111111111111111111, 222222222222222222222222222222,\n"
2482       "      333333333333333333333333333333},\n"
2483       "     {1, 2, 3},\n"
2484       "     {1, 2, 3}}};");
2485   verifyFormat(
2486       "SomeArrayOfSomeType a = {\n"
2487       "    {{1, 2, 3}},\n"
2488       "    {{1, 2, 3}},\n"
2489       "    {{111111111111111111111111111111, 222222222222222222222222222222,\n"
2490       "      333333333333333333333333333333}},\n"
2491       "    {{1, 2, 3}},\n"
2492       "    {{1, 2, 3}}};");
2493 
2494   verifyFormat("struct {\n"
2495                "  unsigned bit;\n"
2496                "  const char *const name;\n"
2497                "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
2498                "                 {kOsWin, \"Windows\"},\n"
2499                "                 {kOsLinux, \"Linux\"},\n"
2500                "                 {kOsCrOS, \"Chrome OS\"}};");
2501   verifyFormat("struct {\n"
2502                "  unsigned bit;\n"
2503                "  const char *const name;\n"
2504                "} kBitsToOs[] = {\n"
2505                "    {kOsMac, \"Mac\"},\n"
2506                "    {kOsWin, \"Windows\"},\n"
2507                "    {kOsLinux, \"Linux\"},\n"
2508                "    {kOsCrOS, \"Chrome OS\"},\n"
2509                "};");
2510 }
2511 
2512 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
2513   verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2514                "                      \\\n"
2515                "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
2516 }
2517 
2518 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
2519   verifyFormat("virtual void write(ELFWriter *writerrr,\n"
2520                "                   OwningPtr<FileOutputBuffer> &buffer) = 0;");
2521 
2522   // Do break defaulted and deleted functions.
2523   verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2524                "    default;",
2525                getLLVMStyleWithColumns(40));
2526   verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2527                "    delete;",
2528                getLLVMStyleWithColumns(40));
2529 }
2530 
2531 TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
2532   verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
2533                getLLVMStyleWithColumns(40));
2534   verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2535                getLLVMStyleWithColumns(40));
2536   EXPECT_EQ("#define Q                              \\\n"
2537             "  \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\"    \\\n"
2538             "  \"aaaaaaaa.cpp\"",
2539             format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2540                    getLLVMStyleWithColumns(40)));
2541 }
2542 
2543 TEST_F(FormatTest, UnderstandsLinePPDirective) {
2544   EXPECT_EQ("# 123 \"A string literal\"",
2545             format("   #     123    \"A string literal\""));
2546 }
2547 
2548 TEST_F(FormatTest, LayoutUnknownPPDirective) {
2549   EXPECT_EQ("#;", format("#;"));
2550   verifyFormat("#\n;\n;\n;");
2551 }
2552 
2553 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
2554   EXPECT_EQ("#line 42 \"test\"\n",
2555             format("#  \\\n  line  \\\n  42  \\\n  \"test\"\n"));
2556   EXPECT_EQ("#define A B\n", format("#  \\\n define  \\\n    A  \\\n       B\n",
2557                                     getLLVMStyleWithColumns(12)));
2558 }
2559 
2560 TEST_F(FormatTest, EndOfFileEndsPPDirective) {
2561   EXPECT_EQ("#line 42 \"test\"",
2562             format("#  \\\n  line  \\\n  42  \\\n  \"test\""));
2563   EXPECT_EQ("#define A B", format("#  \\\n define  \\\n    A  \\\n       B"));
2564 }
2565 
2566 TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
2567   verifyFormat("#define A \\x20");
2568   verifyFormat("#define A \\ x20");
2569   EXPECT_EQ("#define A \\ x20", format("#define A \\   x20"));
2570   verifyFormat("#define A ''");
2571   verifyFormat("#define A ''qqq");
2572   verifyFormat("#define A `qqq");
2573   verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
2574   EXPECT_EQ("const char *c = STRINGIFY(\n"
2575             "\\na : b);",
2576             format("const char * c = STRINGIFY(\n"
2577                    "\\na : b);"));
2578 
2579   verifyFormat("a\r\\");
2580   verifyFormat("a\v\\");
2581   verifyFormat("a\f\\");
2582 }
2583 
2584 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
2585   verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
2586   verifyFormat("#define A( \\\n    BB)", getLLVMStyleWithColumns(12));
2587   verifyFormat("#define A( \\\n    A, B)", getLLVMStyleWithColumns(12));
2588   // FIXME: We never break before the macro name.
2589   verifyFormat("#define AA( \\\n    B)", getLLVMStyleWithColumns(12));
2590 
2591   verifyFormat("#define A A\n#define A A");
2592   verifyFormat("#define A(X) A\n#define A A");
2593 
2594   verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
2595   verifyFormat("#define Something    \\\n  Other", getLLVMStyleWithColumns(22));
2596 }
2597 
2598 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
2599   EXPECT_EQ("// somecomment\n"
2600             "#include \"a.h\"\n"
2601             "#define A(  \\\n"
2602             "    A, B)\n"
2603             "#include \"b.h\"\n"
2604             "// somecomment\n",
2605             format("  // somecomment\n"
2606                    "  #include \"a.h\"\n"
2607                    "#define A(A,\\\n"
2608                    "    B)\n"
2609                    "    #include \"b.h\"\n"
2610                    " // somecomment\n",
2611                    getLLVMStyleWithColumns(13)));
2612 }
2613 
2614 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
2615 
2616 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
2617   EXPECT_EQ("#define A    \\\n"
2618             "  c;         \\\n"
2619             "  e;\n"
2620             "f;",
2621             format("#define A c; e;\n"
2622                    "f;",
2623                    getLLVMStyleWithColumns(14)));
2624 }
2625 
2626 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
2627 
2628 TEST_F(FormatTest, MacroDefinitionInsideStatement) {
2629   EXPECT_EQ("int x,\n"
2630             "#define A\n"
2631             "    y;",
2632             format("int x,\n#define A\ny;"));
2633 }
2634 
2635 TEST_F(FormatTest, HashInMacroDefinition) {
2636   EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
2637   verifyFormat("#define A \\\n  b #c;", getLLVMStyleWithColumns(11));
2638   verifyFormat("#define A  \\\n"
2639                "  {        \\\n"
2640                "    f(#c); \\\n"
2641                "  }",
2642                getLLVMStyleWithColumns(11));
2643 
2644   verifyFormat("#define A(X)         \\\n"
2645                "  void function##X()",
2646                getLLVMStyleWithColumns(22));
2647 
2648   verifyFormat("#define A(a, b, c)   \\\n"
2649                "  void a##b##c()",
2650                getLLVMStyleWithColumns(22));
2651 
2652   verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
2653 }
2654 
2655 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
2656   EXPECT_EQ("#define A (x)", format("#define A (x)"));
2657   EXPECT_EQ("#define A(x)", format("#define A(x)"));
2658 
2659   FormatStyle Style = getLLVMStyle();
2660   Style.SpaceBeforeParens = FormatStyle::SBPO_Never;
2661   verifyFormat("#define true ((foo)1)", Style);
2662   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
2663   verifyFormat("#define false((foo)0)", Style);
2664 }
2665 
2666 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
2667   EXPECT_EQ("#define A b;", format("#define A \\\n"
2668                                    "          \\\n"
2669                                    "  b;",
2670                                    getLLVMStyleWithColumns(25)));
2671   EXPECT_EQ("#define A \\\n"
2672             "          \\\n"
2673             "  a;      \\\n"
2674             "  b;",
2675             format("#define A \\\n"
2676                    "          \\\n"
2677                    "  a;      \\\n"
2678                    "  b;",
2679                    getLLVMStyleWithColumns(11)));
2680   EXPECT_EQ("#define A \\\n"
2681             "  a;      \\\n"
2682             "          \\\n"
2683             "  b;",
2684             format("#define A \\\n"
2685                    "  a;      \\\n"
2686                    "          \\\n"
2687                    "  b;",
2688                    getLLVMStyleWithColumns(11)));
2689 }
2690 
2691 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
2692   verifyIncompleteFormat("#define A :");
2693   verifyFormat("#define SOMECASES  \\\n"
2694                "  case 1:          \\\n"
2695                "  case 2\n",
2696                getLLVMStyleWithColumns(20));
2697   verifyFormat("#define MACRO(a) \\\n"
2698                "  if (a)         \\\n"
2699                "    f();         \\\n"
2700                "  else           \\\n"
2701                "    g()",
2702                getLLVMStyleWithColumns(18));
2703   verifyFormat("#define A template <typename T>");
2704   verifyIncompleteFormat("#define STR(x) #x\n"
2705                          "f(STR(this_is_a_string_literal{));");
2706   verifyFormat("#pragma omp threadprivate( \\\n"
2707                "    y)), // expected-warning",
2708                getLLVMStyleWithColumns(28));
2709   verifyFormat("#d, = };");
2710   verifyFormat("#if \"a");
2711   verifyIncompleteFormat("({\n"
2712                          "#define b     \\\n"
2713                          "  }           \\\n"
2714                          "  a\n"
2715                          "a",
2716                          getLLVMStyleWithColumns(15));
2717   verifyFormat("#define A     \\\n"
2718                "  {           \\\n"
2719                "    {\n"
2720                "#define B     \\\n"
2721                "  }           \\\n"
2722                "  }",
2723                getLLVMStyleWithColumns(15));
2724   verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
2725   verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
2726   verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
2727   verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() {      \n)}");
2728 }
2729 
2730 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
2731   verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
2732   EXPECT_EQ("class A : public QObject {\n"
2733             "  Q_OBJECT\n"
2734             "\n"
2735             "  A() {}\n"
2736             "};",
2737             format("class A  :  public QObject {\n"
2738                    "     Q_OBJECT\n"
2739                    "\n"
2740                    "  A() {\n}\n"
2741                    "}  ;"));
2742   EXPECT_EQ("MACRO\n"
2743             "/*static*/ int i;",
2744             format("MACRO\n"
2745                    " /*static*/ int   i;"));
2746   EXPECT_EQ("SOME_MACRO\n"
2747             "namespace {\n"
2748             "void f();\n"
2749             "} // namespace",
2750             format("SOME_MACRO\n"
2751                    "  namespace    {\n"
2752                    "void   f(  );\n"
2753                    "} // namespace"));
2754   // Only if the identifier contains at least 5 characters.
2755   EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
2756   EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
2757   // Only if everything is upper case.
2758   EXPECT_EQ("class A : public QObject {\n"
2759             "  Q_Object A() {}\n"
2760             "};",
2761             format("class A  :  public QObject {\n"
2762                    "     Q_Object\n"
2763                    "  A() {\n}\n"
2764                    "}  ;"));
2765 
2766   // Only if the next line can actually start an unwrapped line.
2767   EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
2768             format("SOME_WEIRD_LOG_MACRO\n"
2769                    "<< SomeThing;"));
2770 
2771   verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
2772                "(n, buffers))\n",
2773                getChromiumStyle(FormatStyle::LK_Cpp));
2774 
2775   // See PR41483
2776   EXPECT_EQ("/**/ FOO(a)\n"
2777             "FOO(b)",
2778             format("/**/ FOO(a)\n"
2779                    "FOO(b)"));
2780 }
2781 
2782 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2783   EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2784             "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2785             "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2786             "class X {};\n"
2787             "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2788             "int *createScopDetectionPass() { return 0; }",
2789             format("  INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2790                    "  INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2791                    "  INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2792                    "  class X {};\n"
2793                    "  INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2794                    "  int *createScopDetectionPass() { return 0; }"));
2795   // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2796   // braces, so that inner block is indented one level more.
2797   EXPECT_EQ("int q() {\n"
2798             "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2799             "  IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2800             "  IPC_END_MESSAGE_MAP()\n"
2801             "}",
2802             format("int q() {\n"
2803                    "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2804                    "    IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2805                    "  IPC_END_MESSAGE_MAP()\n"
2806                    "}"));
2807 
2808   // Same inside macros.
2809   EXPECT_EQ("#define LIST(L) \\\n"
2810             "  L(A)          \\\n"
2811             "  L(B)          \\\n"
2812             "  L(C)",
2813             format("#define LIST(L) \\\n"
2814                    "  L(A) \\\n"
2815                    "  L(B) \\\n"
2816                    "  L(C)",
2817                    getGoogleStyle()));
2818 
2819   // These must not be recognized as macros.
2820   EXPECT_EQ("int q() {\n"
2821             "  f(x);\n"
2822             "  f(x) {}\n"
2823             "  f(x)->g();\n"
2824             "  f(x)->*g();\n"
2825             "  f(x).g();\n"
2826             "  f(x) = x;\n"
2827             "  f(x) += x;\n"
2828             "  f(x) -= x;\n"
2829             "  f(x) *= x;\n"
2830             "  f(x) /= x;\n"
2831             "  f(x) %= x;\n"
2832             "  f(x) &= x;\n"
2833             "  f(x) |= x;\n"
2834             "  f(x) ^= x;\n"
2835             "  f(x) >>= x;\n"
2836             "  f(x) <<= x;\n"
2837             "  f(x)[y].z();\n"
2838             "  LOG(INFO) << x;\n"
2839             "  ifstream(x) >> x;\n"
2840             "}\n",
2841             format("int q() {\n"
2842                    "  f(x)\n;\n"
2843                    "  f(x)\n {}\n"
2844                    "  f(x)\n->g();\n"
2845                    "  f(x)\n->*g();\n"
2846                    "  f(x)\n.g();\n"
2847                    "  f(x)\n = x;\n"
2848                    "  f(x)\n += x;\n"
2849                    "  f(x)\n -= x;\n"
2850                    "  f(x)\n *= x;\n"
2851                    "  f(x)\n /= x;\n"
2852                    "  f(x)\n %= x;\n"
2853                    "  f(x)\n &= x;\n"
2854                    "  f(x)\n |= x;\n"
2855                    "  f(x)\n ^= x;\n"
2856                    "  f(x)\n >>= x;\n"
2857                    "  f(x)\n <<= x;\n"
2858                    "  f(x)\n[y].z();\n"
2859                    "  LOG(INFO)\n << x;\n"
2860                    "  ifstream(x)\n >> x;\n"
2861                    "}\n"));
2862   EXPECT_EQ("int q() {\n"
2863             "  F(x)\n"
2864             "  if (1) {\n"
2865             "  }\n"
2866             "  F(x)\n"
2867             "  while (1) {\n"
2868             "  }\n"
2869             "  F(x)\n"
2870             "  G(x);\n"
2871             "  F(x)\n"
2872             "  try {\n"
2873             "    Q();\n"
2874             "  } catch (...) {\n"
2875             "  }\n"
2876             "}\n",
2877             format("int q() {\n"
2878                    "F(x)\n"
2879                    "if (1) {}\n"
2880                    "F(x)\n"
2881                    "while (1) {}\n"
2882                    "F(x)\n"
2883                    "G(x);\n"
2884                    "F(x)\n"
2885                    "try { Q(); } catch (...) {}\n"
2886                    "}\n"));
2887   EXPECT_EQ("class A {\n"
2888             "  A() : t(0) {}\n"
2889             "  A(int i) noexcept() : {}\n"
2890             "  A(X x)\n" // FIXME: function-level try blocks are broken.
2891             "  try : t(0) {\n"
2892             "  } catch (...) {\n"
2893             "  }\n"
2894             "};",
2895             format("class A {\n"
2896                    "  A()\n : t(0) {}\n"
2897                    "  A(int i)\n noexcept() : {}\n"
2898                    "  A(X x)\n"
2899                    "  try : t(0) {} catch (...) {}\n"
2900                    "};"));
2901   FormatStyle Style = getLLVMStyle();
2902   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2903   Style.BraceWrapping.AfterControlStatement = true;
2904   Style.BraceWrapping.AfterFunction = true;
2905   EXPECT_EQ("void f()\n"
2906             "try\n"
2907             "{\n"
2908             "}",
2909             format("void f() try {\n"
2910                    "}", Style));
2911   EXPECT_EQ("class SomeClass {\n"
2912             "public:\n"
2913             "  SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2914             "};",
2915             format("class SomeClass {\n"
2916                    "public:\n"
2917                    "  SomeClass()\n"
2918                    "  EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2919                    "};"));
2920   EXPECT_EQ("class SomeClass {\n"
2921             "public:\n"
2922             "  SomeClass()\n"
2923             "      EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2924             "};",
2925             format("class SomeClass {\n"
2926                    "public:\n"
2927                    "  SomeClass()\n"
2928                    "  EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2929                    "};",
2930                    getLLVMStyleWithColumns(40)));
2931 
2932   verifyFormat("MACRO(>)");
2933 
2934   // Some macros contain an implicit semicolon.
2935   Style = getLLVMStyle();
2936   Style.StatementMacros.push_back("FOO");
2937   verifyFormat("FOO(a) int b = 0;");
2938   verifyFormat("FOO(a)\n"
2939                "int b = 0;",
2940                Style);
2941   verifyFormat("FOO(a);\n"
2942                "int b = 0;",
2943                Style);
2944   verifyFormat("FOO(argc, argv, \"4.0.2\")\n"
2945                "int b = 0;",
2946                Style);
2947   verifyFormat("FOO()\n"
2948                "int b = 0;",
2949                Style);
2950   verifyFormat("FOO\n"
2951                "int b = 0;",
2952                Style);
2953   verifyFormat("void f() {\n"
2954                "  FOO(a)\n"
2955                "  return a;\n"
2956                "}",
2957                Style);
2958   verifyFormat("FOO(a)\n"
2959                "FOO(b)",
2960                Style);
2961   verifyFormat("int a = 0;\n"
2962                "FOO(b)\n"
2963                "int c = 0;",
2964                Style);
2965   verifyFormat("int a = 0;\n"
2966                "int x = FOO(a)\n"
2967                "int b = 0;",
2968                Style);
2969   verifyFormat("void foo(int a) { FOO(a) }\n"
2970                "uint32_t bar() {}",
2971                Style);
2972 }
2973 
2974 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
2975   verifyFormat("#define A \\\n"
2976                "  f({     \\\n"
2977                "    g();  \\\n"
2978                "  });",
2979                getLLVMStyleWithColumns(11));
2980 }
2981 
2982 TEST_F(FormatTest, IndentPreprocessorDirectives) {
2983   FormatStyle Style = getLLVMStyle();
2984   Style.IndentPPDirectives = FormatStyle::PPDIS_None;
2985   Style.ColumnLimit = 40;
2986   verifyFormat("#ifdef _WIN32\n"
2987                "#define A 0\n"
2988                "#ifdef VAR2\n"
2989                "#define B 1\n"
2990                "#include <someheader.h>\n"
2991                "#define MACRO                          \\\n"
2992                "  some_very_long_func_aaaaaaaaaa();\n"
2993                "#endif\n"
2994                "#else\n"
2995                "#define A 1\n"
2996                "#endif",
2997                Style);
2998   Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash;
2999   verifyFormat("#ifdef _WIN32\n"
3000                "#  define A 0\n"
3001                "#  ifdef VAR2\n"
3002                "#    define B 1\n"
3003                "#    include <someheader.h>\n"
3004                "#    define MACRO                      \\\n"
3005                "      some_very_long_func_aaaaaaaaaa();\n"
3006                "#  endif\n"
3007                "#else\n"
3008                "#  define A 1\n"
3009                "#endif",
3010                Style);
3011   verifyFormat("#if A\n"
3012                "#  define MACRO                        \\\n"
3013                "    void a(int x) {                    \\\n"
3014                "      b();                             \\\n"
3015                "      c();                             \\\n"
3016                "      d();                             \\\n"
3017                "      e();                             \\\n"
3018                "      f();                             \\\n"
3019                "    }\n"
3020                "#endif",
3021                Style);
3022   // Comments before include guard.
3023   verifyFormat("// file comment\n"
3024                "// file comment\n"
3025                "#ifndef HEADER_H\n"
3026                "#define HEADER_H\n"
3027                "code();\n"
3028                "#endif",
3029                Style);
3030   // Test with include guards.
3031   verifyFormat("#ifndef HEADER_H\n"
3032                "#define HEADER_H\n"
3033                "code();\n"
3034                "#endif",
3035                Style);
3036   // Include guards must have a #define with the same variable immediately
3037   // after #ifndef.
3038   verifyFormat("#ifndef NOT_GUARD\n"
3039                "#  define FOO\n"
3040                "code();\n"
3041                "#endif",
3042                Style);
3043 
3044   // Include guards must cover the entire file.
3045   verifyFormat("code();\n"
3046                "code();\n"
3047                "#ifndef NOT_GUARD\n"
3048                "#  define NOT_GUARD\n"
3049                "code();\n"
3050                "#endif",
3051                Style);
3052   verifyFormat("#ifndef NOT_GUARD\n"
3053                "#  define NOT_GUARD\n"
3054                "code();\n"
3055                "#endif\n"
3056                "code();",
3057                Style);
3058   // Test with trailing blank lines.
3059   verifyFormat("#ifndef HEADER_H\n"
3060                "#define HEADER_H\n"
3061                "code();\n"
3062                "#endif\n",
3063                Style);
3064   // Include guards don't have #else.
3065   verifyFormat("#ifndef NOT_GUARD\n"
3066                "#  define NOT_GUARD\n"
3067                "code();\n"
3068                "#else\n"
3069                "#endif",
3070                Style);
3071   verifyFormat("#ifndef NOT_GUARD\n"
3072                "#  define NOT_GUARD\n"
3073                "code();\n"
3074                "#elif FOO\n"
3075                "#endif",
3076                Style);
3077   // Non-identifier #define after potential include guard.
3078   verifyFormat("#ifndef FOO\n"
3079                "#  define 1\n"
3080                "#endif\n",
3081                Style);
3082   // #if closes past last non-preprocessor line.
3083   verifyFormat("#ifndef FOO\n"
3084                "#define FOO\n"
3085                "#if 1\n"
3086                "int i;\n"
3087                "#  define A 0\n"
3088                "#endif\n"
3089                "#endif\n",
3090                Style);
3091   // Don't crash if there is an #elif directive without a condition.
3092   verifyFormat("#if 1\n"
3093                "int x;\n"
3094                "#elif\n"
3095                "int y;\n"
3096                "#else\n"
3097                "int z;\n"
3098                "#endif",
3099                Style);
3100   // FIXME: This doesn't handle the case where there's code between the
3101   // #ifndef and #define but all other conditions hold. This is because when
3102   // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the
3103   // previous code line yet, so we can't detect it.
3104   EXPECT_EQ("#ifndef NOT_GUARD\n"
3105             "code();\n"
3106             "#define NOT_GUARD\n"
3107             "code();\n"
3108             "#endif",
3109             format("#ifndef NOT_GUARD\n"
3110                    "code();\n"
3111                    "#  define NOT_GUARD\n"
3112                    "code();\n"
3113                    "#endif",
3114                    Style));
3115   // FIXME: This doesn't handle cases where legitimate preprocessor lines may
3116   // be outside an include guard. Examples are #pragma once and
3117   // #pragma GCC diagnostic, or anything else that does not change the meaning
3118   // of the file if it's included multiple times.
3119   EXPECT_EQ("#ifdef WIN32\n"
3120             "#  pragma once\n"
3121             "#endif\n"
3122             "#ifndef HEADER_H\n"
3123             "#  define HEADER_H\n"
3124             "code();\n"
3125             "#endif",
3126             format("#ifdef WIN32\n"
3127                    "#  pragma once\n"
3128                    "#endif\n"
3129                    "#ifndef HEADER_H\n"
3130                    "#define HEADER_H\n"
3131                    "code();\n"
3132                    "#endif",
3133                    Style));
3134   // FIXME: This does not detect when there is a single non-preprocessor line
3135   // in front of an include-guard-like structure where other conditions hold
3136   // because ScopedLineState hides the line.
3137   EXPECT_EQ("code();\n"
3138             "#ifndef HEADER_H\n"
3139             "#define HEADER_H\n"
3140             "code();\n"
3141             "#endif",
3142             format("code();\n"
3143                    "#ifndef HEADER_H\n"
3144                    "#  define HEADER_H\n"
3145                    "code();\n"
3146                    "#endif",
3147                    Style));
3148   // Keep comments aligned with #, otherwise indent comments normally. These
3149   // tests cannot use verifyFormat because messUp manipulates leading
3150   // whitespace.
3151   {
3152     const char *Expected = ""
3153                            "void f() {\n"
3154                            "#if 1\n"
3155                            "// Preprocessor aligned.\n"
3156                            "#  define A 0\n"
3157                            "  // Code. Separated by blank line.\n"
3158                            "\n"
3159                            "#  define B 0\n"
3160                            "  // Code. Not aligned with #\n"
3161                            "#  define C 0\n"
3162                            "#endif";
3163     const char *ToFormat = ""
3164                            "void f() {\n"
3165                            "#if 1\n"
3166                            "// Preprocessor aligned.\n"
3167                            "#  define A 0\n"
3168                            "// Code. Separated by blank line.\n"
3169                            "\n"
3170                            "#  define B 0\n"
3171                            "   // Code. Not aligned with #\n"
3172                            "#  define C 0\n"
3173                            "#endif";
3174     EXPECT_EQ(Expected, format(ToFormat, Style));
3175     EXPECT_EQ(Expected, format(Expected, Style));
3176   }
3177   // Keep block quotes aligned.
3178   {
3179     const char *Expected = ""
3180                            "void f() {\n"
3181                            "#if 1\n"
3182                            "/* Preprocessor aligned. */\n"
3183                            "#  define A 0\n"
3184                            "  /* Code. Separated by blank line. */\n"
3185                            "\n"
3186                            "#  define B 0\n"
3187                            "  /* Code. Not aligned with # */\n"
3188                            "#  define C 0\n"
3189                            "#endif";
3190     const char *ToFormat = ""
3191                            "void f() {\n"
3192                            "#if 1\n"
3193                            "/* Preprocessor aligned. */\n"
3194                            "#  define A 0\n"
3195                            "/* Code. Separated by blank line. */\n"
3196                            "\n"
3197                            "#  define B 0\n"
3198                            "   /* Code. Not aligned with # */\n"
3199                            "#  define C 0\n"
3200                            "#endif";
3201     EXPECT_EQ(Expected, format(ToFormat, Style));
3202     EXPECT_EQ(Expected, format(Expected, Style));
3203   }
3204   // Keep comments aligned with un-indented directives.
3205   {
3206     const char *Expected = ""
3207                            "void f() {\n"
3208                            "// Preprocessor aligned.\n"
3209                            "#define A 0\n"
3210                            "  // Code. Separated by blank line.\n"
3211                            "\n"
3212                            "#define B 0\n"
3213                            "  // Code. Not aligned with #\n"
3214                            "#define C 0\n";
3215     const char *ToFormat = ""
3216                            "void f() {\n"
3217                            "// Preprocessor aligned.\n"
3218                            "#define A 0\n"
3219                            "// Code. Separated by blank line.\n"
3220                            "\n"
3221                            "#define B 0\n"
3222                            "   // Code. Not aligned with #\n"
3223                            "#define C 0\n";
3224     EXPECT_EQ(Expected, format(ToFormat, Style));
3225     EXPECT_EQ(Expected, format(Expected, Style));
3226   }
3227   // Test AfterHash with tabs.
3228   {
3229     FormatStyle Tabbed = Style;
3230     Tabbed.UseTab = FormatStyle::UT_Always;
3231     Tabbed.IndentWidth = 8;
3232     Tabbed.TabWidth = 8;
3233     verifyFormat("#ifdef _WIN32\n"
3234                  "#\tdefine A 0\n"
3235                  "#\tifdef VAR2\n"
3236                  "#\t\tdefine B 1\n"
3237                  "#\t\tinclude <someheader.h>\n"
3238                  "#\t\tdefine MACRO          \\\n"
3239                  "\t\t\tsome_very_long_func_aaaaaaaaaa();\n"
3240                  "#\tendif\n"
3241                  "#else\n"
3242                  "#\tdefine A 1\n"
3243                  "#endif",
3244                  Tabbed);
3245   }
3246 
3247   // Regression test: Multiline-macro inside include guards.
3248   verifyFormat("#ifndef HEADER_H\n"
3249                "#define HEADER_H\n"
3250                "#define A()        \\\n"
3251                "  int i;           \\\n"
3252                "  int j;\n"
3253                "#endif // HEADER_H",
3254                getLLVMStyleWithColumns(20));
3255 
3256   Style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash;
3257   // Basic before hash indent tests
3258   verifyFormat("#ifdef _WIN32\n"
3259                "  #define A 0\n"
3260                "  #ifdef VAR2\n"
3261                "    #define B 1\n"
3262                "    #include <someheader.h>\n"
3263                "    #define MACRO                      \\\n"
3264                "      some_very_long_func_aaaaaaaaaa();\n"
3265                "  #endif\n"
3266                "#else\n"
3267                "  #define A 1\n"
3268                "#endif",
3269                Style);
3270   verifyFormat("#if A\n"
3271                "  #define MACRO                        \\\n"
3272                "    void a(int x) {                    \\\n"
3273                "      b();                             \\\n"
3274                "      c();                             \\\n"
3275                "      d();                             \\\n"
3276                "      e();                             \\\n"
3277                "      f();                             \\\n"
3278                "    }\n"
3279                "#endif",
3280                Style);
3281   // Keep comments aligned with indented directives. These
3282   // tests cannot use verifyFormat because messUp manipulates leading
3283   // whitespace.
3284   {
3285     const char *Expected = "void f() {\n"
3286                            "// Aligned to preprocessor.\n"
3287                            "#if 1\n"
3288                            "  // Aligned to code.\n"
3289                            "  int a;\n"
3290                            "  #if 1\n"
3291                            "    // Aligned to preprocessor.\n"
3292                            "    #define A 0\n"
3293                            "  // Aligned to code.\n"
3294                            "  int b;\n"
3295                            "  #endif\n"
3296                            "#endif\n"
3297                            "}";
3298     const char *ToFormat = "void f() {\n"
3299                            "// Aligned to preprocessor.\n"
3300                            "#if 1\n"
3301                            "// Aligned to code.\n"
3302                            "int a;\n"
3303                            "#if 1\n"
3304                            "// Aligned to preprocessor.\n"
3305                            "#define A 0\n"
3306                            "// Aligned to code.\n"
3307                            "int b;\n"
3308                            "#endif\n"
3309                            "#endif\n"
3310                            "}";
3311     EXPECT_EQ(Expected, format(ToFormat, Style));
3312     EXPECT_EQ(Expected, format(Expected, Style));
3313   }
3314   {
3315     const char *Expected = "void f() {\n"
3316                            "/* Aligned to preprocessor. */\n"
3317                            "#if 1\n"
3318                            "  /* Aligned to code. */\n"
3319                            "  int a;\n"
3320                            "  #if 1\n"
3321                            "    /* Aligned to preprocessor. */\n"
3322                            "    #define A 0\n"
3323                            "  /* Aligned to code. */\n"
3324                            "  int b;\n"
3325                            "  #endif\n"
3326                            "#endif\n"
3327                            "}";
3328     const char *ToFormat = "void f() {\n"
3329                            "/* Aligned to preprocessor. */\n"
3330                            "#if 1\n"
3331                            "/* Aligned to code. */\n"
3332                            "int a;\n"
3333                            "#if 1\n"
3334                            "/* Aligned to preprocessor. */\n"
3335                            "#define A 0\n"
3336                            "/* Aligned to code. */\n"
3337                            "int b;\n"
3338                            "#endif\n"
3339                            "#endif\n"
3340                            "}";
3341     EXPECT_EQ(Expected, format(ToFormat, Style));
3342     EXPECT_EQ(Expected, format(Expected, Style));
3343   }
3344 
3345   // Test single comment before preprocessor
3346   verifyFormat("// Comment\n"
3347                "\n"
3348                "#if 1\n"
3349                "#endif",
3350                Style);
3351 }
3352 
3353 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
3354   verifyFormat("{\n  { a #c; }\n}");
3355 }
3356 
3357 TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
3358   EXPECT_EQ("#define A \\\n  {       \\\n    {\nint i;",
3359             format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
3360   EXPECT_EQ("#define A \\\n  }       \\\n  }\nint i;",
3361             format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
3362 }
3363 
3364 TEST_F(FormatTest, EscapedNewlines) {
3365   FormatStyle Narrow = getLLVMStyleWithColumns(11);
3366   EXPECT_EQ("#define A \\\n  int i;  \\\n  int j;",
3367             format("#define A \\\nint i;\\\n  int j;", Narrow));
3368   EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
3369   EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
3370   EXPECT_EQ("/* \\  \\  \\\n */", format("\\\n/* \\  \\  \\\n */"));
3371   EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
3372 
3373   FormatStyle AlignLeft = getLLVMStyle();
3374   AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
3375   EXPECT_EQ("#define MACRO(x) \\\n"
3376             "private:         \\\n"
3377             "  int x(int a);\n",
3378             format("#define MACRO(x) \\\n"
3379                    "private:         \\\n"
3380                    "  int x(int a);\n",
3381                    AlignLeft));
3382 
3383   // CRLF line endings
3384   EXPECT_EQ("#define A \\\r\n  int i;  \\\r\n  int j;",
3385             format("#define A \\\r\nint i;\\\r\n  int j;", Narrow));
3386   EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;"));
3387   EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
3388   EXPECT_EQ("/* \\  \\  \\\r\n */", format("\\\r\n/* \\  \\  \\\r\n */"));
3389   EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>"));
3390   EXPECT_EQ("#define MACRO(x) \\\r\n"
3391             "private:         \\\r\n"
3392             "  int x(int a);\r\n",
3393             format("#define MACRO(x) \\\r\n"
3394                    "private:         \\\r\n"
3395                    "  int x(int a);\r\n",
3396                    AlignLeft));
3397 
3398   FormatStyle DontAlign = getLLVMStyle();
3399   DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
3400   DontAlign.MaxEmptyLinesToKeep = 3;
3401   // FIXME: can't use verifyFormat here because the newline before
3402   // "public:" is not inserted the first time it's reformatted
3403   EXPECT_EQ("#define A \\\n"
3404             "  class Foo { \\\n"
3405             "    void bar(); \\\n"
3406             "\\\n"
3407             "\\\n"
3408             "\\\n"
3409             "  public: \\\n"
3410             "    void baz(); \\\n"
3411             "  };",
3412             format("#define A \\\n"
3413                    "  class Foo { \\\n"
3414                    "    void bar(); \\\n"
3415                    "\\\n"
3416                    "\\\n"
3417                    "\\\n"
3418                    "  public: \\\n"
3419                    "    void baz(); \\\n"
3420                    "  };",
3421                    DontAlign));
3422 }
3423 
3424 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
3425   verifyFormat("#define A \\\n"
3426                "  int v(  \\\n"
3427                "      a); \\\n"
3428                "  int i;",
3429                getLLVMStyleWithColumns(11));
3430 }
3431 
3432 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
3433   EXPECT_EQ(
3434       "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3435       "                      \\\n"
3436       "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3437       "\n"
3438       "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3439       "    aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
3440       format("  #define   ALooooooooooooooooooooooooooooooooooooooongMacro("
3441              "\\\n"
3442              "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3443              "  \n"
3444              "   AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3445              "  aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
3446 }
3447 
3448 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
3449   EXPECT_EQ("int\n"
3450             "#define A\n"
3451             "    a;",
3452             format("int\n#define A\na;"));
3453   verifyFormat("functionCallTo(\n"
3454                "    someOtherFunction(\n"
3455                "        withSomeParameters, whichInSequence,\n"
3456                "        areLongerThanALine(andAnotherCall,\n"
3457                "#define A B\n"
3458                "                           withMoreParamters,\n"
3459                "                           whichStronglyInfluenceTheLayout),\n"
3460                "        andMoreParameters),\n"
3461                "    trailing);",
3462                getLLVMStyleWithColumns(69));
3463   verifyFormat("Foo::Foo()\n"
3464                "#ifdef BAR\n"
3465                "    : baz(0)\n"
3466                "#endif\n"
3467                "{\n"
3468                "}");
3469   verifyFormat("void f() {\n"
3470                "  if (true)\n"
3471                "#ifdef A\n"
3472                "    f(42);\n"
3473                "  x();\n"
3474                "#else\n"
3475                "    g();\n"
3476                "  x();\n"
3477                "#endif\n"
3478                "}");
3479   verifyFormat("void f(param1, param2,\n"
3480                "       param3,\n"
3481                "#ifdef A\n"
3482                "       param4(param5,\n"
3483                "#ifdef A1\n"
3484                "              param6,\n"
3485                "#ifdef A2\n"
3486                "              param7),\n"
3487                "#else\n"
3488                "              param8),\n"
3489                "       param9,\n"
3490                "#endif\n"
3491                "       param10,\n"
3492                "#endif\n"
3493                "       param11)\n"
3494                "#else\n"
3495                "       param12)\n"
3496                "#endif\n"
3497                "{\n"
3498                "  x();\n"
3499                "}",
3500                getLLVMStyleWithColumns(28));
3501   verifyFormat("#if 1\n"
3502                "int i;");
3503   verifyFormat("#if 1\n"
3504                "#endif\n"
3505                "#if 1\n"
3506                "#else\n"
3507                "#endif\n");
3508   verifyFormat("DEBUG({\n"
3509                "  return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3510                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
3511                "});\n"
3512                "#if a\n"
3513                "#else\n"
3514                "#endif");
3515 
3516   verifyIncompleteFormat("void f(\n"
3517                          "#if A\n"
3518                          ");\n"
3519                          "#else\n"
3520                          "#endif");
3521 }
3522 
3523 TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
3524   verifyFormat("#endif\n"
3525                "#if B");
3526 }
3527 
3528 TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
3529   FormatStyle SingleLine = getLLVMStyle();
3530   SingleLine.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse;
3531   verifyFormat("#if 0\n"
3532                "#elif 1\n"
3533                "#endif\n"
3534                "void foo() {\n"
3535                "  if (test) foo2();\n"
3536                "}",
3537                SingleLine);
3538 }
3539 
3540 TEST_F(FormatTest, LayoutBlockInsideParens) {
3541   verifyFormat("functionCall({ int i; });");
3542   verifyFormat("functionCall({\n"
3543                "  int i;\n"
3544                "  int j;\n"
3545                "});");
3546   verifyFormat("functionCall(\n"
3547                "    {\n"
3548                "      int i;\n"
3549                "      int j;\n"
3550                "    },\n"
3551                "    aaaa, bbbb, cccc);");
3552   verifyFormat("functionA(functionB({\n"
3553                "            int i;\n"
3554                "            int j;\n"
3555                "          }),\n"
3556                "          aaaa, bbbb, cccc);");
3557   verifyFormat("functionCall(\n"
3558                "    {\n"
3559                "      int i;\n"
3560                "      int j;\n"
3561                "    },\n"
3562                "    aaaa, bbbb, // comment\n"
3563                "    cccc);");
3564   verifyFormat("functionA(functionB({\n"
3565                "            int i;\n"
3566                "            int j;\n"
3567                "          }),\n"
3568                "          aaaa, bbbb, // comment\n"
3569                "          cccc);");
3570   verifyFormat("functionCall(aaaa, bbbb, { int i; });");
3571   verifyFormat("functionCall(aaaa, bbbb, {\n"
3572                "  int i;\n"
3573                "  int j;\n"
3574                "});");
3575   verifyFormat(
3576       "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
3577       "    {\n"
3578       "      int i; // break\n"
3579       "    },\n"
3580       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
3581       "                                     ccccccccccccccccc));");
3582   verifyFormat("DEBUG({\n"
3583                "  if (a)\n"
3584                "    f();\n"
3585                "});");
3586 }
3587 
3588 TEST_F(FormatTest, LayoutBlockInsideStatement) {
3589   EXPECT_EQ("SOME_MACRO { int i; }\n"
3590             "int i;",
3591             format("  SOME_MACRO  {int i;}  int i;"));
3592 }
3593 
3594 TEST_F(FormatTest, LayoutNestedBlocks) {
3595   verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
3596                "  struct s {\n"
3597                "    int i;\n"
3598                "  };\n"
3599                "  s kBitsToOs[] = {{10}};\n"
3600                "  for (int i = 0; i < 10; ++i)\n"
3601                "    return;\n"
3602                "}");
3603   verifyFormat("call(parameter, {\n"
3604                "  something();\n"
3605                "  // Comment using all columns.\n"
3606                "  somethingelse();\n"
3607                "});",
3608                getLLVMStyleWithColumns(40));
3609   verifyFormat("DEBUG( //\n"
3610                "    { f(); }, a);");
3611   verifyFormat("DEBUG( //\n"
3612                "    {\n"
3613                "      f(); //\n"
3614                "    },\n"
3615                "    a);");
3616 
3617   EXPECT_EQ("call(parameter, {\n"
3618             "  something();\n"
3619             "  // Comment too\n"
3620             "  // looooooooooong.\n"
3621             "  somethingElse();\n"
3622             "});",
3623             format("call(parameter, {\n"
3624                    "  something();\n"
3625                    "  // Comment too looooooooooong.\n"
3626                    "  somethingElse();\n"
3627                    "});",
3628                    getLLVMStyleWithColumns(29)));
3629   EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int   i; });"));
3630   EXPECT_EQ("DEBUG({ // comment\n"
3631             "  int i;\n"
3632             "});",
3633             format("DEBUG({ // comment\n"
3634                    "int  i;\n"
3635                    "});"));
3636   EXPECT_EQ("DEBUG({\n"
3637             "  int i;\n"
3638             "\n"
3639             "  // comment\n"
3640             "  int j;\n"
3641             "});",
3642             format("DEBUG({\n"
3643                    "  int  i;\n"
3644                    "\n"
3645                    "  // comment\n"
3646                    "  int  j;\n"
3647                    "});"));
3648 
3649   verifyFormat("DEBUG({\n"
3650                "  if (a)\n"
3651                "    return;\n"
3652                "});");
3653   verifyGoogleFormat("DEBUG({\n"
3654                      "  if (a) return;\n"
3655                      "});");
3656   FormatStyle Style = getGoogleStyle();
3657   Style.ColumnLimit = 45;
3658   verifyFormat("Debug(\n"
3659                "    aaaaa,\n"
3660                "    {\n"
3661                "      if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3662                "    },\n"
3663                "    a);",
3664                Style);
3665 
3666   verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3667 
3668   verifyNoCrash("^{v^{a}}");
3669 }
3670 
3671 TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3672   EXPECT_EQ("#define MACRO()                     \\\n"
3673             "  Debug(aaa, /* force line break */ \\\n"
3674             "        {                           \\\n"
3675             "          int i;                    \\\n"
3676             "          int j;                    \\\n"
3677             "        })",
3678             format("#define   MACRO()   Debug(aaa,  /* force line break */ \\\n"
3679                    "          {  int   i;  int  j;   })",
3680                    getGoogleStyle()));
3681 
3682   EXPECT_EQ("#define A                                       \\\n"
3683             "  [] {                                          \\\n"
3684             "    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(        \\\n"
3685             "        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3686             "  }",
3687             format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3688                    "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3689                    getGoogleStyle()));
3690 }
3691 
3692 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3693   EXPECT_EQ("{}", format("{}"));
3694   verifyFormat("enum E {};");
3695   verifyFormat("enum E {}");
3696   FormatStyle Style = getLLVMStyle();
3697   Style.SpaceInEmptyBlock = true;
3698   EXPECT_EQ("void f() { }", format("void f() {}", Style));
3699   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty;
3700   EXPECT_EQ("while (true) { }", format("while (true) {}", Style));
3701 }
3702 
3703 TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3704   FormatStyle Style = getLLVMStyle();
3705   Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3706   Style.MacroBlockEnd = "^[A-Z_]+_END$";
3707   verifyFormat("FOO_BEGIN\n"
3708                "  FOO_ENTRY\n"
3709                "FOO_END", Style);
3710   verifyFormat("FOO_BEGIN\n"
3711                "  NESTED_FOO_BEGIN\n"
3712                "    NESTED_FOO_ENTRY\n"
3713                "  NESTED_FOO_END\n"
3714                "FOO_END", Style);
3715   verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3716                "  int x;\n"
3717                "  x = 1;\n"
3718                "FOO_END(Baz)", Style);
3719 }
3720 
3721 //===----------------------------------------------------------------------===//
3722 // Line break tests.
3723 //===----------------------------------------------------------------------===//
3724 
3725 TEST_F(FormatTest, PreventConfusingIndents) {
3726   verifyFormat(
3727       "void f() {\n"
3728       "  SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3729       "                         parameter, parameter, parameter)),\n"
3730       "                     SecondLongCall(parameter));\n"
3731       "}");
3732   verifyFormat(
3733       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3734       "    aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3735       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3736       "    aaaaaaaaaaaaaaaaaaaaaaaa);");
3737   verifyFormat(
3738       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3739       "    [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3740       "         [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3741       "         [aaaaaaaaaaaaaaaaaaaaaaaa]];");
3742   verifyFormat(
3743       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3744       "    aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3745       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3746       "    aaaaaaaaaaaaaaaaaaaaaaaa>;");
3747   verifyFormat("int a = bbbb && ccc &&\n"
3748                "        fffff(\n"
3749                "#define A Just forcing a new line\n"
3750                "            ddd);");
3751 }
3752 
3753 TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3754   verifyFormat(
3755       "bool aaaaaaa =\n"
3756       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3757       "    bbbbbbbb();");
3758   verifyFormat(
3759       "bool aaaaaaa =\n"
3760       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3761       "    bbbbbbbb();");
3762 
3763   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3764                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3765                "    ccccccccc == ddddddddddd;");
3766   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3767                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3768                "    ccccccccc == ddddddddddd;");
3769   verifyFormat(
3770       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3771       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3772       "    ccccccccc == ddddddddddd;");
3773 
3774   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3775                "                 aaaaaa) &&\n"
3776                "         bbbbbb && cccccc;");
3777   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3778                "                 aaaaaa) >>\n"
3779                "         bbbbbb;");
3780   verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
3781                "    SourceMgr.getSpellingColumnNumber(\n"
3782                "        TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3783                "    1);");
3784 
3785   verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3786                "     bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3787                "    cccccc) {\n}");
3788   verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3789                "               bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
3790                "              cccccc) {\n}");
3791   verifyFormat("if CONSTEXPR ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3792                "               bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
3793                "              cccccc) {\n}");
3794   verifyFormat("b = a &&\n"
3795                "    // Comment\n"
3796                "    b.c && d;");
3797 
3798   // If the LHS of a comparison is not a binary expression itself, the
3799   // additional linebreak confuses many people.
3800   verifyFormat(
3801       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3802       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3803       "}");
3804   verifyFormat(
3805       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3806       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3807       "}");
3808   verifyFormat(
3809       "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3810       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3811       "}");
3812   verifyFormat(
3813       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3814       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n"
3815       "}");
3816   // Even explicit parentheses stress the precedence enough to make the
3817   // additional break unnecessary.
3818   verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3819                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3820                "}");
3821   // This cases is borderline, but with the indentation it is still readable.
3822   verifyFormat(
3823       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3824       "        aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3825       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3826       "}",
3827       getLLVMStyleWithColumns(75));
3828 
3829   // If the LHS is a binary expression, we should still use the additional break
3830   // as otherwise the formatting hides the operator precedence.
3831   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3832                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3833                "    5) {\n"
3834                "}");
3835   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3836                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n"
3837                "    5) {\n"
3838                "}");
3839 
3840   FormatStyle OnePerLine = getLLVMStyle();
3841   OnePerLine.BinPackParameters = false;
3842   verifyFormat(
3843       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3844       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3845       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3846       OnePerLine);
3847 
3848   verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
3849                "                .aaa(aaaaaaaaaaaaa) *\n"
3850                "            aaaaaaa +\n"
3851                "        aaaaaaa;",
3852                getLLVMStyleWithColumns(40));
3853 }
3854 
3855 TEST_F(FormatTest, ExpressionIndentation) {
3856   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3857                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3858                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3859                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3860                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3861                "                     bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3862                "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3863                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3864                "                 ccccccccccccccccccccccccccccccccccccccccc;");
3865   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3866                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3867                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3868                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3869   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3870                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3871                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3872                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3873   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3874                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3875                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3876                "        bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3877   verifyFormat("if () {\n"
3878                "} else if (aaaaa && bbbbb > // break\n"
3879                "                        ccccc) {\n"
3880                "}");
3881   verifyFormat("if () {\n"
3882                "} else if constexpr (aaaaa && bbbbb > // break\n"
3883                "                                  ccccc) {\n"
3884                "}");
3885   verifyFormat("if () {\n"
3886                "} else if CONSTEXPR (aaaaa && bbbbb > // break\n"
3887                "                                  ccccc) {\n"
3888                "}");
3889   verifyFormat("if () {\n"
3890                "} else if (aaaaa &&\n"
3891                "           bbbbb > // break\n"
3892                "               ccccc &&\n"
3893                "           ddddd) {\n"
3894                "}");
3895 
3896   // Presence of a trailing comment used to change indentation of b.
3897   verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
3898                "       b;\n"
3899                "return aaaaaaaaaaaaaaaaaaa +\n"
3900                "       b; //",
3901                getLLVMStyleWithColumns(30));
3902 }
3903 
3904 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
3905   // Not sure what the best system is here. Like this, the LHS can be found
3906   // immediately above an operator (everything with the same or a higher
3907   // indent). The RHS is aligned right of the operator and so compasses
3908   // everything until something with the same indent as the operator is found.
3909   // FIXME: Is this a good system?
3910   FormatStyle Style = getLLVMStyle();
3911   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
3912   verifyFormat(
3913       "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3914       "                     + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3915       "                     + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3916       "                 == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3917       "                            * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3918       "                        + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3919       "             && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3920       "                        * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3921       "                    > ccccccccccccccccccccccccccccccccccccccccc;",
3922       Style);
3923   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3924                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3925                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3926                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3927                Style);
3928   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3929                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3930                "              * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3931                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3932                Style);
3933   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3934                "    == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3935                "               * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3936                "           + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3937                Style);
3938   verifyFormat("if () {\n"
3939                "} else if (aaaaa\n"
3940                "           && bbbbb // break\n"
3941                "                  > ccccc) {\n"
3942                "}",
3943                Style);
3944   verifyFormat("return (a)\n"
3945                "       // comment\n"
3946                "       + b;",
3947                Style);
3948   verifyFormat(
3949       "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3950       "                 * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3951       "             + cc;",
3952       Style);
3953 
3954   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3955                "    = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3956                Style);
3957 
3958   // Forced by comments.
3959   verifyFormat(
3960       "unsigned ContentSize =\n"
3961       "    sizeof(int16_t)   // DWARF ARange version number\n"
3962       "    + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
3963       "    + sizeof(int8_t)  // Pointer Size (in bytes)\n"
3964       "    + sizeof(int8_t); // Segment Size (in bytes)");
3965 
3966   verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
3967                "       == boost::fusion::at_c<1>(iiii).second;",
3968                Style);
3969 
3970   Style.ColumnLimit = 60;
3971   verifyFormat("zzzzzzzzzz\n"
3972                "    = bbbbbbbbbbbbbbbbb\n"
3973                "      >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
3974                Style);
3975 
3976   Style.ColumnLimit = 80;
3977   Style.IndentWidth = 4;
3978   Style.TabWidth = 4;
3979   Style.UseTab = FormatStyle::UT_Always;
3980   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
3981   Style.AlignOperands = false;
3982   EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n"
3983             "\t&& (someOtherLongishConditionPart1\n"
3984             "\t\t|| someOtherEvenLongerNestedConditionPart2);",
3985             format("return someVeryVeryLongConditionThatBarelyFitsOnALine && (someOtherLongishConditionPart1 || someOtherEvenLongerNestedConditionPart2);",
3986                    Style));
3987 }
3988 
3989 TEST_F(FormatTest, EnforcedOperatorWraps) {
3990   // Here we'd like to wrap after the || operators, but a comment is forcing an
3991   // earlier wrap.
3992   verifyFormat("bool x = aaaaa //\n"
3993                "         || bbbbb\n"
3994                "         //\n"
3995                "         || cccc;");
3996 }
3997 
3998 TEST_F(FormatTest, NoOperandAlignment) {
3999   FormatStyle Style = getLLVMStyle();
4000   Style.AlignOperands = false;
4001   verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
4002                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4003                "                   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4004                Style);
4005   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4006   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4007                "            + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4008                "            + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4009                "        == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4010                "                * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4011                "            + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4012                "    && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4013                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4014                "        > ccccccccccccccccccccccccccccccccccccccccc;",
4015                Style);
4016 
4017   verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4018                "        * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4019                "    + cc;",
4020                Style);
4021   verifyFormat("int a = aa\n"
4022                "    + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4023                "        * cccccccccccccccccccccccccccccccccccc;\n",
4024                Style);
4025 
4026   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4027   verifyFormat("return (a > b\n"
4028                "    // comment1\n"
4029                "    // comment2\n"
4030                "    || c);",
4031                Style);
4032 }
4033 
4034 TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
4035   FormatStyle Style = getLLVMStyle();
4036   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4037   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4038                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4039                "    + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
4040                Style);
4041 }
4042 
4043 TEST_F(FormatTest, AllowBinPackingInsideArguments) {
4044   FormatStyle Style = getLLVMStyle();
4045   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4046   Style.BinPackArguments = false;
4047   Style.ColumnLimit = 40;
4048   verifyFormat("void test() {\n"
4049                "  someFunction(\n"
4050                "      this + argument + is + quite\n"
4051                "      + long + so + it + gets + wrapped\n"
4052                "      + but + remains + bin - packed);\n"
4053                "}",
4054                Style);
4055   verifyFormat("void test() {\n"
4056                "  someFunction(arg1,\n"
4057                "               this + argument + is\n"
4058                "                   + quite + long + so\n"
4059                "                   + it + gets + wrapped\n"
4060                "                   + but + remains + bin\n"
4061                "                   - packed,\n"
4062                "               arg3);\n"
4063                "}",
4064                Style);
4065   verifyFormat("void test() {\n"
4066                "  someFunction(\n"
4067                "      arg1,\n"
4068                "      this + argument + has\n"
4069                "          + anotherFunc(nested,\n"
4070                "                        calls + whose\n"
4071                "                            + arguments\n"
4072                "                            + are + also\n"
4073                "                            + wrapped,\n"
4074                "                        in + addition)\n"
4075                "          + to + being + bin - packed,\n"
4076                "      arg3);\n"
4077                "}",
4078                Style);
4079 
4080   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4081   verifyFormat("void test() {\n"
4082                "  someFunction(\n"
4083                "      arg1,\n"
4084                "      this + argument + has +\n"
4085                "          anotherFunc(nested,\n"
4086                "                      calls + whose +\n"
4087                "                          arguments +\n"
4088                "                          are + also +\n"
4089                "                          wrapped,\n"
4090                "                      in + addition) +\n"
4091                "          to + being + bin - packed,\n"
4092                "      arg3);\n"
4093                "}",
4094                Style);
4095 }
4096 
4097 TEST_F(FormatTest, ConstructorInitializers) {
4098   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
4099   verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
4100                getLLVMStyleWithColumns(45));
4101   verifyFormat("Constructor()\n"
4102                "    : Inttializer(FitsOnTheLine) {}",
4103                getLLVMStyleWithColumns(44));
4104   verifyFormat("Constructor()\n"
4105                "    : Inttializer(FitsOnTheLine) {}",
4106                getLLVMStyleWithColumns(43));
4107 
4108   verifyFormat("template <typename T>\n"
4109                "Constructor() : Initializer(FitsOnTheLine) {}",
4110                getLLVMStyleWithColumns(45));
4111 
4112   verifyFormat(
4113       "SomeClass::Constructor()\n"
4114       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
4115 
4116   verifyFormat(
4117       "SomeClass::Constructor()\n"
4118       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4119       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
4120   verifyFormat(
4121       "SomeClass::Constructor()\n"
4122       "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4123       "      aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
4124   verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4125                "            aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4126                "    : aaaaaaaaaa(aaaaaa) {}");
4127 
4128   verifyFormat("Constructor()\n"
4129                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4130                "      aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4131                "                               aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4132                "      aaaaaaaaaaaaaaaaaaaaaaa() {}");
4133 
4134   verifyFormat("Constructor()\n"
4135                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4136                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
4137 
4138   verifyFormat("Constructor(int Parameter = 0)\n"
4139                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
4140                "      aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
4141   verifyFormat("Constructor()\n"
4142                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
4143                "}",
4144                getLLVMStyleWithColumns(60));
4145   verifyFormat("Constructor()\n"
4146                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4147                "          aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
4148 
4149   // Here a line could be saved by splitting the second initializer onto two
4150   // lines, but that is not desirable.
4151   verifyFormat("Constructor()\n"
4152                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
4153                "      aaaaaaaaaaa(aaaaaaaaaaa),\n"
4154                "      aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
4155 
4156   FormatStyle OnePerLine = getLLVMStyle();
4157   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4158   OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
4159   verifyFormat("SomeClass::Constructor()\n"
4160                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4161                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4162                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4163                OnePerLine);
4164   verifyFormat("SomeClass::Constructor()\n"
4165                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
4166                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4167                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4168                OnePerLine);
4169   verifyFormat("MyClass::MyClass(int var)\n"
4170                "    : some_var_(var),            // 4 space indent\n"
4171                "      some_other_var_(var + 1) { // lined up\n"
4172                "}",
4173                OnePerLine);
4174   verifyFormat("Constructor()\n"
4175                "    : aaaaa(aaaaaa),\n"
4176                "      aaaaa(aaaaaa),\n"
4177                "      aaaaa(aaaaaa),\n"
4178                "      aaaaa(aaaaaa),\n"
4179                "      aaaaa(aaaaaa) {}",
4180                OnePerLine);
4181   verifyFormat("Constructor()\n"
4182                "    : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4183                "            aaaaaaaaaaaaaaaaaaaaaa) {}",
4184                OnePerLine);
4185   OnePerLine.BinPackParameters = false;
4186   verifyFormat(
4187       "Constructor()\n"
4188       "    : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4189       "          aaaaaaaaaaa().aaa(),\n"
4190       "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4191       OnePerLine);
4192   OnePerLine.ColumnLimit = 60;
4193   verifyFormat("Constructor()\n"
4194                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4195                "      bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
4196                OnePerLine);
4197 
4198   EXPECT_EQ("Constructor()\n"
4199             "    : // Comment forcing unwanted break.\n"
4200             "      aaaa(aaaa) {}",
4201             format("Constructor() :\n"
4202                    "    // Comment forcing unwanted break.\n"
4203                    "    aaaa(aaaa) {}"));
4204 }
4205 
4206 TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) {
4207   FormatStyle Style = getLLVMStyle();
4208   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4209   Style.ColumnLimit = 60;
4210   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4211   Style.AllowAllConstructorInitializersOnNextLine = true;
4212   Style.BinPackParameters = false;
4213 
4214   for (int i = 0; i < 4; ++i) {
4215     // Test all combinations of parameters that should not have an effect.
4216     Style.AllowAllParametersOfDeclarationOnNextLine = i & 1;
4217     Style.AllowAllArgumentsOnNextLine = i & 2;
4218 
4219     Style.AllowAllConstructorInitializersOnNextLine = true;
4220     Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4221     verifyFormat("Constructor()\n"
4222                  "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4223                  Style);
4224     verifyFormat("Constructor() : a(a), b(b) {}", Style);
4225 
4226     Style.AllowAllConstructorInitializersOnNextLine = false;
4227     verifyFormat("Constructor()\n"
4228                  "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4229                  "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4230                  Style);
4231     verifyFormat("Constructor() : a(a), b(b) {}", Style);
4232 
4233     Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
4234     Style.AllowAllConstructorInitializersOnNextLine = true;
4235     verifyFormat("Constructor()\n"
4236                  "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4237                  Style);
4238 
4239     Style.AllowAllConstructorInitializersOnNextLine = false;
4240     verifyFormat("Constructor()\n"
4241                  "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4242                  "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4243                  Style);
4244 
4245     Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4246     Style.AllowAllConstructorInitializersOnNextLine = true;
4247     verifyFormat("Constructor() :\n"
4248                  "    aaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4249                  Style);
4250 
4251     Style.AllowAllConstructorInitializersOnNextLine = false;
4252     verifyFormat("Constructor() :\n"
4253                  "    aaaaaaaaaaaaaaaaaa(a),\n"
4254                  "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4255                  Style);
4256   }
4257 
4258   // Test interactions between AllowAllParametersOfDeclarationOnNextLine and
4259   // AllowAllConstructorInitializersOnNextLine in all
4260   // BreakConstructorInitializers modes
4261   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4262   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4263   Style.AllowAllConstructorInitializersOnNextLine = false;
4264   verifyFormat("SomeClassWithALongName::Constructor(\n"
4265                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n"
4266                "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4267                "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4268                Style);
4269 
4270   Style.AllowAllConstructorInitializersOnNextLine = true;
4271   verifyFormat("SomeClassWithALongName::Constructor(\n"
4272                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4273                "    int bbbbbbbbbbbbb,\n"
4274                "    int cccccccccccccccc)\n"
4275                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4276                Style);
4277 
4278   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4279   Style.AllowAllConstructorInitializersOnNextLine = false;
4280   verifyFormat("SomeClassWithALongName::Constructor(\n"
4281                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4282                "    int bbbbbbbbbbbbb)\n"
4283                "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4284                "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4285                Style);
4286 
4287   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
4288 
4289   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4290   verifyFormat("SomeClassWithALongName::Constructor(\n"
4291                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n"
4292                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4293                "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4294                Style);
4295 
4296   Style.AllowAllConstructorInitializersOnNextLine = true;
4297   verifyFormat("SomeClassWithALongName::Constructor(\n"
4298                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4299                "    int bbbbbbbbbbbbb,\n"
4300                "    int cccccccccccccccc)\n"
4301                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4302                Style);
4303 
4304   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4305   Style.AllowAllConstructorInitializersOnNextLine = false;
4306   verifyFormat("SomeClassWithALongName::Constructor(\n"
4307                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4308                "    int bbbbbbbbbbbbb)\n"
4309                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4310                "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4311                Style);
4312 
4313   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4314   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4315   verifyFormat("SomeClassWithALongName::Constructor(\n"
4316                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb) :\n"
4317                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4318                "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4319                Style);
4320 
4321   Style.AllowAllConstructorInitializersOnNextLine = true;
4322   verifyFormat("SomeClassWithALongName::Constructor(\n"
4323                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4324                "    int bbbbbbbbbbbbb,\n"
4325                "    int cccccccccccccccc) :\n"
4326                "    aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4327                Style);
4328 
4329   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4330   Style.AllowAllConstructorInitializersOnNextLine = false;
4331   verifyFormat("SomeClassWithALongName::Constructor(\n"
4332                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4333                "    int bbbbbbbbbbbbb) :\n"
4334                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4335                "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4336                Style);
4337 }
4338 
4339 TEST_F(FormatTest, AllowAllArgumentsOnNextLine) {
4340   FormatStyle Style = getLLVMStyle();
4341   Style.ColumnLimit = 60;
4342   Style.BinPackArguments = false;
4343   for (int i = 0; i < 4; ++i) {
4344     // Test all combinations of parameters that should not have an effect.
4345     Style.AllowAllParametersOfDeclarationOnNextLine = i & 1;
4346     Style.AllowAllConstructorInitializersOnNextLine = i & 2;
4347 
4348     Style.AllowAllArgumentsOnNextLine = true;
4349     verifyFormat("void foo() {\n"
4350                  "  FunctionCallWithReallyLongName(\n"
4351                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb);\n"
4352                  "}",
4353                  Style);
4354     Style.AllowAllArgumentsOnNextLine = false;
4355     verifyFormat("void foo() {\n"
4356                  "  FunctionCallWithReallyLongName(\n"
4357                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4358                  "      bbbbbbbbbbbb);\n"
4359                  "}",
4360                  Style);
4361 
4362     Style.AllowAllArgumentsOnNextLine = true;
4363     verifyFormat("void foo() {\n"
4364                  "  auto VariableWithReallyLongName = {\n"
4365                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb};\n"
4366                  "}",
4367                  Style);
4368     Style.AllowAllArgumentsOnNextLine = false;
4369     verifyFormat("void foo() {\n"
4370                  "  auto VariableWithReallyLongName = {\n"
4371                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4372                  "      bbbbbbbbbbbb};\n"
4373                  "}",
4374                  Style);
4375   }
4376 
4377   // This parameter should not affect declarations.
4378   Style.BinPackParameters = false;
4379   Style.AllowAllArgumentsOnNextLine = false;
4380   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4381   verifyFormat("void FunctionCallWithReallyLongName(\n"
4382                "    int aaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbb);",
4383                Style);
4384   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4385   verifyFormat("void FunctionCallWithReallyLongName(\n"
4386                "    int aaaaaaaaaaaaaaaaaaaaaaa,\n"
4387                "    int bbbbbbbbbbbb);",
4388                Style);
4389 }
4390 
4391 TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
4392   FormatStyle Style = getLLVMStyle();
4393   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4394 
4395   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
4396   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
4397                getStyleWithColumns(Style, 45));
4398   verifyFormat("Constructor() :\n"
4399                "    Initializer(FitsOnTheLine) {}",
4400                getStyleWithColumns(Style, 44));
4401   verifyFormat("Constructor() :\n"
4402                "    Initializer(FitsOnTheLine) {}",
4403                getStyleWithColumns(Style, 43));
4404 
4405   verifyFormat("template <typename T>\n"
4406                "Constructor() : Initializer(FitsOnTheLine) {}",
4407                getStyleWithColumns(Style, 50));
4408   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4409   verifyFormat(
4410       "SomeClass::Constructor() :\n"
4411       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
4412       Style);
4413 
4414   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = false;
4415   verifyFormat(
4416       "SomeClass::Constructor() :\n"
4417       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
4418       Style);
4419 
4420   verifyFormat(
4421       "SomeClass::Constructor() :\n"
4422       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4423       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4424       Style);
4425   verifyFormat(
4426       "SomeClass::Constructor() :\n"
4427       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4428       "    aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
4429 	  Style);
4430   verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4431                "            aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4432                "    aaaaaaaaaa(aaaaaa) {}",
4433 			   Style);
4434 
4435   verifyFormat("Constructor() :\n"
4436                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4437                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4438                "                             aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4439                "    aaaaaaaaaaaaaaaaaaaaaaa() {}",
4440 			   Style);
4441 
4442   verifyFormat("Constructor() :\n"
4443                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4444                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4445 			   Style);
4446 
4447   verifyFormat("Constructor(int Parameter = 0) :\n"
4448                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
4449                "    aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
4450 			   Style);
4451   verifyFormat("Constructor() :\n"
4452                "    aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
4453                "}",
4454                getStyleWithColumns(Style, 60));
4455   verifyFormat("Constructor() :\n"
4456                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4457                "        aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
4458 			   Style);
4459 
4460   // Here a line could be saved by splitting the second initializer onto two
4461   // lines, but that is not desirable.
4462   verifyFormat("Constructor() :\n"
4463                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
4464                "    aaaaaaaaaaa(aaaaaaaaaaa),\n"
4465                "    aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4466 			   Style);
4467 
4468   FormatStyle OnePerLine = Style;
4469   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4470   OnePerLine.AllowAllConstructorInitializersOnNextLine = false;
4471   verifyFormat("SomeClass::Constructor() :\n"
4472                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4473                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4474                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4475                OnePerLine);
4476   verifyFormat("SomeClass::Constructor() :\n"
4477                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
4478                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4479                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4480                OnePerLine);
4481   verifyFormat("MyClass::MyClass(int var) :\n"
4482                "    some_var_(var),            // 4 space indent\n"
4483                "    some_other_var_(var + 1) { // lined up\n"
4484                "}",
4485                OnePerLine);
4486   verifyFormat("Constructor() :\n"
4487                "    aaaaa(aaaaaa),\n"
4488                "    aaaaa(aaaaaa),\n"
4489                "    aaaaa(aaaaaa),\n"
4490                "    aaaaa(aaaaaa),\n"
4491                "    aaaaa(aaaaaa) {}",
4492                OnePerLine);
4493   verifyFormat("Constructor() :\n"
4494                "    aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4495                "          aaaaaaaaaaaaaaaaaaaaaa) {}",
4496                OnePerLine);
4497   OnePerLine.BinPackParameters = false;
4498   verifyFormat(
4499       "Constructor() :\n"
4500       "    aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4501       "        aaaaaaaaaaa().aaa(),\n"
4502       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4503       OnePerLine);
4504   OnePerLine.ColumnLimit = 60;
4505   verifyFormat("Constructor() :\n"
4506                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4507                "    bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
4508                OnePerLine);
4509 
4510   EXPECT_EQ("Constructor() :\n"
4511             "    // Comment forcing unwanted break.\n"
4512             "    aaaa(aaaa) {}",
4513             format("Constructor() :\n"
4514                    "    // Comment forcing unwanted break.\n"
4515                    "    aaaa(aaaa) {}",
4516 				   Style));
4517 
4518   Style.ColumnLimit = 0;
4519   verifyFormat("SomeClass::Constructor() :\n"
4520                "    a(a) {}",
4521                Style);
4522   verifyFormat("SomeClass::Constructor() noexcept :\n"
4523                "    a(a) {}",
4524                Style);
4525   verifyFormat("SomeClass::Constructor() :\n"
4526 			   "    a(a), b(b), c(c) {}",
4527                Style);
4528   verifyFormat("SomeClass::Constructor() :\n"
4529                "    a(a) {\n"
4530                "  foo();\n"
4531                "  bar();\n"
4532                "}",
4533                Style);
4534 
4535   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
4536   verifyFormat("SomeClass::Constructor() :\n"
4537 			   "    a(a), b(b), c(c) {\n"
4538 			   "}",
4539                Style);
4540   verifyFormat("SomeClass::Constructor() :\n"
4541                "    a(a) {\n"
4542 			   "}",
4543                Style);
4544 
4545   Style.ColumnLimit = 80;
4546   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
4547   Style.ConstructorInitializerIndentWidth = 2;
4548   verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}",
4549                Style);
4550   verifyFormat("SomeClass::Constructor() :\n"
4551                "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4552                "  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
4553                Style);
4554 
4555   // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as well
4556   Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
4557   verifyFormat("class SomeClass\n"
4558                "  : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4559                "    public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
4560                Style);
4561   Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
4562   verifyFormat("class SomeClass\n"
4563                "  : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4564                "  , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
4565                Style);
4566   Style.BreakInheritanceList = FormatStyle::BILS_AfterColon;
4567   verifyFormat("class SomeClass :\n"
4568                "  public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4569                "  public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
4570                Style);
4571 }
4572 
4573 #ifndef EXPENSIVE_CHECKS
4574 // Expensive checks enables libstdc++ checking which includes validating the
4575 // state of ranges used in std::priority_queue - this blows out the
4576 // runtime/scalability of the function and makes this test unacceptably slow.
4577 TEST_F(FormatTest, MemoizationTests) {
4578   // This breaks if the memoization lookup does not take \c Indent and
4579   // \c LastSpace into account.
4580   verifyFormat(
4581       "extern CFRunLoopTimerRef\n"
4582       "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
4583       "                     CFTimeInterval interval, CFOptionFlags flags,\n"
4584       "                     CFIndex order, CFRunLoopTimerCallBack callout,\n"
4585       "                     CFRunLoopTimerContext *context) {}");
4586 
4587   // Deep nesting somewhat works around our memoization.
4588   verifyFormat(
4589       "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4590       "    aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4591       "        aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4592       "            aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4593       "                aaaaa())))))))))))))))))))))))))))))))))))))));",
4594       getLLVMStyleWithColumns(65));
4595   verifyFormat(
4596       "aaaaa(\n"
4597       "    aaaaa,\n"
4598       "    aaaaa(\n"
4599       "        aaaaa,\n"
4600       "        aaaaa(\n"
4601       "            aaaaa,\n"
4602       "            aaaaa(\n"
4603       "                aaaaa,\n"
4604       "                aaaaa(\n"
4605       "                    aaaaa,\n"
4606       "                    aaaaa(\n"
4607       "                        aaaaa,\n"
4608       "                        aaaaa(\n"
4609       "                            aaaaa,\n"
4610       "                            aaaaa(\n"
4611       "                                aaaaa,\n"
4612       "                                aaaaa(\n"
4613       "                                    aaaaa,\n"
4614       "                                    aaaaa(\n"
4615       "                                        aaaaa,\n"
4616       "                                        aaaaa(\n"
4617       "                                            aaaaa,\n"
4618       "                                            aaaaa(\n"
4619       "                                                aaaaa,\n"
4620       "                                                aaaaa))))))))))));",
4621       getLLVMStyleWithColumns(65));
4622   verifyFormat(
4623       "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"
4624       "                                  a),\n"
4625       "                                a),\n"
4626       "                              a),\n"
4627       "                            a),\n"
4628       "                          a),\n"
4629       "                        a),\n"
4630       "                      a),\n"
4631       "                    a),\n"
4632       "                  a),\n"
4633       "                a),\n"
4634       "              a),\n"
4635       "            a),\n"
4636       "          a),\n"
4637       "        a),\n"
4638       "      a),\n"
4639       "    a),\n"
4640       "  a)",
4641       getLLVMStyleWithColumns(65));
4642 
4643   // This test takes VERY long when memoization is broken.
4644   FormatStyle OnePerLine = getLLVMStyle();
4645   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4646   OnePerLine.BinPackParameters = false;
4647   std::string input = "Constructor()\n"
4648                       "    : aaaa(a,\n";
4649   for (unsigned i = 0, e = 80; i != e; ++i) {
4650     input += "           a,\n";
4651   }
4652   input += "           a) {}";
4653   verifyFormat(input, OnePerLine);
4654 }
4655 #endif
4656 
4657 TEST_F(FormatTest, BreaksAsHighAsPossible) {
4658   verifyFormat(
4659       "void f() {\n"
4660       "  if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
4661       "      (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
4662       "    f();\n"
4663       "}");
4664   verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
4665                "    Intervals[i - 1].getRange().getLast()) {\n}");
4666 }
4667 
4668 TEST_F(FormatTest, BreaksFunctionDeclarations) {
4669   // Principially, we break function declarations in a certain order:
4670   // 1) break amongst arguments.
4671   verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
4672                "                              Cccccccccccccc cccccccccccccc);");
4673   verifyFormat("template <class TemplateIt>\n"
4674                "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
4675                "                            TemplateIt *stop) {}");
4676 
4677   // 2) break after return type.
4678   verifyFormat(
4679       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4680       "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
4681       getGoogleStyle());
4682 
4683   // 3) break after (.
4684   verifyFormat(
4685       "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
4686       "    Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
4687       getGoogleStyle());
4688 
4689   // 4) break before after nested name specifiers.
4690   verifyFormat(
4691       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4692       "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
4693       "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
4694       getGoogleStyle());
4695 
4696   // However, there are exceptions, if a sufficient amount of lines can be
4697   // saved.
4698   // FIXME: The precise cut-offs wrt. the number of saved lines might need some
4699   // more adjusting.
4700   verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4701                "                                  Cccccccccccccc cccccccccc,\n"
4702                "                                  Cccccccccccccc cccccccccc,\n"
4703                "                                  Cccccccccccccc cccccccccc,\n"
4704                "                                  Cccccccccccccc cccccccccc);");
4705   verifyFormat(
4706       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4707       "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4708       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4709       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
4710       getGoogleStyle());
4711   verifyFormat(
4712       "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4713       "                                          Cccccccccccccc cccccccccc,\n"
4714       "                                          Cccccccccccccc cccccccccc,\n"
4715       "                                          Cccccccccccccc cccccccccc,\n"
4716       "                                          Cccccccccccccc cccccccccc,\n"
4717       "                                          Cccccccccccccc cccccccccc,\n"
4718       "                                          Cccccccccccccc cccccccccc);");
4719   verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4720                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4721                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4722                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4723                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
4724 
4725   // Break after multi-line parameters.
4726   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4727                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4728                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4729                "    bbbb bbbb);");
4730   verifyFormat("void SomeLoooooooooooongFunction(\n"
4731                "    std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
4732                "        aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4733                "    int bbbbbbbbbbbbb);");
4734 
4735   // Treat overloaded operators like other functions.
4736   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4737                "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
4738   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4739                "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
4740   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4741                "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
4742   verifyGoogleFormat(
4743       "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
4744       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
4745   verifyGoogleFormat(
4746       "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
4747       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
4748   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4749                "    int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
4750   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
4751                "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
4752   verifyGoogleFormat(
4753       "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
4754       "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4755       "    bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
4756   verifyGoogleFormat(
4757       "template <typename T>\n"
4758       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4759       "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
4760       "    aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
4761 
4762   FormatStyle Style = getLLVMStyle();
4763   Style.PointerAlignment = FormatStyle::PAS_Left;
4764   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4765                "    aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
4766                Style);
4767   verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
4768                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4769                Style);
4770 }
4771 
4772 TEST_F(FormatTest, DontBreakBeforeQualifiedOperator) {
4773   // Regression test for https://bugs.llvm.org/show_bug.cgi?id=40516:
4774   // Prefer keeping `::` followed by `operator` together.
4775   EXPECT_EQ("const aaaa::bbbbbbb &\n"
4776             "ccccccccc::operator++() {\n"
4777             "  stuff();\n"
4778             "}",
4779             format("const aaaa::bbbbbbb\n"
4780                    "&ccccccccc::operator++() { stuff(); }",
4781                    getLLVMStyleWithColumns(40)));
4782 }
4783 
4784 TEST_F(FormatTest, TrailingReturnType) {
4785   verifyFormat("auto foo() -> int;\n");
4786   verifyFormat("struct S {\n"
4787                "  auto bar() const -> int;\n"
4788                "};");
4789   verifyFormat("template <size_t Order, typename T>\n"
4790                "auto load_img(const std::string &filename)\n"
4791                "    -> alias::tensor<Order, T, mem::tag::cpu> {}");
4792   verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
4793                "    -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
4794   verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
4795   verifyFormat("template <typename T>\n"
4796                "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
4797                "    -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
4798 
4799   // Not trailing return types.
4800   verifyFormat("void f() { auto a = b->c(); }");
4801 }
4802 
4803 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
4804   // Avoid breaking before trailing 'const' or other trailing annotations, if
4805   // they are not function-like.
4806   FormatStyle Style = getGoogleStyle();
4807   Style.ColumnLimit = 47;
4808   verifyFormat("void someLongFunction(\n"
4809                "    int someLoooooooooooooongParameter) const {\n}",
4810                getLLVMStyleWithColumns(47));
4811   verifyFormat("LoooooongReturnType\n"
4812                "someLoooooooongFunction() const {}",
4813                getLLVMStyleWithColumns(47));
4814   verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
4815                "    const {}",
4816                Style);
4817   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4818                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
4819   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4820                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
4821   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4822                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
4823   verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
4824                "                   aaaaaaaaaaa aaaaa) const override;");
4825   verifyGoogleFormat(
4826       "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4827       "    const override;");
4828 
4829   // Even if the first parameter has to be wrapped.
4830   verifyFormat("void someLongFunction(\n"
4831                "    int someLongParameter) const {}",
4832                getLLVMStyleWithColumns(46));
4833   verifyFormat("void someLongFunction(\n"
4834                "    int someLongParameter) const {}",
4835                Style);
4836   verifyFormat("void someLongFunction(\n"
4837                "    int someLongParameter) override {}",
4838                Style);
4839   verifyFormat("void someLongFunction(\n"
4840                "    int someLongParameter) OVERRIDE {}",
4841                Style);
4842   verifyFormat("void someLongFunction(\n"
4843                "    int someLongParameter) final {}",
4844                Style);
4845   verifyFormat("void someLongFunction(\n"
4846                "    int someLongParameter) FINAL {}",
4847                Style);
4848   verifyFormat("void someLongFunction(\n"
4849                "    int parameter) const override {}",
4850                Style);
4851 
4852   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
4853   verifyFormat("void someLongFunction(\n"
4854                "    int someLongParameter) const\n"
4855                "{\n"
4856                "}",
4857                Style);
4858 
4859   // Unless these are unknown annotations.
4860   verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
4861                "                  aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4862                "    LONG_AND_UGLY_ANNOTATION;");
4863 
4864   // Breaking before function-like trailing annotations is fine to keep them
4865   // close to their arguments.
4866   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4867                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4868   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4869                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4870   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4871                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
4872   verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
4873                      "    AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
4874   verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
4875 
4876   verifyFormat(
4877       "void aaaaaaaaaaaaaaaaaa()\n"
4878       "    __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
4879       "                   aaaaaaaaaaaaaaaaaaaaaaaaa));");
4880   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4881                "    __attribute__((unused));");
4882   verifyGoogleFormat(
4883       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4884       "    GUARDED_BY(aaaaaaaaaaaa);");
4885   verifyGoogleFormat(
4886       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4887       "    GUARDED_BY(aaaaaaaaaaaa);");
4888   verifyGoogleFormat(
4889       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4890       "    aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4891   verifyGoogleFormat(
4892       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4893       "    aaaaaaaaaaaaaaaaaaaaaaaaa;");
4894 }
4895 
4896 TEST_F(FormatTest, FunctionAnnotations) {
4897   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4898                "int OldFunction(const string &parameter) {}");
4899   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4900                "string OldFunction(const string &parameter) {}");
4901   verifyFormat("template <typename T>\n"
4902                "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4903                "string OldFunction(const string &parameter) {}");
4904 
4905   // Not function annotations.
4906   verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4907                "                << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
4908   verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4909                "       ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
4910   verifyFormat("MACRO(abc).function() // wrap\n"
4911                "    << abc;");
4912   verifyFormat("MACRO(abc)->function() // wrap\n"
4913                "    << abc;");
4914   verifyFormat("MACRO(abc)::function() // wrap\n"
4915                "    << abc;");
4916 }
4917 
4918 TEST_F(FormatTest, BreaksDesireably) {
4919   verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4920                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4921                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
4922   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4923                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4924                "}");
4925 
4926   verifyFormat(
4927       "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4928       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
4929 
4930   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4931                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4932                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4933 
4934   verifyFormat(
4935       "aaaaaaaa(aaaaaaaaaaaaa,\n"
4936       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4937       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4938       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4939       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
4940 
4941   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4942                "    (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4943 
4944   verifyFormat(
4945       "void f() {\n"
4946       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4947       "                                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4948       "}");
4949   verifyFormat(
4950       "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4951       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4952   verifyFormat(
4953       "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4954       "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4955   verifyFormat(
4956       "aaaaaa(aaa,\n"
4957       "       new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4958       "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4959       "       aaaa);");
4960   verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4961                "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4962                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4963 
4964   // Indent consistently independent of call expression and unary operator.
4965   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4966                "    dddddddddddddddddddddddddddddd));");
4967   verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4968                "    dddddddddddddddddddddddddddddd));");
4969   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
4970                "    dddddddddddddddddddddddddddddd));");
4971 
4972   // This test case breaks on an incorrect memoization, i.e. an optimization not
4973   // taking into account the StopAt value.
4974   verifyFormat(
4975       "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4976       "       aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4977       "       aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4978       "       (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4979 
4980   verifyFormat("{\n  {\n    {\n"
4981                "      Annotation.SpaceRequiredBefore =\n"
4982                "          Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4983                "          Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4984                "    }\n  }\n}");
4985 
4986   // Break on an outer level if there was a break on an inner level.
4987   EXPECT_EQ("f(g(h(a, // comment\n"
4988             "      b, c),\n"
4989             "    d, e),\n"
4990             "  x, y);",
4991             format("f(g(h(a, // comment\n"
4992                    "    b, c), d, e), x, y);"));
4993 
4994   // Prefer breaking similar line breaks.
4995   verifyFormat(
4996       "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4997       "                             NSTrackingMouseEnteredAndExited |\n"
4998       "                             NSTrackingActiveAlways;");
4999 }
5000 
5001 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
5002   FormatStyle NoBinPacking = getGoogleStyle();
5003   NoBinPacking.BinPackParameters = false;
5004   NoBinPacking.BinPackArguments = true;
5005   verifyFormat("void f() {\n"
5006                "  f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
5007                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5008                "}",
5009                NoBinPacking);
5010   verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
5011                "       int aaaaaaaaaaaaaaaaaaaa,\n"
5012                "       int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5013                NoBinPacking);
5014 
5015   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
5016   verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5017                "                        vector<int> bbbbbbbbbbbbbbb);",
5018                NoBinPacking);
5019   // FIXME: This behavior difference is probably not wanted. However, currently
5020   // we cannot distinguish BreakBeforeParameter being set because of the wrapped
5021   // template arguments from BreakBeforeParameter being set because of the
5022   // one-per-line formatting.
5023   verifyFormat(
5024       "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
5025       "                                             aaaaaaaaaa> aaaaaaaaaa);",
5026       NoBinPacking);
5027   verifyFormat(
5028       "void fffffffffff(\n"
5029       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
5030       "        aaaaaaaaaa);");
5031 }
5032 
5033 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
5034   FormatStyle NoBinPacking = getGoogleStyle();
5035   NoBinPacking.BinPackParameters = false;
5036   NoBinPacking.BinPackArguments = false;
5037   verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
5038                "  aaaaaaaaaaaaaaaaaaaa,\n"
5039                "  aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
5040                NoBinPacking);
5041   verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
5042                "        aaaaaaaaaaaaa,\n"
5043                "        aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
5044                NoBinPacking);
5045   verifyFormat(
5046       "aaaaaaaa(aaaaaaaaaaaaa,\n"
5047       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5048       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
5049       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5050       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
5051       NoBinPacking);
5052   verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
5053                "    .aaaaaaaaaaaaaaaaaa();",
5054                NoBinPacking);
5055   verifyFormat("void f() {\n"
5056                "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5057                "      aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
5058                "}",
5059                NoBinPacking);
5060 
5061   verifyFormat(
5062       "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5063       "             aaaaaaaaaaaa,\n"
5064       "             aaaaaaaaaaaa);",
5065       NoBinPacking);
5066   verifyFormat(
5067       "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
5068       "                               ddddddddddddddddddddddddddddd),\n"
5069       "             test);",
5070       NoBinPacking);
5071 
5072   verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
5073                "            aaaaaaaaaaaaaaaaaaaaaaa,\n"
5074                "            aaaaaaaaaaaaaaaaaaaaaaa>\n"
5075                "    aaaaaaaaaaaaaaaaaa;",
5076                NoBinPacking);
5077   verifyFormat("a(\"a\"\n"
5078                "  \"a\",\n"
5079                "  a);");
5080 
5081   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
5082   verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
5083                "                aaaaaaaaa,\n"
5084                "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5085                NoBinPacking);
5086   verifyFormat(
5087       "void f() {\n"
5088       "  aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
5089       "      .aaaaaaa();\n"
5090       "}",
5091       NoBinPacking);
5092   verifyFormat(
5093       "template <class SomeType, class SomeOtherType>\n"
5094       "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
5095       NoBinPacking);
5096 }
5097 
5098 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
5099   FormatStyle Style = getLLVMStyleWithColumns(15);
5100   Style.ExperimentalAutoDetectBinPacking = true;
5101   EXPECT_EQ("aaa(aaaa,\n"
5102             "    aaaa,\n"
5103             "    aaaa);\n"
5104             "aaa(aaaa,\n"
5105             "    aaaa,\n"
5106             "    aaaa);",
5107             format("aaa(aaaa,\n" // one-per-line
5108                    "  aaaa,\n"
5109                    "    aaaa  );\n"
5110                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
5111                    Style));
5112   EXPECT_EQ("aaa(aaaa, aaaa,\n"
5113             "    aaaa);\n"
5114             "aaa(aaaa, aaaa,\n"
5115             "    aaaa);",
5116             format("aaa(aaaa,  aaaa,\n" // bin-packed
5117                    "    aaaa  );\n"
5118                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
5119                    Style));
5120 }
5121 
5122 TEST_F(FormatTest, FormatsBuilderPattern) {
5123   verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
5124                "    .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
5125                "    .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
5126                "    .StartsWith(\".init\", ORDER_INIT)\n"
5127                "    .StartsWith(\".fini\", ORDER_FINI)\n"
5128                "    .StartsWith(\".hash\", ORDER_HASH)\n"
5129                "    .Default(ORDER_TEXT);\n");
5130 
5131   verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
5132                "       aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
5133   verifyFormat(
5134       "aaaaaaa->aaaaaaa\n"
5135       "    ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5136       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5137       "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
5138   verifyFormat(
5139       "aaaaaaa->aaaaaaa\n"
5140       "    ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5141       "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
5142   verifyFormat(
5143       "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
5144       "    aaaaaaaaaaaaaa);");
5145   verifyFormat(
5146       "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
5147       "    aaaaaa->aaaaaaaaaaaa()\n"
5148       "        ->aaaaaaaaaaaaaaaa(\n"
5149       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5150       "        ->aaaaaaaaaaaaaaaaa();");
5151   verifyGoogleFormat(
5152       "void f() {\n"
5153       "  someo->Add((new util::filetools::Handler(dir))\n"
5154       "                 ->OnEvent1(NewPermanentCallback(\n"
5155       "                     this, &HandlerHolderClass::EventHandlerCBA))\n"
5156       "                 ->OnEvent2(NewPermanentCallback(\n"
5157       "                     this, &HandlerHolderClass::EventHandlerCBB))\n"
5158       "                 ->OnEvent3(NewPermanentCallback(\n"
5159       "                     this, &HandlerHolderClass::EventHandlerCBC))\n"
5160       "                 ->OnEvent5(NewPermanentCallback(\n"
5161       "                     this, &HandlerHolderClass::EventHandlerCBD))\n"
5162       "                 ->OnEvent6(NewPermanentCallback(\n"
5163       "                     this, &HandlerHolderClass::EventHandlerCBE)));\n"
5164       "}");
5165 
5166   verifyFormat(
5167       "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
5168   verifyFormat("aaaaaaaaaaaaaaa()\n"
5169                "    .aaaaaaaaaaaaaaa()\n"
5170                "    .aaaaaaaaaaaaaaa()\n"
5171                "    .aaaaaaaaaaaaaaa()\n"
5172                "    .aaaaaaaaaaaaaaa();");
5173   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
5174                "    .aaaaaaaaaaaaaaa()\n"
5175                "    .aaaaaaaaaaaaaaa()\n"
5176                "    .aaaaaaaaaaaaaaa();");
5177   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
5178                "    .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
5179                "    .aaaaaaaaaaaaaaa();");
5180   verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
5181                "    ->aaaaaaaaaaaaaae(0)\n"
5182                "    ->aaaaaaaaaaaaaaa();");
5183 
5184   // Don't linewrap after very short segments.
5185   verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5186                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5187                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5188   verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5189                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5190                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5191   verifyFormat("aaa()\n"
5192                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5193                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5194                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5195 
5196   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
5197                "    .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5198                "    .has<bbbbbbbbbbbbbbbbbbbbb>();");
5199   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
5200                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
5201                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
5202 
5203   // Prefer not to break after empty parentheses.
5204   verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
5205                "    First->LastNewlineOffset);");
5206 
5207   // Prefer not to create "hanging" indents.
5208   verifyFormat(
5209       "return !soooooooooooooome_map\n"
5210       "            .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5211       "            .second;");
5212   verifyFormat(
5213       "return aaaaaaaaaaaaaaaa\n"
5214       "    .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
5215       "    .aaaa(aaaaaaaaaaaaaa);");
5216   // No hanging indent here.
5217   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
5218                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5219   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
5220                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5221   verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
5222                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5223                getLLVMStyleWithColumns(60));
5224   verifyFormat("aaaaaaaaaaaaaaaaaa\n"
5225                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
5226                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5227                getLLVMStyleWithColumns(59));
5228   verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5229                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5230                "    .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5231 
5232   // Dont break if only closing statements before member call
5233   verifyFormat("test() {\n"
5234                "  ([]() -> {\n"
5235                "    int b = 32;\n"
5236                "    return 3;\n"
5237                "  }).foo();\n"
5238                "}");
5239   verifyFormat("test() {\n"
5240                "  (\n"
5241                "      []() -> {\n"
5242                "        int b = 32;\n"
5243                "        return 3;\n"
5244                "      },\n"
5245                "      foo, bar)\n"
5246                "      .foo();\n"
5247                "}");
5248   verifyFormat("test() {\n"
5249                "  ([]() -> {\n"
5250                "    int b = 32;\n"
5251                "    return 3;\n"
5252                "  })\n"
5253                "      .foo()\n"
5254                "      .bar();\n"
5255                "}");
5256   verifyFormat("test() {\n"
5257                "  ([]() -> {\n"
5258                "    int b = 32;\n"
5259                "    return 3;\n"
5260                "  })\n"
5261                "      .foo(\"aaaaaaaaaaaaaaaaa\"\n"
5262                "           \"bbbb\");\n"
5263                "}",
5264                getLLVMStyleWithColumns(30));
5265 }
5266 
5267 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
5268   verifyFormat(
5269       "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
5270       "    bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
5271   verifyFormat(
5272       "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
5273       "    bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
5274 
5275   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
5276                "    ccccccccccccccccccccccccc) {\n}");
5277   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
5278                "    ccccccccccccccccccccccccc) {\n}");
5279 
5280   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
5281                "    ccccccccccccccccccccccccc) {\n}");
5282   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
5283                "    ccccccccccccccccccccccccc) {\n}");
5284 
5285   verifyFormat(
5286       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
5287       "    ccccccccccccccccccccccccc) {\n}");
5288   verifyFormat(
5289       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
5290       "    ccccccccccccccccccccccccc) {\n}");
5291 
5292   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
5293                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
5294                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
5295                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
5296   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
5297                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
5298                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
5299                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
5300 
5301   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
5302                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
5303                "    aaaaaaaaaaaaaaa != aa) {\n}");
5304   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
5305                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
5306                "    aaaaaaaaaaaaaaa != aa) {\n}");
5307 }
5308 
5309 TEST_F(FormatTest, BreaksAfterAssignments) {
5310   verifyFormat(
5311       "unsigned Cost =\n"
5312       "    TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
5313       "                        SI->getPointerAddressSpaceee());\n");
5314   verifyFormat(
5315       "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
5316       "    Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
5317 
5318   verifyFormat(
5319       "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
5320       "    aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
5321   verifyFormat("unsigned OriginalStartColumn =\n"
5322                "    SourceMgr.getSpellingColumnNumber(\n"
5323                "        Current.FormatTok.getStartOfNonWhitespace()) -\n"
5324                "    1;");
5325 }
5326 
5327 TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
5328   FormatStyle Style = getLLVMStyle();
5329   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5330                "    bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
5331                Style);
5332 
5333   Style.PenaltyBreakAssignment = 20;
5334   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
5335                "                                 cccccccccccccccccccccccccc;",
5336                Style);
5337 }
5338 
5339 TEST_F(FormatTest, AlignsAfterAssignments) {
5340   verifyFormat(
5341       "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5342       "             aaaaaaaaaaaaaaaaaaaaaaaaa;");
5343   verifyFormat(
5344       "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5345       "          aaaaaaaaaaaaaaaaaaaaaaaaa;");
5346   verifyFormat(
5347       "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5348       "           aaaaaaaaaaaaaaaaaaaaaaaaa;");
5349   verifyFormat(
5350       "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5351       "              aaaaaaaaaaaaaaaaaaaaaaaaa);");
5352   verifyFormat(
5353       "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5354       "                                            aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5355       "                                            aaaaaaaaaaaaaaaaaaaaaaaa;");
5356 }
5357 
5358 TEST_F(FormatTest, AlignsAfterReturn) {
5359   verifyFormat(
5360       "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5361       "       aaaaaaaaaaaaaaaaaaaaaaaaa;");
5362   verifyFormat(
5363       "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5364       "        aaaaaaaaaaaaaaaaaaaaaaaaa);");
5365   verifyFormat(
5366       "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
5367       "       aaaaaaaaaaaaaaaaaaaaaa();");
5368   verifyFormat(
5369       "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
5370       "        aaaaaaaaaaaaaaaaaaaaaa());");
5371   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5372                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5373   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5374                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
5375                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5376   verifyFormat("return\n"
5377                "    // true if code is one of a or b.\n"
5378                "    code == a || code == b;");
5379 }
5380 
5381 TEST_F(FormatTest, AlignsAfterOpenBracket) {
5382   verifyFormat(
5383       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5384       "                                                aaaaaaaaa aaaaaaa) {}");
5385   verifyFormat(
5386       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5387       "                                               aaaaaaaaaaa aaaaaaaaa);");
5388   verifyFormat(
5389       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5390       "                                             aaaaaaaaaaaaaaaaaaaaa));");
5391   FormatStyle Style = getLLVMStyle();
5392   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5393   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5394                "    aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
5395                Style);
5396   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5397                "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
5398                Style);
5399   verifyFormat("SomeLongVariableName->someFunction(\n"
5400                "    foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
5401                Style);
5402   verifyFormat(
5403       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5404       "    aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5405       Style);
5406   verifyFormat(
5407       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5408       "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5409       Style);
5410   verifyFormat(
5411       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5412       "    aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
5413       Style);
5414 
5415   verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
5416                "    ccccccc(aaaaaaaaaaaaaaaaa,         //\n"
5417                "        b));",
5418                Style);
5419 
5420   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5421   Style.BinPackArguments = false;
5422   Style.BinPackParameters = false;
5423   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5424                "    aaaaaaaaaaa aaaaaaaa,\n"
5425                "    aaaaaaaaa aaaaaaa,\n"
5426                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5427                Style);
5428   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5429                "    aaaaaaaaaaa aaaaaaaaa,\n"
5430                "    aaaaaaaaaaa aaaaaaaaa,\n"
5431                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5432                Style);
5433   verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
5434                "    aaaaaaaaaaaaaaa,\n"
5435                "    aaaaaaaaaaaaaaaaaaaaa,\n"
5436                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
5437                Style);
5438   verifyFormat(
5439       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
5440       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5441       Style);
5442   verifyFormat(
5443       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
5444       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5445       Style);
5446   verifyFormat(
5447       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5448       "    aaaaaaaaaaaaaaaaaaaaa(\n"
5449       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
5450       "    aaaaaaaaaaaaaaaa);",
5451       Style);
5452   verifyFormat(
5453       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5454       "    aaaaaaaaaaaaaaaaaaaaa(\n"
5455       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
5456       "    aaaaaaaaaaaaaaaa);",
5457       Style);
5458 }
5459 
5460 TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
5461   FormatStyle Style = getLLVMStyleWithColumns(40);
5462   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5463                "          bbbbbbbbbbbbbbbbbbbbbb);",
5464                Style);
5465   Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
5466   Style.AlignOperands = false;
5467   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5468                "          bbbbbbbbbbbbbbbbbbbbbb);",
5469                Style);
5470   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5471   Style.AlignOperands = true;
5472   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5473                "          bbbbbbbbbbbbbbbbbbbbbb);",
5474                Style);
5475   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5476   Style.AlignOperands = false;
5477   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5478                "    bbbbbbbbbbbbbbbbbbbbbb);",
5479                Style);
5480 }
5481 
5482 TEST_F(FormatTest, BreaksConditionalExpressions) {
5483   verifyFormat(
5484       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5485       "                               ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5486       "                               : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5487   verifyFormat(
5488       "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
5489       "     aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5490       "                                : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5491   verifyFormat(
5492       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5493       "                                   : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5494   verifyFormat(
5495       "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
5496       "     aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5497       "             : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5498   verifyFormat(
5499       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
5500       "                                                    : aaaaaaaaaaaaa);");
5501   verifyFormat(
5502       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5503       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5504       "                                    : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5505       "                   aaaaaaaaaaaaa);");
5506   verifyFormat(
5507       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5508       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5509       "                   aaaaaaaaaaaaa);");
5510   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5511                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5512                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5513                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5514                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5515   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5516                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5517                "           ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5518                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5519                "           : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5520                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5521                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5522   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5523                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5524                "           ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5525                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5526                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5527   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5528                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5529                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5530   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
5531                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5532                "        ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5533                "        : aaaaaaaaaaaaaaaa;");
5534   verifyFormat(
5535       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5536       "    ? aaaaaaaaaaaaaaa\n"
5537       "    : aaaaaaaaaaaaaaa;");
5538   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
5539                "          aaaaaaaaa\n"
5540                "      ? b\n"
5541                "      : c);");
5542   verifyFormat("return aaaa == bbbb\n"
5543                "           // comment\n"
5544                "           ? aaaa\n"
5545                "           : bbbb;");
5546   verifyFormat("unsigned Indent =\n"
5547                "    format(TheLine.First,\n"
5548                "           IndentForLevel[TheLine.Level] >= 0\n"
5549                "               ? IndentForLevel[TheLine.Level]\n"
5550                "               : TheLine * 2,\n"
5551                "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
5552                getLLVMStyleWithColumns(60));
5553   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5554                "                  ? aaaaaaaaaaaaaaa\n"
5555                "                  : bbbbbbbbbbbbbbb //\n"
5556                "                        ? ccccccccccccccc\n"
5557                "                        : ddddddddddddddd;");
5558   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5559                "                  ? aaaaaaaaaaaaaaa\n"
5560                "                  : (bbbbbbbbbbbbbbb //\n"
5561                "                         ? ccccccccccccccc\n"
5562                "                         : ddddddddddddddd);");
5563   verifyFormat(
5564       "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5565       "                                      ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5566       "                                            aaaaaaaaaaaaaaaaaaaaa +\n"
5567       "                                            aaaaaaaaaaaaaaaaaaaaa\n"
5568       "                                      : aaaaaaaaaa;");
5569   verifyFormat(
5570       "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5571       "                                   : aaaaaaaaaaaaaaaaaaaaaa\n"
5572       "                      : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5573 
5574   FormatStyle NoBinPacking = getLLVMStyle();
5575   NoBinPacking.BinPackArguments = false;
5576   verifyFormat(
5577       "void f() {\n"
5578       "  g(aaa,\n"
5579       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5580       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5581       "        ? aaaaaaaaaaaaaaa\n"
5582       "        : aaaaaaaaaaaaaaa);\n"
5583       "}",
5584       NoBinPacking);
5585   verifyFormat(
5586       "void f() {\n"
5587       "  g(aaa,\n"
5588       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5589       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5590       "        ?: aaaaaaaaaaaaaaa);\n"
5591       "}",
5592       NoBinPacking);
5593 
5594   verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
5595                "             // comment.\n"
5596                "             ccccccccccccccccccccccccccccccccccccccc\n"
5597                "                 ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5598                "                 : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
5599 
5600   // Assignments in conditional expressions. Apparently not uncommon :-(.
5601   verifyFormat("return a != b\n"
5602                "           // comment\n"
5603                "           ? a = b\n"
5604                "           : a = b;");
5605   verifyFormat("return a != b\n"
5606                "           // comment\n"
5607                "           ? a = a != b\n"
5608                "                     // comment\n"
5609                "                     ? a = b\n"
5610                "                     : a\n"
5611                "           : a;\n");
5612   verifyFormat("return a != b\n"
5613                "           // comment\n"
5614                "           ? a\n"
5615                "           : a = a != b\n"
5616                "                     // comment\n"
5617                "                     ? a = b\n"
5618                "                     : a;");
5619 }
5620 
5621 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
5622   FormatStyle Style = getLLVMStyle();
5623   Style.BreakBeforeTernaryOperators = false;
5624   Style.ColumnLimit = 70;
5625   verifyFormat(
5626       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5627       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5628       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5629       Style);
5630   verifyFormat(
5631       "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
5632       "     aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5633       "                                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5634       Style);
5635   verifyFormat(
5636       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5637       "                                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5638       Style);
5639   verifyFormat(
5640       "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
5641       "     aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5642       "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5643       Style);
5644   verifyFormat(
5645       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
5646       "                                                      aaaaaaaaaaaaa);",
5647       Style);
5648   verifyFormat(
5649       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5650       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5651       "                                      aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5652       "                   aaaaaaaaaaaaa);",
5653       Style);
5654   verifyFormat(
5655       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5656       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5657       "                   aaaaaaaaaaaaa);",
5658       Style);
5659   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5660                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5661                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5662                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5663                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5664                Style);
5665   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5666                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5667                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5668                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5669                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5670                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5671                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5672                Style);
5673   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5674                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
5675                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5676                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5677                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5678                Style);
5679   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5680                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5681                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5682                Style);
5683   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
5684                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5685                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5686                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5687                Style);
5688   verifyFormat(
5689       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5690       "    aaaaaaaaaaaaaaa :\n"
5691       "    aaaaaaaaaaaaaaa;",
5692       Style);
5693   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
5694                "          aaaaaaaaa ?\n"
5695                "      b :\n"
5696                "      c);",
5697                Style);
5698   verifyFormat("unsigned Indent =\n"
5699                "    format(TheLine.First,\n"
5700                "           IndentForLevel[TheLine.Level] >= 0 ?\n"
5701                "               IndentForLevel[TheLine.Level] :\n"
5702                "               TheLine * 2,\n"
5703                "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
5704                Style);
5705   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5706                "                  aaaaaaaaaaaaaaa :\n"
5707                "                  bbbbbbbbbbbbbbb ? //\n"
5708                "                      ccccccccccccccc :\n"
5709                "                      ddddddddddddddd;",
5710                Style);
5711   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5712                "                  aaaaaaaaaaaaaaa :\n"
5713                "                  (bbbbbbbbbbbbbbb ? //\n"
5714                "                       ccccccccccccccc :\n"
5715                "                       ddddddddddddddd);",
5716                Style);
5717   verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5718                "            /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
5719                "            ccccccccccccccccccccccccccc;",
5720                Style);
5721   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5722                "           aaaaa :\n"
5723                "           bbbbbbbbbbbbbbb + cccccccccccccccc;",
5724                Style);
5725 }
5726 
5727 TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
5728   verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
5729                "     aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
5730   verifyFormat("bool a = true, b = false;");
5731 
5732   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5733                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
5734                "     bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
5735                "         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
5736   verifyFormat(
5737       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
5738       "         bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
5739       "     d = e && f;");
5740   verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
5741                "          c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
5742   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5743                "          *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
5744   verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
5745                "          ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
5746 
5747   FormatStyle Style = getGoogleStyle();
5748   Style.PointerAlignment = FormatStyle::PAS_Left;
5749   Style.DerivePointerAlignment = false;
5750   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5751                "    *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
5752                "    *b = bbbbbbbbbbbbbbbbbbb;",
5753                Style);
5754   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5755                "          *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
5756                Style);
5757   verifyFormat("vector<int*> a, b;", Style);
5758   verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
5759 }
5760 
5761 TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
5762   verifyFormat("arr[foo ? bar : baz];");
5763   verifyFormat("f()[foo ? bar : baz];");
5764   verifyFormat("(a + b)[foo ? bar : baz];");
5765   verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
5766 }
5767 
5768 TEST_F(FormatTest, AlignsStringLiterals) {
5769   verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
5770                "                                      \"short literal\");");
5771   verifyFormat(
5772       "looooooooooooooooooooooooongFunction(\n"
5773       "    \"short literal\"\n"
5774       "    \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
5775   verifyFormat("someFunction(\"Always break between multi-line\"\n"
5776                "             \" string literals\",\n"
5777                "             and, other, parameters);");
5778   EXPECT_EQ("fun + \"1243\" /* comment */\n"
5779             "      \"5678\";",
5780             format("fun + \"1243\" /* comment */\n"
5781                    "    \"5678\";",
5782                    getLLVMStyleWithColumns(28)));
5783   EXPECT_EQ(
5784       "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
5785       "         \"aaaaaaaaaaaaaaaaaaaaa\"\n"
5786       "         \"aaaaaaaaaaaaaaaa\";",
5787       format("aaaaaa ="
5788              "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
5789              "aaaaaaaaaaaaaaaaaaaaa\" "
5790              "\"aaaaaaaaaaaaaaaa\";"));
5791   verifyFormat("a = a + \"a\"\n"
5792                "        \"a\"\n"
5793                "        \"a\";");
5794   verifyFormat("f(\"a\", \"b\"\n"
5795                "       \"c\");");
5796 
5797   verifyFormat(
5798       "#define LL_FORMAT \"ll\"\n"
5799       "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
5800       "       \"d, ddddddddd: %\" LL_FORMAT \"d\");");
5801 
5802   verifyFormat("#define A(X)          \\\n"
5803                "  \"aaaaa\" #X \"bbbbbb\" \\\n"
5804                "  \"ccccc\"",
5805                getLLVMStyleWithColumns(23));
5806   verifyFormat("#define A \"def\"\n"
5807                "f(\"abc\" A \"ghi\"\n"
5808                "  \"jkl\");");
5809 
5810   verifyFormat("f(L\"a\"\n"
5811                "  L\"b\");");
5812   verifyFormat("#define A(X)            \\\n"
5813                "  L\"aaaaa\" #X L\"bbbbbb\" \\\n"
5814                "  L\"ccccc\"",
5815                getLLVMStyleWithColumns(25));
5816 
5817   verifyFormat("f(@\"a\"\n"
5818                "  @\"b\");");
5819   verifyFormat("NSString s = @\"a\"\n"
5820                "             @\"b\"\n"
5821                "             @\"c\";");
5822   verifyFormat("NSString s = @\"a\"\n"
5823                "              \"b\"\n"
5824                "              \"c\";");
5825 }
5826 
5827 TEST_F(FormatTest, ReturnTypeBreakingStyle) {
5828   FormatStyle Style = getLLVMStyle();
5829   // No declarations or definitions should be moved to own line.
5830   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
5831   verifyFormat("class A {\n"
5832                "  int f() { return 1; }\n"
5833                "  int g();\n"
5834                "};\n"
5835                "int f() { return 1; }\n"
5836                "int g();\n",
5837                Style);
5838 
5839   // All declarations and definitions should have the return type moved to its
5840   // own
5841   // line.
5842   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
5843   verifyFormat("class E {\n"
5844                "  int\n"
5845                "  f() {\n"
5846                "    return 1;\n"
5847                "  }\n"
5848                "  int\n"
5849                "  g();\n"
5850                "};\n"
5851                "int\n"
5852                "f() {\n"
5853                "  return 1;\n"
5854                "}\n"
5855                "int\n"
5856                "g();\n",
5857                Style);
5858 
5859   // Top-level definitions, and no kinds of declarations should have the
5860   // return type moved to its own line.
5861   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
5862   verifyFormat("class B {\n"
5863                "  int f() { return 1; }\n"
5864                "  int g();\n"
5865                "};\n"
5866                "int\n"
5867                "f() {\n"
5868                "  return 1;\n"
5869                "}\n"
5870                "int g();\n",
5871                Style);
5872 
5873   // Top-level definitions and declarations should have the return type moved
5874   // to its own line.
5875   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
5876   verifyFormat("class C {\n"
5877                "  int f() { return 1; }\n"
5878                "  int g();\n"
5879                "};\n"
5880                "int\n"
5881                "f() {\n"
5882                "  return 1;\n"
5883                "}\n"
5884                "int\n"
5885                "g();\n",
5886                Style);
5887 
5888   // All definitions should have the return type moved to its own line, but no
5889   // kinds of declarations.
5890   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
5891   verifyFormat("class D {\n"
5892                "  int\n"
5893                "  f() {\n"
5894                "    return 1;\n"
5895                "  }\n"
5896                "  int g();\n"
5897                "};\n"
5898                "int\n"
5899                "f() {\n"
5900                "  return 1;\n"
5901                "}\n"
5902                "int g();\n",
5903                Style);
5904   verifyFormat("const char *\n"
5905                "f(void) {\n" // Break here.
5906                "  return \"\";\n"
5907                "}\n"
5908                "const char *bar(void);\n", // No break here.
5909                Style);
5910   verifyFormat("template <class T>\n"
5911                "T *\n"
5912                "f(T &c) {\n" // Break here.
5913                "  return NULL;\n"
5914                "}\n"
5915                "template <class T> T *f(T &c);\n", // No break here.
5916                Style);
5917   verifyFormat("class C {\n"
5918                "  int\n"
5919                "  operator+() {\n"
5920                "    return 1;\n"
5921                "  }\n"
5922                "  int\n"
5923                "  operator()() {\n"
5924                "    return 1;\n"
5925                "  }\n"
5926                "};\n",
5927                Style);
5928   verifyFormat("void\n"
5929                "A::operator()() {}\n"
5930                "void\n"
5931                "A::operator>>() {}\n"
5932                "void\n"
5933                "A::operator+() {}\n",
5934                Style);
5935   verifyFormat("void *operator new(std::size_t s);", // No break here.
5936                Style);
5937   verifyFormat("void *\n"
5938                "operator new(std::size_t s) {}",
5939                Style);
5940   verifyFormat("void *\n"
5941                "operator delete[](void *ptr) {}",
5942                Style);
5943   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
5944   verifyFormat("const char *\n"
5945                "f(void)\n" // Break here.
5946                "{\n"
5947                "  return \"\";\n"
5948                "}\n"
5949                "const char *bar(void);\n", // No break here.
5950                Style);
5951   verifyFormat("template <class T>\n"
5952                "T *\n"     // Problem here: no line break
5953                "f(T &c)\n" // Break here.
5954                "{\n"
5955                "  return NULL;\n"
5956                "}\n"
5957                "template <class T> T *f(T &c);\n", // No break here.
5958                Style);
5959   verifyFormat("int\n"
5960                "foo(A<bool> a)\n"
5961                "{\n"
5962                "  return a;\n"
5963                "}\n",
5964                Style);
5965   verifyFormat("int\n"
5966                "foo(A<8> a)\n"
5967                "{\n"
5968                "  return a;\n"
5969                "}\n",
5970                Style);
5971   verifyFormat("int\n"
5972                "foo(A<B<bool>, 8> a)\n"
5973                "{\n"
5974                "  return a;\n"
5975                "}\n",
5976                Style);
5977   verifyFormat("int\n"
5978                "foo(A<B<8>, bool> a)\n"
5979                "{\n"
5980                "  return a;\n"
5981                "}\n",
5982                Style);
5983   verifyFormat("int\n"
5984                "foo(A<B<bool>, bool> a)\n"
5985                "{\n"
5986                "  return a;\n"
5987                "}\n",
5988                Style);
5989   verifyFormat("int\n"
5990                "foo(A<B<8>, 8> a)\n"
5991                "{\n"
5992                "  return a;\n"
5993                "}\n",
5994                Style);
5995 
5996   Style = getGNUStyle();
5997 
5998   // Test for comments at the end of function declarations.
5999   verifyFormat("void\n"
6000                "foo (int a, /*abc*/ int b) // def\n"
6001                "{\n"
6002                "}\n",
6003                Style);
6004 
6005   verifyFormat("void\n"
6006                "foo (int a, /* abc */ int b) /* def */\n"
6007                "{\n"
6008                "}\n",
6009                Style);
6010 
6011   // Definitions that should not break after return type
6012   verifyFormat("void foo (int a, int b); // def\n", Style);
6013   verifyFormat("void foo (int a, int b); /* def */\n", Style);
6014   verifyFormat("void foo (int a, int b);\n", Style);
6015 }
6016 
6017 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
6018   FormatStyle NoBreak = getLLVMStyle();
6019   NoBreak.AlwaysBreakBeforeMultilineStrings = false;
6020   FormatStyle Break = getLLVMStyle();
6021   Break.AlwaysBreakBeforeMultilineStrings = true;
6022   verifyFormat("aaaa = \"bbbb\"\n"
6023                "       \"cccc\";",
6024                NoBreak);
6025   verifyFormat("aaaa =\n"
6026                "    \"bbbb\"\n"
6027                "    \"cccc\";",
6028                Break);
6029   verifyFormat("aaaa(\"bbbb\"\n"
6030                "     \"cccc\");",
6031                NoBreak);
6032   verifyFormat("aaaa(\n"
6033                "    \"bbbb\"\n"
6034                "    \"cccc\");",
6035                Break);
6036   verifyFormat("aaaa(qqq, \"bbbb\"\n"
6037                "          \"cccc\");",
6038                NoBreak);
6039   verifyFormat("aaaa(qqq,\n"
6040                "     \"bbbb\"\n"
6041                "     \"cccc\");",
6042                Break);
6043   verifyFormat("aaaa(qqq,\n"
6044                "     L\"bbbb\"\n"
6045                "     L\"cccc\");",
6046                Break);
6047   verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
6048                "                      \"bbbb\"));",
6049                Break);
6050   verifyFormat("string s = someFunction(\n"
6051                "    \"abc\"\n"
6052                "    \"abc\");",
6053                Break);
6054 
6055   // As we break before unary operators, breaking right after them is bad.
6056   verifyFormat("string foo = abc ? \"x\"\n"
6057                "                   \"blah blah blah blah blah blah\"\n"
6058                "                 : \"y\";",
6059                Break);
6060 
6061   // Don't break if there is no column gain.
6062   verifyFormat("f(\"aaaa\"\n"
6063                "  \"bbbb\");",
6064                Break);
6065 
6066   // Treat literals with escaped newlines like multi-line string literals.
6067   EXPECT_EQ("x = \"a\\\n"
6068             "b\\\n"
6069             "c\";",
6070             format("x = \"a\\\n"
6071                    "b\\\n"
6072                    "c\";",
6073                    NoBreak));
6074   EXPECT_EQ("xxxx =\n"
6075             "    \"a\\\n"
6076             "b\\\n"
6077             "c\";",
6078             format("xxxx = \"a\\\n"
6079                    "b\\\n"
6080                    "c\";",
6081                    Break));
6082 
6083   EXPECT_EQ("NSString *const kString =\n"
6084             "    @\"aaaa\"\n"
6085             "    @\"bbbb\";",
6086             format("NSString *const kString = @\"aaaa\"\n"
6087                    "@\"bbbb\";",
6088                    Break));
6089 
6090   Break.ColumnLimit = 0;
6091   verifyFormat("const char *hello = \"hello llvm\";", Break);
6092 }
6093 
6094 TEST_F(FormatTest, AlignsPipes) {
6095   verifyFormat(
6096       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6097       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6098       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6099   verifyFormat(
6100       "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
6101       "                     << aaaaaaaaaaaaaaaaaaaa;");
6102   verifyFormat(
6103       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6104       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6105   verifyFormat(
6106       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
6107       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6108   verifyFormat(
6109       "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
6110       "                \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
6111       "             << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
6112   verifyFormat(
6113       "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6114       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6115       "         << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6116   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6117                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6118                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6119                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
6120   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
6121                "             << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
6122   verifyFormat(
6123       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6124       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6125   verifyFormat(
6126       "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
6127       "                                       aaaaaaaaaaaaaaaaaaaaaaaaaa);");
6128 
6129   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
6130                "             << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
6131   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6132                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6133                "                    aaaaaaaaaaaaaaaaaaaaa)\n"
6134                "             << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
6135   verifyFormat("LOG_IF(aaa == //\n"
6136                "       bbb)\n"
6137                "    << a << b;");
6138 
6139   // But sometimes, breaking before the first "<<" is desirable.
6140   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
6141                "    << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
6142   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
6143                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6144                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6145   verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
6146                "    << BEF << IsTemplate << Description << E->getType();");
6147   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
6148                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6149                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6150   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
6151                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6152                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6153                "    << aaa;");
6154 
6155   verifyFormat(
6156       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6157       "                    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6158 
6159   // Incomplete string literal.
6160   EXPECT_EQ("llvm::errs() << \"\n"
6161             "             << a;",
6162             format("llvm::errs() << \"\n<<a;"));
6163 
6164   verifyFormat("void f() {\n"
6165                "  CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
6166                "      << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
6167                "}");
6168 
6169   // Handle 'endl'.
6170   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
6171                "             << bbbbbbbbbbbbbbbbbbbbbb << endl;");
6172   verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
6173 
6174   // Handle '\n'.
6175   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
6176                "             << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
6177   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
6178                "             << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
6179   verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
6180                "             << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
6181   verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
6182 }
6183 
6184 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
6185   verifyFormat("return out << \"somepacket = {\\n\"\n"
6186                "           << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
6187                "           << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
6188                "           << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
6189                "           << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
6190                "           << \"}\";");
6191 
6192   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
6193                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
6194                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
6195   verifyFormat(
6196       "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
6197       "             << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
6198       "             << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
6199       "             << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
6200       "             << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
6201   verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
6202                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
6203   verifyFormat(
6204       "void f() {\n"
6205       "  llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
6206       "               << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
6207       "}");
6208 
6209   // Breaking before the first "<<" is generally not desirable.
6210   verifyFormat(
6211       "llvm::errs()\n"
6212       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6213       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6214       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6215       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
6216       getLLVMStyleWithColumns(70));
6217   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
6218                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6219                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
6220                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6221                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
6222                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
6223                getLLVMStyleWithColumns(70));
6224 
6225   verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
6226                "           \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
6227                "           \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
6228   verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
6229                "                  \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
6230                "                  \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
6231   verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
6232                "           (aaaa + aaaa);",
6233                getLLVMStyleWithColumns(40));
6234   verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
6235                "                  (aaaaaaa + aaaaa));",
6236                getLLVMStyleWithColumns(40));
6237   verifyFormat(
6238       "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
6239       "                  SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
6240       "                  bbbbbbbbbbbbbbbbbbbbbbb);");
6241 }
6242 
6243 TEST_F(FormatTest, UnderstandsEquals) {
6244   verifyFormat(
6245       "aaaaaaaaaaaaaaaaa =\n"
6246       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6247   verifyFormat(
6248       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6249       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
6250   verifyFormat(
6251       "if (a) {\n"
6252       "  f();\n"
6253       "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6254       "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
6255       "}");
6256 
6257   verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6258                "        100000000 + 10000000) {\n}");
6259 }
6260 
6261 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
6262   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
6263                "    .looooooooooooooooooooooooooooooooooooooongFunction();");
6264 
6265   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
6266                "    ->looooooooooooooooooooooooooooooooooooooongFunction();");
6267 
6268   verifyFormat(
6269       "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
6270       "                                                          Parameter2);");
6271 
6272   verifyFormat(
6273       "ShortObject->shortFunction(\n"
6274       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
6275       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
6276 
6277   verifyFormat("loooooooooooooongFunction(\n"
6278                "    LoooooooooooooongObject->looooooooooooooooongFunction());");
6279 
6280   verifyFormat(
6281       "function(LoooooooooooooooooooooooooooooooooooongObject\n"
6282       "             ->loooooooooooooooooooooooooooooooooooooooongFunction());");
6283 
6284   verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
6285                "    .WillRepeatedly(Return(SomeValue));");
6286   verifyFormat("void f() {\n"
6287                "  EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
6288                "      .Times(2)\n"
6289                "      .WillRepeatedly(Return(SomeValue));\n"
6290                "}");
6291   verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
6292                "    ccccccccccccccccccccccc);");
6293   verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6294                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6295                "          .aaaaa(aaaaa),\n"
6296                "      aaaaaaaaaaaaaaaaaaaaa);");
6297   verifyFormat("void f() {\n"
6298                "  aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6299                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
6300                "}");
6301   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6302                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6303                "    .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6304                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6305                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
6306   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6307                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6308                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6309                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
6310                "}");
6311 
6312   // Here, it is not necessary to wrap at "." or "->".
6313   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
6314                "    aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
6315   verifyFormat(
6316       "aaaaaaaaaaa->aaaaaaaaa(\n"
6317       "    aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6318       "    aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
6319 
6320   verifyFormat(
6321       "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6322       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
6323   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
6324                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
6325   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
6326                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
6327 
6328   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6329                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6330                "    .a();");
6331 
6332   FormatStyle NoBinPacking = getLLVMStyle();
6333   NoBinPacking.BinPackParameters = false;
6334   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
6335                "    .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
6336                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
6337                "                         aaaaaaaaaaaaaaaaaaa,\n"
6338                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6339                NoBinPacking);
6340 
6341   // If there is a subsequent call, change to hanging indentation.
6342   verifyFormat(
6343       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6344       "                         aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
6345       "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6346   verifyFormat(
6347       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6348       "    aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
6349   verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6350                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6351                "                 .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6352   verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6353                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6354                "               .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
6355 }
6356 
6357 TEST_F(FormatTest, WrapsTemplateDeclarations) {
6358   verifyFormat("template <typename T>\n"
6359                "virtual void loooooooooooongFunction(int Param1, int Param2);");
6360   verifyFormat("template <typename T>\n"
6361                "// T should be one of {A, B}.\n"
6362                "virtual void loooooooooooongFunction(int Param1, int Param2);");
6363   verifyFormat(
6364       "template <typename T>\n"
6365       "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
6366   verifyFormat("template <typename T>\n"
6367                "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
6368                "       int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
6369   verifyFormat(
6370       "template <typename T>\n"
6371       "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
6372       "                                      int Paaaaaaaaaaaaaaaaaaaaram2);");
6373   verifyFormat(
6374       "template <typename T>\n"
6375       "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
6376       "                    aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
6377       "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6378   verifyFormat("template <typename T>\n"
6379                "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6380                "    int aaaaaaaaaaaaaaaaaaaaaa);");
6381   verifyFormat(
6382       "template <typename T1, typename T2 = char, typename T3 = char,\n"
6383       "          typename T4 = char>\n"
6384       "void f();");
6385   verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
6386                "          template <typename> class cccccccccccccccccccccc,\n"
6387                "          typename ddddddddddddd>\n"
6388                "class C {};");
6389   verifyFormat(
6390       "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
6391       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6392 
6393   verifyFormat("void f() {\n"
6394                "  a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
6395                "      a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
6396                "}");
6397 
6398   verifyFormat("template <typename T> class C {};");
6399   verifyFormat("template <typename T> void f();");
6400   verifyFormat("template <typename T> void f() {}");
6401   verifyFormat(
6402       "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
6403       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6404       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
6405       "    new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
6406       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6407       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
6408       "        bbbbbbbbbbbbbbbbbbbbbbbb);",
6409       getLLVMStyleWithColumns(72));
6410   EXPECT_EQ("static_cast<A< //\n"
6411             "    B> *>(\n"
6412             "\n"
6413             ");",
6414             format("static_cast<A<//\n"
6415                    "    B>*>(\n"
6416                    "\n"
6417                    "    );"));
6418   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6419                "    const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
6420 
6421   FormatStyle AlwaysBreak = getLLVMStyle();
6422   AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
6423   verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
6424   verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
6425   verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
6426   verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6427                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
6428                "    ccccccccccccccccccccccccccccccccccccccccccccccc);");
6429   verifyFormat("template <template <typename> class Fooooooo,\n"
6430                "          template <typename> class Baaaaaaar>\n"
6431                "struct C {};",
6432                AlwaysBreak);
6433   verifyFormat("template <typename T> // T can be A, B or C.\n"
6434                "struct C {};",
6435                AlwaysBreak);
6436   verifyFormat("template <enum E> class A {\n"
6437                "public:\n"
6438                "  E *f();\n"
6439                "};");
6440 
6441   FormatStyle NeverBreak = getLLVMStyle();
6442   NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No;
6443   verifyFormat("template <typename T> class C {};", NeverBreak);
6444   verifyFormat("template <typename T> void f();", NeverBreak);
6445   verifyFormat("template <typename T> void f() {}", NeverBreak);
6446   verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}",
6447                NeverBreak);
6448   verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6449                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
6450                "    ccccccccccccccccccccccccccccccccccccccccccccccc);",
6451                NeverBreak);
6452   verifyFormat("template <template <typename> class Fooooooo,\n"
6453                "          template <typename> class Baaaaaaar>\n"
6454                "struct C {};",
6455                NeverBreak);
6456   verifyFormat("template <typename T> // T can be A, B or C.\n"
6457                "struct C {};",
6458                NeverBreak);
6459   verifyFormat("template <enum E> class A {\n"
6460                "public:\n"
6461                "  E *f();\n"
6462                "};", NeverBreak);
6463   NeverBreak.PenaltyBreakTemplateDeclaration = 100;
6464   verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}",
6465                NeverBreak);
6466 }
6467 
6468 TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) {
6469   FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
6470   Style.ColumnLimit = 60;
6471   EXPECT_EQ("// Baseline - no comments.\n"
6472             "template <\n"
6473             "    typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
6474             "void f() {}",
6475             format("// Baseline - no comments.\n"
6476                    "template <\n"
6477                    "    typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
6478                    "void f() {}",
6479                    Style));
6480 
6481   EXPECT_EQ("template <\n"
6482             "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  // trailing\n"
6483             "void f() {}",
6484             format("template <\n"
6485                    "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
6486                    "void f() {}",
6487                    Style));
6488 
6489   EXPECT_EQ(
6490       "template <\n"
6491       "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n"
6492       "void f() {}",
6493       format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  /* line */\n"
6494              "void f() {}",
6495              Style));
6496 
6497   EXPECT_EQ(
6498       "template <\n"
6499       "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  // trailing\n"
6500       "                                               // multiline\n"
6501       "void f() {}",
6502       format("template <\n"
6503              "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
6504              "                                              // multiline\n"
6505              "void f() {}",
6506              Style));
6507 
6508   EXPECT_EQ(
6509       "template <typename aaaaaaaaaa<\n"
6510       "    bbbbbbbbbbbb>::value>  // trailing loooong\n"
6511       "void f() {}",
6512       format(
6513           "template <\n"
6514           "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n"
6515           "void f() {}",
6516           Style));
6517 }
6518 
6519 TEST_F(FormatTest, WrapsTemplateParameters) {
6520   FormatStyle Style = getLLVMStyle();
6521   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
6522   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
6523   verifyFormat(
6524       "template <typename... a> struct q {};\n"
6525       "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
6526       "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
6527       "    y;",
6528       Style);
6529   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
6530   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
6531   verifyFormat(
6532       "template <typename... a> struct r {};\n"
6533       "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
6534       "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
6535       "    y;",
6536       Style);
6537   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
6538   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
6539   verifyFormat(
6540       "template <typename... a> struct s {};\n"
6541       "extern s<\n"
6542       "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
6543       "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
6544       "    y;",
6545       Style);
6546   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
6547   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
6548   verifyFormat(
6549       "template <typename... a> struct t {};\n"
6550       "extern t<\n"
6551       "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
6552       "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
6553       "    y;",
6554       Style);
6555 }
6556 
6557 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
6558   verifyFormat(
6559       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6560       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6561   verifyFormat(
6562       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6563       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6564       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
6565 
6566   // FIXME: Should we have the extra indent after the second break?
6567   verifyFormat(
6568       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6569       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6570       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6571 
6572   verifyFormat(
6573       "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
6574       "                    cccccccccccccccccccccccccccccccccccccccccccccc());");
6575 
6576   // Breaking at nested name specifiers is generally not desirable.
6577   verifyFormat(
6578       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6579       "    aaaaaaaaaaaaaaaaaaaaaaa);");
6580 
6581   verifyFormat(
6582       "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
6583       "                   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6584       "                       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6585       "                   aaaaaaaaaaaaaaaaaaaaa);",
6586       getLLVMStyleWithColumns(74));
6587 
6588   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6589                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6590                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6591 }
6592 
6593 TEST_F(FormatTest, UnderstandsTemplateParameters) {
6594   verifyFormat("A<int> a;");
6595   verifyFormat("A<A<A<int>>> a;");
6596   verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
6597   verifyFormat("bool x = a < 1 || 2 > a;");
6598   verifyFormat("bool x = 5 < f<int>();");
6599   verifyFormat("bool x = f<int>() > 5;");
6600   verifyFormat("bool x = 5 < a<int>::x;");
6601   verifyFormat("bool x = a < 4 ? a > 2 : false;");
6602   verifyFormat("bool x = f() ? a < 2 : a > 2;");
6603 
6604   verifyGoogleFormat("A<A<int>> a;");
6605   verifyGoogleFormat("A<A<A<int>>> a;");
6606   verifyGoogleFormat("A<A<A<A<int>>>> a;");
6607   verifyGoogleFormat("A<A<int> > a;");
6608   verifyGoogleFormat("A<A<A<int> > > a;");
6609   verifyGoogleFormat("A<A<A<A<int> > > > a;");
6610   verifyGoogleFormat("A<::A<int>> a;");
6611   verifyGoogleFormat("A<::A> a;");
6612   verifyGoogleFormat("A< ::A> a;");
6613   verifyGoogleFormat("A< ::A<int> > a;");
6614   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
6615   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
6616   EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
6617   EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
6618   EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
6619             format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
6620 
6621   verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
6622 
6623   verifyFormat("test >> a >> b;");
6624   verifyFormat("test << a >> b;");
6625 
6626   verifyFormat("f<int>();");
6627   verifyFormat("template <typename T> void f() {}");
6628   verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
6629   verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
6630                "sizeof(char)>::type>;");
6631   verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
6632   verifyFormat("f(a.operator()<A>());");
6633   verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6634                "      .template operator()<A>());",
6635                getLLVMStyleWithColumns(35));
6636 
6637   // Not template parameters.
6638   verifyFormat("return a < b && c > d;");
6639   verifyFormat("void f() {\n"
6640                "  while (a < b && c > d) {\n"
6641                "  }\n"
6642                "}");
6643   verifyFormat("template <typename... Types>\n"
6644                "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
6645 
6646   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6647                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
6648                getLLVMStyleWithColumns(60));
6649   verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
6650   verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
6651   verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
6652 }
6653 
6654 TEST_F(FormatTest, BitshiftOperatorWidth) {
6655   EXPECT_EQ("int a = 1 << 2; /* foo\n"
6656             "                   bar */",
6657             format("int    a=1<<2;  /* foo\n"
6658                    "                   bar */"));
6659 
6660   EXPECT_EQ("int b = 256 >> 1; /* foo\n"
6661             "                     bar */",
6662             format("int  b  =256>>1 ;  /* foo\n"
6663                    "                      bar */"));
6664 }
6665 
6666 TEST_F(FormatTest, UnderstandsBinaryOperators) {
6667   verifyFormat("COMPARE(a, ==, b);");
6668   verifyFormat("auto s = sizeof...(Ts) - 1;");
6669 }
6670 
6671 TEST_F(FormatTest, UnderstandsPointersToMembers) {
6672   verifyFormat("int A::*x;");
6673   verifyFormat("int (S::*func)(void *);");
6674   verifyFormat("void f() { int (S::*func)(void *); }");
6675   verifyFormat("typedef bool *(Class::*Member)() const;");
6676   verifyFormat("void f() {\n"
6677                "  (a->*f)();\n"
6678                "  a->*x;\n"
6679                "  (a.*f)();\n"
6680                "  ((*a).*f)();\n"
6681                "  a.*x;\n"
6682                "}");
6683   verifyFormat("void f() {\n"
6684                "  (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
6685                "      aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
6686                "}");
6687   verifyFormat(
6688       "(aaaaaaaaaa->*bbbbbbb)(\n"
6689       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
6690   FormatStyle Style = getLLVMStyle();
6691   Style.PointerAlignment = FormatStyle::PAS_Left;
6692   verifyFormat("typedef bool* (Class::*Member)() const;", Style);
6693 }
6694 
6695 TEST_F(FormatTest, UnderstandsUnaryOperators) {
6696   verifyFormat("int a = -2;");
6697   verifyFormat("f(-1, -2, -3);");
6698   verifyFormat("a[-1] = 5;");
6699   verifyFormat("int a = 5 + -2;");
6700   verifyFormat("if (i == -1) {\n}");
6701   verifyFormat("if (i != -1) {\n}");
6702   verifyFormat("if (i > -1) {\n}");
6703   verifyFormat("if (i < -1) {\n}");
6704   verifyFormat("++(a->f());");
6705   verifyFormat("--(a->f());");
6706   verifyFormat("(a->f())++;");
6707   verifyFormat("a[42]++;");
6708   verifyFormat("if (!(a->f())) {\n}");
6709   verifyFormat("if (!+i) {\n}");
6710   verifyFormat("~&a;");
6711 
6712   verifyFormat("a-- > b;");
6713   verifyFormat("b ? -a : c;");
6714   verifyFormat("n * sizeof char16;");
6715   verifyFormat("n * alignof char16;", getGoogleStyle());
6716   verifyFormat("sizeof(char);");
6717   verifyFormat("alignof(char);", getGoogleStyle());
6718 
6719   verifyFormat("return -1;");
6720   verifyFormat("switch (a) {\n"
6721                "case -1:\n"
6722                "  break;\n"
6723                "}");
6724   verifyFormat("#define X -1");
6725   verifyFormat("#define X -kConstant");
6726 
6727   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
6728   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
6729 
6730   verifyFormat("int a = /* confusing comment */ -1;");
6731   // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
6732   verifyFormat("int a = i /* confusing comment */++;");
6733 }
6734 
6735 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
6736   verifyFormat("if (!aaaaaaaaaa( // break\n"
6737                "        aaaaa)) {\n"
6738                "}");
6739   verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
6740                "    aaaaa));");
6741   verifyFormat("*aaa = aaaaaaa( // break\n"
6742                "    bbbbbb);");
6743 }
6744 
6745 TEST_F(FormatTest, UnderstandsOverloadedOperators) {
6746   verifyFormat("bool operator<();");
6747   verifyFormat("bool operator>();");
6748   verifyFormat("bool operator=();");
6749   verifyFormat("bool operator==();");
6750   verifyFormat("bool operator!=();");
6751   verifyFormat("int operator+();");
6752   verifyFormat("int operator++();");
6753   verifyFormat("int operator++(int) volatile noexcept;");
6754   verifyFormat("bool operator,();");
6755   verifyFormat("bool operator();");
6756   verifyFormat("bool operator()();");
6757   verifyFormat("bool operator[]();");
6758   verifyFormat("operator bool();");
6759   verifyFormat("operator int();");
6760   verifyFormat("operator void *();");
6761   verifyFormat("operator SomeType<int>();");
6762   verifyFormat("operator SomeType<int, int>();");
6763   verifyFormat("operator SomeType<SomeType<int>>();");
6764   verifyFormat("void *operator new(std::size_t size);");
6765   verifyFormat("void *operator new[](std::size_t size);");
6766   verifyFormat("void operator delete(void *ptr);");
6767   verifyFormat("void operator delete[](void *ptr);");
6768   verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
6769                "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
6770   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
6771                "    aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
6772 
6773   verifyFormat(
6774       "ostream &operator<<(ostream &OutputStream,\n"
6775       "                    SomeReallyLongType WithSomeReallyLongValue);");
6776   verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
6777                "               const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
6778                "  return left.group < right.group;\n"
6779                "}");
6780   verifyFormat("SomeType &operator=(const SomeType &S);");
6781   verifyFormat("f.template operator()<int>();");
6782 
6783   verifyGoogleFormat("operator void*();");
6784   verifyGoogleFormat("operator SomeType<SomeType<int>>();");
6785   verifyGoogleFormat("operator ::A();");
6786 
6787   verifyFormat("using A::operator+;");
6788   verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
6789                "int i;");
6790 }
6791 
6792 TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
6793   verifyFormat("Deleted &operator=(const Deleted &) & = default;");
6794   verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
6795   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
6796   verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
6797   verifyFormat("Deleted &operator=(const Deleted &) &;");
6798   verifyFormat("Deleted &operator=(const Deleted &) &&;");
6799   verifyFormat("SomeType MemberFunction(const Deleted &) &;");
6800   verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
6801   verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
6802   verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
6803   verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
6804   verifyFormat("void Fn(T const &) const &;");
6805   verifyFormat("void Fn(T const volatile &&) const volatile &&;");
6806   verifyFormat("template <typename T>\n"
6807                "void F(T) && = delete;",
6808                getGoogleStyle());
6809 
6810   FormatStyle AlignLeft = getLLVMStyle();
6811   AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
6812   verifyFormat("void A::b() && {}", AlignLeft);
6813   verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
6814   verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
6815                AlignLeft);
6816   verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
6817   verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
6818   verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
6819   verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
6820   verifyFormat("auto Function(T) & -> void {}", AlignLeft);
6821   verifyFormat("auto Function(T) & -> void;", AlignLeft);
6822   verifyFormat("void Fn(T const&) const&;", AlignLeft);
6823   verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
6824 
6825   FormatStyle Spaces = getLLVMStyle();
6826   Spaces.SpacesInCStyleCastParentheses = true;
6827   verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
6828   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
6829   verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
6830   verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
6831 
6832   Spaces.SpacesInCStyleCastParentheses = false;
6833   Spaces.SpacesInParentheses = true;
6834   verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
6835   verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
6836   verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
6837   verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
6838 }
6839 
6840 TEST_F(FormatTest, UnderstandsNewAndDelete) {
6841   verifyFormat("void f() {\n"
6842                "  A *a = new A;\n"
6843                "  A *a = new (placement) A;\n"
6844                "  delete a;\n"
6845                "  delete (A *)a;\n"
6846                "}");
6847   verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6848                "    typename aaaaaaaaaaaaaaaaaaaaaaaa();");
6849   verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6850                "    new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6851                "        typename aaaaaaaaaaaaaaaaaaaaaaaa();");
6852   verifyFormat("delete[] h->p;");
6853 }
6854 
6855 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
6856   verifyFormat("int *f(int *a) {}");
6857   verifyFormat("int main(int argc, char **argv) {}");
6858   verifyFormat("Test::Test(int b) : a(b * b) {}");
6859   verifyIndependentOfContext("f(a, *a);");
6860   verifyFormat("void g() { f(*a); }");
6861   verifyIndependentOfContext("int a = b * 10;");
6862   verifyIndependentOfContext("int a = 10 * b;");
6863   verifyIndependentOfContext("int a = b * c;");
6864   verifyIndependentOfContext("int a += b * c;");
6865   verifyIndependentOfContext("int a -= b * c;");
6866   verifyIndependentOfContext("int a *= b * c;");
6867   verifyIndependentOfContext("int a /= b * c;");
6868   verifyIndependentOfContext("int a = *b;");
6869   verifyIndependentOfContext("int a = *b * c;");
6870   verifyIndependentOfContext("int a = b * *c;");
6871   verifyIndependentOfContext("int a = b * (10);");
6872   verifyIndependentOfContext("S << b * (10);");
6873   verifyIndependentOfContext("return 10 * b;");
6874   verifyIndependentOfContext("return *b * *c;");
6875   verifyIndependentOfContext("return a & ~b;");
6876   verifyIndependentOfContext("f(b ? *c : *d);");
6877   verifyIndependentOfContext("int a = b ? *c : *d;");
6878   verifyIndependentOfContext("*b = a;");
6879   verifyIndependentOfContext("a * ~b;");
6880   verifyIndependentOfContext("a * !b;");
6881   verifyIndependentOfContext("a * +b;");
6882   verifyIndependentOfContext("a * -b;");
6883   verifyIndependentOfContext("a * ++b;");
6884   verifyIndependentOfContext("a * --b;");
6885   verifyIndependentOfContext("a[4] * b;");
6886   verifyIndependentOfContext("a[a * a] = 1;");
6887   verifyIndependentOfContext("f() * b;");
6888   verifyIndependentOfContext("a * [self dostuff];");
6889   verifyIndependentOfContext("int x = a * (a + b);");
6890   verifyIndependentOfContext("(a *)(a + b);");
6891   verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
6892   verifyIndependentOfContext("int *pa = (int *)&a;");
6893   verifyIndependentOfContext("return sizeof(int **);");
6894   verifyIndependentOfContext("return sizeof(int ******);");
6895   verifyIndependentOfContext("return (int **&)a;");
6896   verifyIndependentOfContext("f((*PointerToArray)[10]);");
6897   verifyFormat("void f(Type (*parameter)[10]) {}");
6898   verifyFormat("void f(Type (&parameter)[10]) {}");
6899   verifyGoogleFormat("return sizeof(int**);");
6900   verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
6901   verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
6902   verifyFormat("auto a = [](int **&, int ***) {};");
6903   verifyFormat("auto PointerBinding = [](const char *S) {};");
6904   verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
6905   verifyFormat("[](const decltype(*a) &value) {}");
6906   verifyFormat("decltype(a * b) F();");
6907   verifyFormat("#define MACRO() [](A *a) { return 1; }");
6908   verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
6909   verifyIndependentOfContext("typedef void (*f)(int *a);");
6910   verifyIndependentOfContext("int i{a * b};");
6911   verifyIndependentOfContext("aaa && aaa->f();");
6912   verifyIndependentOfContext("int x = ~*p;");
6913   verifyFormat("Constructor() : a(a), area(width * height) {}");
6914   verifyFormat("Constructor() : a(a), area(a, width * height) {}");
6915   verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
6916   verifyFormat("void f() { f(a, c * d); }");
6917   verifyFormat("void f() { f(new a(), c * d); }");
6918   verifyFormat("void f(const MyOverride &override);");
6919   verifyFormat("void f(const MyFinal &final);");
6920   verifyIndependentOfContext("bool a = f() && override.f();");
6921   verifyIndependentOfContext("bool a = f() && final.f();");
6922 
6923   verifyIndependentOfContext("InvalidRegions[*R] = 0;");
6924 
6925   verifyIndependentOfContext("A<int *> a;");
6926   verifyIndependentOfContext("A<int **> a;");
6927   verifyIndependentOfContext("A<int *, int *> a;");
6928   verifyIndependentOfContext("A<int *[]> a;");
6929   verifyIndependentOfContext(
6930       "const char *const p = reinterpret_cast<const char *const>(q);");
6931   verifyIndependentOfContext("A<int **, int **> a;");
6932   verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
6933   verifyFormat("for (char **a = b; *a; ++a) {\n}");
6934   verifyFormat("for (; a && b;) {\n}");
6935   verifyFormat("bool foo = true && [] { return false; }();");
6936 
6937   verifyFormat(
6938       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6939       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6940 
6941   verifyGoogleFormat("int const* a = &b;");
6942   verifyGoogleFormat("**outparam = 1;");
6943   verifyGoogleFormat("*outparam = a * b;");
6944   verifyGoogleFormat("int main(int argc, char** argv) {}");
6945   verifyGoogleFormat("A<int*> a;");
6946   verifyGoogleFormat("A<int**> a;");
6947   verifyGoogleFormat("A<int*, int*> a;");
6948   verifyGoogleFormat("A<int**, int**> a;");
6949   verifyGoogleFormat("f(b ? *c : *d);");
6950   verifyGoogleFormat("int a = b ? *c : *d;");
6951   verifyGoogleFormat("Type* t = **x;");
6952   verifyGoogleFormat("Type* t = *++*x;");
6953   verifyGoogleFormat("*++*x;");
6954   verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
6955   verifyGoogleFormat("Type* t = x++ * y;");
6956   verifyGoogleFormat(
6957       "const char* const p = reinterpret_cast<const char* const>(q);");
6958   verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
6959   verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
6960   verifyGoogleFormat("template <typename T>\n"
6961                      "void f(int i = 0, SomeType** temps = NULL);");
6962 
6963   FormatStyle Left = getLLVMStyle();
6964   Left.PointerAlignment = FormatStyle::PAS_Left;
6965   verifyFormat("x = *a(x) = *a(y);", Left);
6966   verifyFormat("for (;; *a = b) {\n}", Left);
6967   verifyFormat("return *this += 1;", Left);
6968   verifyFormat("throw *x;", Left);
6969   verifyFormat("delete *x;", Left);
6970   verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
6971   verifyFormat("[](const decltype(*a)* ptr) {}", Left);
6972   verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
6973 
6974   verifyIndependentOfContext("a = *(x + y);");
6975   verifyIndependentOfContext("a = &(x + y);");
6976   verifyIndependentOfContext("*(x + y).call();");
6977   verifyIndependentOfContext("&(x + y)->call();");
6978   verifyFormat("void f() { &(*I).first; }");
6979 
6980   verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
6981   verifyFormat(
6982       "int *MyValues = {\n"
6983       "    *A, // Operator detection might be confused by the '{'\n"
6984       "    *BB // Operator detection might be confused by previous comment\n"
6985       "};");
6986 
6987   verifyIndependentOfContext("if (int *a = &b)");
6988   verifyIndependentOfContext("if (int &a = *b)");
6989   verifyIndependentOfContext("if (a & b[i])");
6990   verifyIndependentOfContext("if constexpr (a & b[i])");
6991   verifyIndependentOfContext("if CONSTEXPR (a & b[i])");
6992   verifyIndependentOfContext("if (a * (b * c))");
6993   verifyIndependentOfContext("if constexpr (a * (b * c))");
6994   verifyIndependentOfContext("if CONSTEXPR (a * (b * c))");
6995   verifyIndependentOfContext("if (a::b::c::d & b[i])");
6996   verifyIndependentOfContext("if (*b[i])");
6997   verifyIndependentOfContext("if (int *a = (&b))");
6998   verifyIndependentOfContext("while (int *a = &b)");
6999   verifyIndependentOfContext("while (a * (b * c))");
7000   verifyIndependentOfContext("size = sizeof *a;");
7001   verifyIndependentOfContext("if (a && (b = c))");
7002   verifyFormat("void f() {\n"
7003                "  for (const int &v : Values) {\n"
7004                "  }\n"
7005                "}");
7006   verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
7007   verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
7008   verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
7009 
7010   verifyFormat("#define A (!a * b)");
7011   verifyFormat("#define MACRO     \\\n"
7012                "  int *i = a * b; \\\n"
7013                "  void f(a *b);",
7014                getLLVMStyleWithColumns(19));
7015 
7016   verifyIndependentOfContext("A = new SomeType *[Length];");
7017   verifyIndependentOfContext("A = new SomeType *[Length]();");
7018   verifyIndependentOfContext("T **t = new T *;");
7019   verifyIndependentOfContext("T **t = new T *();");
7020   verifyGoogleFormat("A = new SomeType*[Length]();");
7021   verifyGoogleFormat("A = new SomeType*[Length];");
7022   verifyGoogleFormat("T** t = new T*;");
7023   verifyGoogleFormat("T** t = new T*();");
7024 
7025   verifyFormat("STATIC_ASSERT((a & b) == 0);");
7026   verifyFormat("STATIC_ASSERT(0 == (a & b));");
7027   verifyFormat("template <bool a, bool b> "
7028                "typename t::if<x && y>::type f() {}");
7029   verifyFormat("template <int *y> f() {}");
7030   verifyFormat("vector<int *> v;");
7031   verifyFormat("vector<int *const> v;");
7032   verifyFormat("vector<int *const **const *> v;");
7033   verifyFormat("vector<int *volatile> v;");
7034   verifyFormat("vector<a * b> v;");
7035   verifyFormat("foo<b && false>();");
7036   verifyFormat("foo<b & 1>();");
7037   verifyFormat("decltype(*::std::declval<const T &>()) void F();");
7038   verifyFormat(
7039       "template <class T, class = typename std::enable_if<\n"
7040       "                       std::is_integral<T>::value &&\n"
7041       "                       (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
7042       "void F();",
7043       getLLVMStyleWithColumns(70));
7044   verifyFormat(
7045       "template <class T,\n"
7046       "          class = typename std::enable_if<\n"
7047       "              std::is_integral<T>::value &&\n"
7048       "              (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
7049       "          class U>\n"
7050       "void F();",
7051       getLLVMStyleWithColumns(70));
7052   verifyFormat(
7053       "template <class T,\n"
7054       "          class = typename ::std::enable_if<\n"
7055       "              ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
7056       "void F();",
7057       getGoogleStyleWithColumns(68));
7058 
7059   verifyIndependentOfContext("MACRO(int *i);");
7060   verifyIndependentOfContext("MACRO(auto *a);");
7061   verifyIndependentOfContext("MACRO(const A *a);");
7062   verifyIndependentOfContext("MACRO(A *const a);");
7063   verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
7064   verifyFormat("void f() { f(float{1}, a * a); }");
7065   // FIXME: Is there a way to make this work?
7066   // verifyIndependentOfContext("MACRO(A *a);");
7067 
7068   verifyFormat("DatumHandle const *operator->() const { return input_; }");
7069   verifyFormat("return options != nullptr && operator==(*options);");
7070 
7071   EXPECT_EQ("#define OP(x)                                    \\\n"
7072             "  ostream &operator<<(ostream &s, const A &a) {  \\\n"
7073             "    return s << a.DebugString();                 \\\n"
7074             "  }",
7075             format("#define OP(x) \\\n"
7076                    "  ostream &operator<<(ostream &s, const A &a) { \\\n"
7077                    "    return s << a.DebugString(); \\\n"
7078                    "  }",
7079                    getLLVMStyleWithColumns(50)));
7080 
7081   // FIXME: We cannot handle this case yet; we might be able to figure out that
7082   // foo<x> d > v; doesn't make sense.
7083   verifyFormat("foo<a<b && c> d> v;");
7084 
7085   FormatStyle PointerMiddle = getLLVMStyle();
7086   PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
7087   verifyFormat("delete *x;", PointerMiddle);
7088   verifyFormat("int * x;", PointerMiddle);
7089   verifyFormat("int *[] x;", PointerMiddle);
7090   verifyFormat("template <int * y> f() {}", PointerMiddle);
7091   verifyFormat("int * f(int * a) {}", PointerMiddle);
7092   verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
7093   verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
7094   verifyFormat("A<int *> a;", PointerMiddle);
7095   verifyFormat("A<int **> a;", PointerMiddle);
7096   verifyFormat("A<int *, int *> a;", PointerMiddle);
7097   verifyFormat("A<int *[]> a;", PointerMiddle);
7098   verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
7099   verifyFormat("A = new SomeType *[Length];", PointerMiddle);
7100   verifyFormat("T ** t = new T *;", PointerMiddle);
7101 
7102   // Member function reference qualifiers aren't binary operators.
7103   verifyFormat("string // break\n"
7104                "operator()() & {}");
7105   verifyFormat("string // break\n"
7106                "operator()() && {}");
7107   verifyGoogleFormat("template <typename T>\n"
7108                      "auto x() & -> int {}");
7109 }
7110 
7111 TEST_F(FormatTest, UnderstandsAttributes) {
7112   verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
7113   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
7114                "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
7115   FormatStyle AfterType = getLLVMStyle();
7116   AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
7117   verifyFormat("__attribute__((nodebug)) void\n"
7118                "foo() {}\n",
7119                AfterType);
7120 }
7121 
7122 TEST_F(FormatTest, UnderstandsSquareAttributes) {
7123   verifyFormat("SomeType s [[unused]] (InitValue);");
7124   verifyFormat("SomeType s [[gnu::unused]] (InitValue);");
7125   verifyFormat("SomeType s [[using gnu: unused]] (InitValue);");
7126   verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}");
7127   verifyFormat("void f() [[deprecated(\"so sorry\")]];");
7128   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7129                "    [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);");
7130 
7131   // Make sure we do not mistake attributes for array subscripts.
7132   verifyFormat("int a() {}\n"
7133                "[[unused]] int b() {}\n");
7134   verifyFormat("NSArray *arr;\n"
7135                "arr[[Foo() bar]];");
7136 
7137   // On the other hand, we still need to correctly find array subscripts.
7138   verifyFormat("int a = std::vector<int>{1, 2, 3}[0];");
7139 
7140   // Make sure that we do not mistake Objective-C method inside array literals
7141   // as attributes, even if those method names are also keywords.
7142   verifyFormat("@[ [foo bar] ];");
7143   verifyFormat("@[ [NSArray class] ];");
7144   verifyFormat("@[ [foo enum] ];");
7145 
7146   // Make sure we do not parse attributes as lambda introducers.
7147   FormatStyle MultiLineFunctions = getLLVMStyle();
7148   MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
7149   verifyFormat("[[unused]] int b() {\n"
7150                "  return 42;\n"
7151                "}\n",
7152                MultiLineFunctions);
7153 }
7154 
7155 TEST_F(FormatTest, UnderstandsEllipsis) {
7156   verifyFormat("int printf(const char *fmt, ...);");
7157   verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
7158   verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
7159 
7160   FormatStyle PointersLeft = getLLVMStyle();
7161   PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
7162   verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
7163 }
7164 
7165 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
7166   EXPECT_EQ("int *a;\n"
7167             "int *a;\n"
7168             "int *a;",
7169             format("int *a;\n"
7170                    "int* a;\n"
7171                    "int *a;",
7172                    getGoogleStyle()));
7173   EXPECT_EQ("int* a;\n"
7174             "int* a;\n"
7175             "int* a;",
7176             format("int* a;\n"
7177                    "int* a;\n"
7178                    "int *a;",
7179                    getGoogleStyle()));
7180   EXPECT_EQ("int *a;\n"
7181             "int *a;\n"
7182             "int *a;",
7183             format("int *a;\n"
7184                    "int * a;\n"
7185                    "int *  a;",
7186                    getGoogleStyle()));
7187   EXPECT_EQ("auto x = [] {\n"
7188             "  int *a;\n"
7189             "  int *a;\n"
7190             "  int *a;\n"
7191             "};",
7192             format("auto x=[]{int *a;\n"
7193                    "int * a;\n"
7194                    "int *  a;};",
7195                    getGoogleStyle()));
7196 }
7197 
7198 TEST_F(FormatTest, UnderstandsRvalueReferences) {
7199   verifyFormat("int f(int &&a) {}");
7200   verifyFormat("int f(int a, char &&b) {}");
7201   verifyFormat("void f() { int &&a = b; }");
7202   verifyGoogleFormat("int f(int a, char&& b) {}");
7203   verifyGoogleFormat("void f() { int&& a = b; }");
7204 
7205   verifyIndependentOfContext("A<int &&> a;");
7206   verifyIndependentOfContext("A<int &&, int &&> a;");
7207   verifyGoogleFormat("A<int&&> a;");
7208   verifyGoogleFormat("A<int&&, int&&> a;");
7209 
7210   // Not rvalue references:
7211   verifyFormat("template <bool B, bool C> class A {\n"
7212                "  static_assert(B && C, \"Something is wrong\");\n"
7213                "};");
7214   verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
7215   verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
7216   verifyFormat("#define A(a, b) (a && b)");
7217 }
7218 
7219 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
7220   verifyFormat("void f() {\n"
7221                "  x[aaaaaaaaa -\n"
7222                "    b] = 23;\n"
7223                "}",
7224                getLLVMStyleWithColumns(15));
7225 }
7226 
7227 TEST_F(FormatTest, FormatsCasts) {
7228   verifyFormat("Type *A = static_cast<Type *>(P);");
7229   verifyFormat("Type *A = (Type *)P;");
7230   verifyFormat("Type *A = (vector<Type *, int *>)P;");
7231   verifyFormat("int a = (int)(2.0f);");
7232   verifyFormat("int a = (int)2.0f;");
7233   verifyFormat("x[(int32)y];");
7234   verifyFormat("x = (int32)y;");
7235   verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
7236   verifyFormat("int a = (int)*b;");
7237   verifyFormat("int a = (int)2.0f;");
7238   verifyFormat("int a = (int)~0;");
7239   verifyFormat("int a = (int)++a;");
7240   verifyFormat("int a = (int)sizeof(int);");
7241   verifyFormat("int a = (int)+2;");
7242   verifyFormat("my_int a = (my_int)2.0f;");
7243   verifyFormat("my_int a = (my_int)sizeof(int);");
7244   verifyFormat("return (my_int)aaa;");
7245   verifyFormat("#define x ((int)-1)");
7246   verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
7247   verifyFormat("#define p(q) ((int *)&q)");
7248   verifyFormat("fn(a)(b) + 1;");
7249 
7250   verifyFormat("void f() { my_int a = (my_int)*b; }");
7251   verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
7252   verifyFormat("my_int a = (my_int)~0;");
7253   verifyFormat("my_int a = (my_int)++a;");
7254   verifyFormat("my_int a = (my_int)-2;");
7255   verifyFormat("my_int a = (my_int)1;");
7256   verifyFormat("my_int a = (my_int *)1;");
7257   verifyFormat("my_int a = (const my_int)-1;");
7258   verifyFormat("my_int a = (const my_int *)-1;");
7259   verifyFormat("my_int a = (my_int)(my_int)-1;");
7260   verifyFormat("my_int a = (ns::my_int)-2;");
7261   verifyFormat("case (my_int)ONE:");
7262   verifyFormat("auto x = (X)this;");
7263 
7264   // FIXME: single value wrapped with paren will be treated as cast.
7265   verifyFormat("void f(int i = (kValue)*kMask) {}");
7266 
7267   verifyFormat("{ (void)F; }");
7268 
7269   // Don't break after a cast's
7270   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7271                "    (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
7272                "                                   bbbbbbbbbbbbbbbbbbbbbb);");
7273 
7274   // These are not casts.
7275   verifyFormat("void f(int *) {}");
7276   verifyFormat("f(foo)->b;");
7277   verifyFormat("f(foo).b;");
7278   verifyFormat("f(foo)(b);");
7279   verifyFormat("f(foo)[b];");
7280   verifyFormat("[](foo) { return 4; }(bar);");
7281   verifyFormat("(*funptr)(foo)[4];");
7282   verifyFormat("funptrs[4](foo)[4];");
7283   verifyFormat("void f(int *);");
7284   verifyFormat("void f(int *) = 0;");
7285   verifyFormat("void f(SmallVector<int>) {}");
7286   verifyFormat("void f(SmallVector<int>);");
7287   verifyFormat("void f(SmallVector<int>) = 0;");
7288   verifyFormat("void f(int i = (kA * kB) & kMask) {}");
7289   verifyFormat("int a = sizeof(int) * b;");
7290   verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
7291   verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
7292   verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
7293   verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
7294 
7295   // These are not casts, but at some point were confused with casts.
7296   verifyFormat("virtual void foo(int *) override;");
7297   verifyFormat("virtual void foo(char &) const;");
7298   verifyFormat("virtual void foo(int *a, char *) const;");
7299   verifyFormat("int a = sizeof(int *) + b;");
7300   verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
7301   verifyFormat("bool b = f(g<int>) && c;");
7302   verifyFormat("typedef void (*f)(int i) func;");
7303 
7304   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
7305                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
7306   // FIXME: The indentation here is not ideal.
7307   verifyFormat(
7308       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7309       "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
7310       "        [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
7311 }
7312 
7313 TEST_F(FormatTest, FormatsFunctionTypes) {
7314   verifyFormat("A<bool()> a;");
7315   verifyFormat("A<SomeType()> a;");
7316   verifyFormat("A<void (*)(int, std::string)> a;");
7317   verifyFormat("A<void *(int)>;");
7318   verifyFormat("void *(*a)(int *, SomeType *);");
7319   verifyFormat("int (*func)(void *);");
7320   verifyFormat("void f() { int (*func)(void *); }");
7321   verifyFormat("template <class CallbackClass>\n"
7322                "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
7323 
7324   verifyGoogleFormat("A<void*(int*, SomeType*)>;");
7325   verifyGoogleFormat("void* (*a)(int);");
7326   verifyGoogleFormat(
7327       "template <class CallbackClass>\n"
7328       "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
7329 
7330   // Other constructs can look somewhat like function types:
7331   verifyFormat("A<sizeof(*x)> a;");
7332   verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
7333   verifyFormat("some_var = function(*some_pointer_var)[0];");
7334   verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
7335   verifyFormat("int x = f(&h)();");
7336   verifyFormat("returnsFunction(&param1, &param2)(param);");
7337   verifyFormat("std::function<\n"
7338                "    LooooooooooongTemplatedType<\n"
7339                "        SomeType>*(\n"
7340                "        LooooooooooooooooongType type)>\n"
7341                "    function;",
7342                getGoogleStyleWithColumns(40));
7343 }
7344 
7345 TEST_F(FormatTest, FormatsPointersToArrayTypes) {
7346   verifyFormat("A (*foo_)[6];");
7347   verifyFormat("vector<int> (*foo_)[6];");
7348 }
7349 
7350 TEST_F(FormatTest, BreaksLongVariableDeclarations) {
7351   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7352                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
7353   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
7354                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
7355   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7356                "    *LoooooooooooooooooooooooooooooooooooooooongVariable;");
7357 
7358   // Different ways of ()-initializiation.
7359   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7360                "    LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
7361   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7362                "    LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
7363   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7364                "    LoooooooooooooooooooooooooooooooooooooooongVariable({});");
7365   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7366                "    LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
7367 
7368   // Lambdas should not confuse the variable declaration heuristic.
7369   verifyFormat("LooooooooooooooooongType\n"
7370                "    variable(nullptr, [](A *a) {});",
7371                getLLVMStyleWithColumns(40));
7372 }
7373 
7374 TEST_F(FormatTest, BreaksLongDeclarations) {
7375   verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
7376                "    AnotherNameForTheLongType;");
7377   verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
7378                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7379   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7380                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
7381   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
7382                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
7383   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7384                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7385   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
7386                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7387   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
7388                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7389   verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
7390                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7391   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7392                "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
7393   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7394                "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
7395   FormatStyle Indented = getLLVMStyle();
7396   Indented.IndentWrappedFunctionNames = true;
7397   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7398                "    LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
7399                Indented);
7400   verifyFormat(
7401       "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7402       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
7403       Indented);
7404   verifyFormat(
7405       "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
7406       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
7407       Indented);
7408   verifyFormat(
7409       "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
7410       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
7411       Indented);
7412 
7413   // FIXME: Without the comment, this breaks after "(".
7414   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType  // break\n"
7415                "    (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
7416                getGoogleStyle());
7417 
7418   verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
7419                "                  int LoooooooooooooooooooongParam2) {}");
7420   verifyFormat(
7421       "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
7422       "                                   SourceLocation L, IdentifierIn *II,\n"
7423       "                                   Type *T) {}");
7424   verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
7425                "ReallyReaaallyLongFunctionName(\n"
7426                "    const std::string &SomeParameter,\n"
7427                "    const SomeType<string, SomeOtherTemplateParameter>\n"
7428                "        &ReallyReallyLongParameterName,\n"
7429                "    const SomeType<string, SomeOtherTemplateParameter>\n"
7430                "        &AnotherLongParameterName) {}");
7431   verifyFormat("template <typename A>\n"
7432                "SomeLoooooooooooooooooooooongType<\n"
7433                "    typename some_namespace::SomeOtherType<A>::Type>\n"
7434                "Function() {}");
7435 
7436   verifyGoogleFormat(
7437       "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
7438       "    aaaaaaaaaaaaaaaaaaaaaaa;");
7439   verifyGoogleFormat(
7440       "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
7441       "                                   SourceLocation L) {}");
7442   verifyGoogleFormat(
7443       "some_namespace::LongReturnType\n"
7444       "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
7445       "    int first_long_parameter, int second_parameter) {}");
7446 
7447   verifyGoogleFormat("template <typename T>\n"
7448                      "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
7449                      "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
7450   verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7451                      "                   int aaaaaaaaaaaaaaaaaaaaaaa);");
7452 
7453   verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
7454                "    const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7455                "        *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7456   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7457                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
7458                "        aaaaaaaaaaaaaaaaaaaaaaaa);");
7459   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7460                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
7461                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
7462                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7463 
7464   verifyFormat("template <typename T> // Templates on own line.\n"
7465                "static int            // Some comment.\n"
7466                "MyFunction(int a);",
7467                getLLVMStyle());
7468 }
7469 
7470 TEST_F(FormatTest, FormatsArrays) {
7471   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
7472                "                         [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
7473   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
7474                "                         [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
7475   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
7476                "    aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
7477   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7478                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
7479   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7480                "    [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
7481   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7482                "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
7483                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
7484   verifyFormat(
7485       "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
7486       "             << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
7487       "                                  [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
7488   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
7489                "    .aaaaaaaaaaaaaaaaaaaaaa();");
7490 
7491   verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
7492                      "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
7493   verifyFormat(
7494       "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
7495       "                                  .aaaaaaa[0]\n"
7496       "                                  .aaaaaaaaaaaaaaaaaaaaaa();");
7497   verifyFormat("a[::b::c];");
7498 
7499   verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
7500 
7501   FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
7502   verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
7503 }
7504 
7505 TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
7506   verifyFormat("(a)->b();");
7507   verifyFormat("--a;");
7508 }
7509 
7510 TEST_F(FormatTest, HandlesIncludeDirectives) {
7511   verifyFormat("#include <string>\n"
7512                "#include <a/b/c.h>\n"
7513                "#include \"a/b/string\"\n"
7514                "#include \"string.h\"\n"
7515                "#include \"string.h\"\n"
7516                "#include <a-a>\n"
7517                "#include < path with space >\n"
7518                "#include_next <test.h>"
7519                "#include \"abc.h\" // this is included for ABC\n"
7520                "#include \"some long include\" // with a comment\n"
7521                "#include \"some very long include path\"\n"
7522                "#include <some/very/long/include/path>\n",
7523                getLLVMStyleWithColumns(35));
7524   EXPECT_EQ("#include \"a.h\"", format("#include  \"a.h\""));
7525   EXPECT_EQ("#include <a>", format("#include<a>"));
7526 
7527   verifyFormat("#import <string>");
7528   verifyFormat("#import <a/b/c.h>");
7529   verifyFormat("#import \"a/b/string\"");
7530   verifyFormat("#import \"string.h\"");
7531   verifyFormat("#import \"string.h\"");
7532   verifyFormat("#if __has_include(<strstream>)\n"
7533                "#include <strstream>\n"
7534                "#endif");
7535 
7536   verifyFormat("#define MY_IMPORT <a/b>");
7537 
7538   verifyFormat("#if __has_include(<a/b>)");
7539   verifyFormat("#if __has_include_next(<a/b>)");
7540   verifyFormat("#define F __has_include(<a/b>)");
7541   verifyFormat("#define F __has_include_next(<a/b>)");
7542 
7543   // Protocol buffer definition or missing "#".
7544   verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
7545                getLLVMStyleWithColumns(30));
7546 
7547   FormatStyle Style = getLLVMStyle();
7548   Style.AlwaysBreakBeforeMultilineStrings = true;
7549   Style.ColumnLimit = 0;
7550   verifyFormat("#import \"abc.h\"", Style);
7551 
7552   // But 'import' might also be a regular C++ namespace.
7553   verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7554                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7555 }
7556 
7557 //===----------------------------------------------------------------------===//
7558 // Error recovery tests.
7559 //===----------------------------------------------------------------------===//
7560 
7561 TEST_F(FormatTest, IncompleteParameterLists) {
7562   FormatStyle NoBinPacking = getLLVMStyle();
7563   NoBinPacking.BinPackParameters = false;
7564   verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
7565                "                        double *min_x,\n"
7566                "                        double *max_x,\n"
7567                "                        double *min_y,\n"
7568                "                        double *max_y,\n"
7569                "                        double *min_z,\n"
7570                "                        double *max_z, ) {}",
7571                NoBinPacking);
7572 }
7573 
7574 TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
7575   verifyFormat("void f() { return; }\n42");
7576   verifyFormat("void f() {\n"
7577                "  if (0)\n"
7578                "    return;\n"
7579                "}\n"
7580                "42");
7581   verifyFormat("void f() { return }\n42");
7582   verifyFormat("void f() {\n"
7583                "  if (0)\n"
7584                "    return\n"
7585                "}\n"
7586                "42");
7587 }
7588 
7589 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
7590   EXPECT_EQ("void f() { return }", format("void  f ( )  {  return  }"));
7591   EXPECT_EQ("void f() {\n"
7592             "  if (a)\n"
7593             "    return\n"
7594             "}",
7595             format("void  f  (  )  {  if  ( a )  return  }"));
7596   EXPECT_EQ("namespace N {\n"
7597             "void f()\n"
7598             "}",
7599             format("namespace  N  {  void f()  }"));
7600   EXPECT_EQ("namespace N {\n"
7601             "void f() {}\n"
7602             "void g()\n"
7603             "} // namespace N",
7604             format("namespace N  { void f( ) { } void g( ) }"));
7605 }
7606 
7607 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
7608   verifyFormat("int aaaaaaaa =\n"
7609                "    // Overlylongcomment\n"
7610                "    b;",
7611                getLLVMStyleWithColumns(20));
7612   verifyFormat("function(\n"
7613                "    ShortArgument,\n"
7614                "    LoooooooooooongArgument);\n",
7615                getLLVMStyleWithColumns(20));
7616 }
7617 
7618 TEST_F(FormatTest, IncorrectAccessSpecifier) {
7619   verifyFormat("public:");
7620   verifyFormat("class A {\n"
7621                "public\n"
7622                "  void f() {}\n"
7623                "};");
7624   verifyFormat("public\n"
7625                "int qwerty;");
7626   verifyFormat("public\n"
7627                "B {}");
7628   verifyFormat("public\n"
7629                "{}");
7630   verifyFormat("public\n"
7631                "B { int x; }");
7632 }
7633 
7634 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
7635   verifyFormat("{");
7636   verifyFormat("#})");
7637   verifyNoCrash("(/**/[:!] ?[).");
7638 }
7639 
7640 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) {
7641   // Found by oss-fuzz:
7642   // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212
7643   FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
7644   Style.ColumnLimit = 60;
7645   verifyNoCrash(
7646       "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20"
7647       "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20"
7648       "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a",
7649       Style);
7650 }
7651 
7652 TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
7653   verifyFormat("do {\n}");
7654   verifyFormat("do {\n}\n"
7655                "f();");
7656   verifyFormat("do {\n}\n"
7657                "wheeee(fun);");
7658   verifyFormat("do {\n"
7659                "  f();\n"
7660                "}");
7661 }
7662 
7663 TEST_F(FormatTest, IncorrectCodeMissingParens) {
7664   verifyFormat("if {\n  foo;\n  foo();\n}");
7665   verifyFormat("switch {\n  foo;\n  foo();\n}");
7666   verifyIncompleteFormat("for {\n  foo;\n  foo();\n}");
7667   verifyFormat("while {\n  foo;\n  foo();\n}");
7668   verifyFormat("do {\n  foo;\n  foo();\n} while;");
7669 }
7670 
7671 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
7672   verifyIncompleteFormat("namespace {\n"
7673                          "class Foo { Foo (\n"
7674                          "};\n"
7675                          "} // namespace");
7676 }
7677 
7678 TEST_F(FormatTest, IncorrectCodeErrorDetection) {
7679   EXPECT_EQ("{\n  {}\n", format("{\n{\n}\n"));
7680   EXPECT_EQ("{\n  {}\n", format("{\n  {\n}\n"));
7681   EXPECT_EQ("{\n  {}\n", format("{\n  {\n  }\n"));
7682   EXPECT_EQ("{\n  {}\n}\n}\n", format("{\n  {\n    }\n  }\n}\n"));
7683 
7684   EXPECT_EQ("{\n"
7685             "  {\n"
7686             "    breakme(\n"
7687             "        qwe);\n"
7688             "  }\n",
7689             format("{\n"
7690                    "    {\n"
7691                    " breakme(qwe);\n"
7692                    "}\n",
7693                    getLLVMStyleWithColumns(10)));
7694 }
7695 
7696 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
7697   verifyFormat("int x = {\n"
7698                "    avariable,\n"
7699                "    b(alongervariable)};",
7700                getLLVMStyleWithColumns(25));
7701 }
7702 
7703 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
7704   verifyFormat("return (a)(b){1, 2, 3};");
7705 }
7706 
7707 TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
7708   verifyFormat("vector<int> x{1, 2, 3, 4};");
7709   verifyFormat("vector<int> x{\n"
7710                "    1,\n"
7711                "    2,\n"
7712                "    3,\n"
7713                "    4,\n"
7714                "};");
7715   verifyFormat("vector<T> x{{}, {}, {}, {}};");
7716   verifyFormat("f({1, 2});");
7717   verifyFormat("auto v = Foo{-1};");
7718   verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
7719   verifyFormat("Class::Class : member{1, 2, 3} {}");
7720   verifyFormat("new vector<int>{1, 2, 3};");
7721   verifyFormat("new int[3]{1, 2, 3};");
7722   verifyFormat("new int{1};");
7723   verifyFormat("return {arg1, arg2};");
7724   verifyFormat("return {arg1, SomeType{parameter}};");
7725   verifyFormat("int count = set<int>{f(), g(), h()}.size();");
7726   verifyFormat("new T{arg1, arg2};");
7727   verifyFormat("f(MyMap[{composite, key}]);");
7728   verifyFormat("class Class {\n"
7729                "  T member = {arg1, arg2};\n"
7730                "};");
7731   verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
7732   verifyFormat("const struct A a = {.a = 1, .b = 2};");
7733   verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
7734   verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
7735   verifyFormat("int a = std::is_integral<int>{} + 0;");
7736 
7737   verifyFormat("int foo(int i) { return fo1{}(i); }");
7738   verifyFormat("int foo(int i) { return fo1{}(i); }");
7739   verifyFormat("auto i = decltype(x){};");
7740   verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
7741   verifyFormat("Node n{1, Node{1000}, //\n"
7742                "       2};");
7743   verifyFormat("Aaaa aaaaaaa{\n"
7744                "    {\n"
7745                "        aaaa,\n"
7746                "    },\n"
7747                "};");
7748   verifyFormat("class C : public D {\n"
7749                "  SomeClass SC{2};\n"
7750                "};");
7751   verifyFormat("class C : public A {\n"
7752                "  class D : public B {\n"
7753                "    void f() { int i{2}; }\n"
7754                "  };\n"
7755                "};");
7756   verifyFormat("#define A {a, a},");
7757 
7758   // Avoid breaking between equal sign and opening brace
7759   FormatStyle AvoidBreakingFirstArgument = getLLVMStyle();
7760   AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200;
7761   verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n"
7762                "    {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n"
7763                "     {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n"
7764                "     {\"ccccccccccccccccccccc\", 2}};",
7765                AvoidBreakingFirstArgument);
7766 
7767   // Binpacking only if there is no trailing comma
7768   verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
7769                "                      cccccccccc, dddddddddd};",
7770 			   getLLVMStyleWithColumns(50));
7771   verifyFormat("const Aaaaaa aaaaa = {\n"
7772                "    aaaaaaaaaaa,\n"
7773                "    bbbbbbbbbbb,\n"
7774                "    ccccccccccc,\n"
7775                "    ddddddddddd,\n"
7776                "};", getLLVMStyleWithColumns(50));
7777 
7778   // Cases where distinguising braced lists and blocks is hard.
7779   verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
7780   verifyFormat("void f() {\n"
7781                "  return; // comment\n"
7782                "}\n"
7783                "SomeType t;");
7784   verifyFormat("void f() {\n"
7785                "  if (a) {\n"
7786                "    f();\n"
7787                "  }\n"
7788                "}\n"
7789                "SomeType t;");
7790 
7791   // In combination with BinPackArguments = false.
7792   FormatStyle NoBinPacking = getLLVMStyle();
7793   NoBinPacking.BinPackArguments = false;
7794   verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
7795                "                      bbbbb,\n"
7796                "                      ccccc,\n"
7797                "                      ddddd,\n"
7798                "                      eeeee,\n"
7799                "                      ffffff,\n"
7800                "                      ggggg,\n"
7801                "                      hhhhhh,\n"
7802                "                      iiiiii,\n"
7803                "                      jjjjjj,\n"
7804                "                      kkkkkk};",
7805                NoBinPacking);
7806   verifyFormat("const Aaaaaa aaaaa = {\n"
7807                "    aaaaa,\n"
7808                "    bbbbb,\n"
7809                "    ccccc,\n"
7810                "    ddddd,\n"
7811                "    eeeee,\n"
7812                "    ffffff,\n"
7813                "    ggggg,\n"
7814                "    hhhhhh,\n"
7815                "    iiiiii,\n"
7816                "    jjjjjj,\n"
7817                "    kkkkkk,\n"
7818                "};",
7819                NoBinPacking);
7820   verifyFormat(
7821       "const Aaaaaa aaaaa = {\n"
7822       "    aaaaa,  bbbbb,  ccccc,  ddddd,  eeeee,  ffffff, ggggg, hhhhhh,\n"
7823       "    iiiiii, jjjjjj, kkkkkk, aaaaa,  bbbbb,  ccccc,  ddddd, eeeee,\n"
7824       "    ffffff, ggggg,  hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
7825       "};",
7826       NoBinPacking);
7827 
7828   // FIXME: The alignment of these trailing comments might be bad. Then again,
7829   // this might be utterly useless in real code.
7830   verifyFormat("Constructor::Constructor()\n"
7831                "    : some_value{         //\n"
7832                "                 aaaaaaa, //\n"
7833                "                 bbbbbbb} {}");
7834 
7835   // In braced lists, the first comment is always assumed to belong to the
7836   // first element. Thus, it can be moved to the next or previous line as
7837   // appropriate.
7838   EXPECT_EQ("function({// First element:\n"
7839             "          1,\n"
7840             "          // Second element:\n"
7841             "          2});",
7842             format("function({\n"
7843                    "    // First element:\n"
7844                    "    1,\n"
7845                    "    // Second element:\n"
7846                    "    2});"));
7847   EXPECT_EQ("std::vector<int> MyNumbers{\n"
7848             "    // First element:\n"
7849             "    1,\n"
7850             "    // Second element:\n"
7851             "    2};",
7852             format("std::vector<int> MyNumbers{// First element:\n"
7853                    "                           1,\n"
7854                    "                           // Second element:\n"
7855                    "                           2};",
7856                    getLLVMStyleWithColumns(30)));
7857   // A trailing comma should still lead to an enforced line break and no
7858   // binpacking.
7859   EXPECT_EQ("vector<int> SomeVector = {\n"
7860             "    // aaa\n"
7861             "    1,\n"
7862             "    2,\n"
7863             "};",
7864             format("vector<int> SomeVector = { // aaa\n"
7865                    "    1, 2, };"));
7866 
7867   FormatStyle ExtraSpaces = getLLVMStyle();
7868   ExtraSpaces.Cpp11BracedListStyle = false;
7869   ExtraSpaces.ColumnLimit = 75;
7870   verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
7871   verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
7872   verifyFormat("f({ 1, 2 });", ExtraSpaces);
7873   verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
7874   verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
7875   verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
7876   verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
7877   verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
7878   verifyFormat("return { arg1, arg2 };", ExtraSpaces);
7879   verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
7880   verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
7881   verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
7882   verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
7883   verifyFormat("class Class {\n"
7884                "  T member = { arg1, arg2 };\n"
7885                "};",
7886                ExtraSpaces);
7887   verifyFormat(
7888       "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7889       "                                 aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
7890       "                  : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
7891       "                                 bbbbbbbbbbbbbbbbbbbb, bbbbb };",
7892       ExtraSpaces);
7893   verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
7894   verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
7895                ExtraSpaces);
7896   verifyFormat(
7897       "someFunction(OtherParam,\n"
7898       "             BracedList{ // comment 1 (Forcing interesting break)\n"
7899       "                         param1, param2,\n"
7900       "                         // comment 2\n"
7901       "                         param3, param4 });",
7902       ExtraSpaces);
7903   verifyFormat(
7904       "std::this_thread::sleep_for(\n"
7905       "    std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
7906       ExtraSpaces);
7907   verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
7908                "    aaaaaaa,\n"
7909                "    aaaaaaaaaa,\n"
7910                "    aaaaa,\n"
7911                "    aaaaaaaaaaaaaaa,\n"
7912                "    aaa,\n"
7913                "    aaaaaaaaaa,\n"
7914                "    a,\n"
7915                "    aaaaaaaaaaaaaaaaaaaaa,\n"
7916                "    aaaaaaaaaaaa,\n"
7917                "    aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
7918                "    aaaaaaa,\n"
7919                "    a};");
7920   verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
7921   verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
7922   verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
7923 
7924   // Avoid breaking between initializer/equal sign and opening brace
7925   ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200;
7926   verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n"
7927                "  { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
7928                "  { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
7929                "  { \"ccccccccccccccccccccc\", 2 }\n"
7930                "};",
7931                ExtraSpaces);
7932   verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n"
7933                "  { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
7934                "  { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
7935                "  { \"ccccccccccccccccccccc\", 2 }\n"
7936                "};",
7937                ExtraSpaces);
7938 
7939   FormatStyle SpaceBeforeBrace = getLLVMStyle();
7940   SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true;
7941   verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace);
7942   verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace);
7943 }
7944 
7945 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
7946   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7947                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7948                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7949                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7950                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7951                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
7952   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
7953                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7954                "                 1, 22, 333, 4444, 55555, //\n"
7955                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7956                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
7957   verifyFormat(
7958       "vector<int> x = {1,       22, 333, 4444, 55555, 666666, 7777777,\n"
7959       "                 1,       22, 333, 4444, 55555, 666666, 7777777,\n"
7960       "                 1,       22, 333, 4444, 55555, 666666, // comment\n"
7961       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
7962       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
7963       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
7964       "                 7777777};");
7965   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7966                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7967                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
7968   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7969                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7970                "    // Separating comment.\n"
7971                "    X86::R8, X86::R9, X86::R10, X86::R11, 0};");
7972   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7973                "    // Leading comment\n"
7974                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7975                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
7976   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7977                "                 1, 1, 1, 1};",
7978                getLLVMStyleWithColumns(39));
7979   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7980                "                 1, 1, 1, 1};",
7981                getLLVMStyleWithColumns(38));
7982   verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
7983                "    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
7984                getLLVMStyleWithColumns(43));
7985   verifyFormat(
7986       "static unsigned SomeValues[10][3] = {\n"
7987       "    {1, 4, 0},  {4, 9, 0},  {4, 5, 9},  {8, 5, 4}, {1, 8, 4},\n"
7988       "    {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
7989   verifyFormat("static auto fields = new vector<string>{\n"
7990                "    \"aaaaaaaaaaaaa\",\n"
7991                "    \"aaaaaaaaaaaaa\",\n"
7992                "    \"aaaaaaaaaaaa\",\n"
7993                "    \"aaaaaaaaaaaaaa\",\n"
7994                "    \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7995                "    \"aaaaaaaaaaaa\",\n"
7996                "    \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7997                "};");
7998   verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
7999   verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
8000                "                 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
8001                "                 3, cccccccccccccccccccccc};",
8002                getLLVMStyleWithColumns(60));
8003 
8004   // Trailing commas.
8005   verifyFormat("vector<int> x = {\n"
8006                "    1, 1, 1, 1, 1, 1, 1, 1,\n"
8007                "};",
8008                getLLVMStyleWithColumns(39));
8009   verifyFormat("vector<int> x = {\n"
8010                "    1, 1, 1, 1, 1, 1, 1, 1, //\n"
8011                "};",
8012                getLLVMStyleWithColumns(39));
8013   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
8014                "                 1, 1, 1, 1,\n"
8015                "                 /**/ /**/};",
8016                getLLVMStyleWithColumns(39));
8017 
8018   // Trailing comment in the first line.
8019   verifyFormat("vector<int> iiiiiiiiiiiiiii = {                      //\n"
8020                "    1111111111, 2222222222, 33333333333, 4444444444, //\n"
8021                "    111111111,  222222222,  3333333333,  444444444,  //\n"
8022                "    11111111,   22222222,   333333333,   44444444};");
8023   // Trailing comment in the last line.
8024   verifyFormat("int aaaaa[] = {\n"
8025                "    1, 2, 3, // comment\n"
8026                "    4, 5, 6  // comment\n"
8027                "};");
8028 
8029   // With nested lists, we should either format one item per line or all nested
8030   // lists one on line.
8031   // FIXME: For some nested lists, we can do better.
8032   verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
8033                "        {aaaaaaaaaaaaaaaaaaa},\n"
8034                "        {aaaaaaaaaaaaaaaaaaaaa},\n"
8035                "        {aaaaaaaaaaaaaaaaa}};",
8036                getLLVMStyleWithColumns(60));
8037   verifyFormat(
8038       "SomeStruct my_struct_array = {\n"
8039       "    {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
8040       "     aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
8041       "    {aaa, aaa},\n"
8042       "    {aaa, aaa},\n"
8043       "    {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
8044       "    {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
8045       "     aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
8046 
8047   // No column layout should be used here.
8048   verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
8049                "                   bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
8050 
8051   verifyNoCrash("a<,");
8052 
8053   // No braced initializer here.
8054   verifyFormat("void f() {\n"
8055                "  struct Dummy {};\n"
8056                "  f(v);\n"
8057                "}");
8058 
8059   // Long lists should be formatted in columns even if they are nested.
8060   verifyFormat(
8061       "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8062       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8063       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8064       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8065       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8066       "                          1, 22, 333, 4444, 55555, 666666, 7777777});");
8067 
8068   // Allow "single-column" layout even if that violates the column limit. There
8069   // isn't going to be a better way.
8070   verifyFormat("std::vector<int> a = {\n"
8071                "    aaaaaaaa,\n"
8072                "    aaaaaaaa,\n"
8073                "    aaaaaaaa,\n"
8074                "    aaaaaaaa,\n"
8075                "    aaaaaaaaaa,\n"
8076                "    aaaaaaaa,\n"
8077                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
8078                getLLVMStyleWithColumns(30));
8079   verifyFormat("vector<int> aaaa = {\n"
8080                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8081                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8082                "    aaaaaa.aaaaaaa,\n"
8083                "    aaaaaa.aaaaaaa,\n"
8084                "    aaaaaa.aaaaaaa,\n"
8085                "    aaaaaa.aaaaaaa,\n"
8086                "};");
8087 
8088   // Don't create hanging lists.
8089   verifyFormat("someFunction(Param, {List1, List2,\n"
8090                "                     List3});",
8091                getLLVMStyleWithColumns(35));
8092   verifyFormat("someFunction(Param, Param,\n"
8093                "             {List1, List2,\n"
8094                "              List3});",
8095                getLLVMStyleWithColumns(35));
8096   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
8097                "                               aaaaaaaaaaaaaaaaaaaaaaa);");
8098 }
8099 
8100 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
8101   FormatStyle DoNotMerge = getLLVMStyle();
8102   DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
8103 
8104   verifyFormat("void f() { return 42; }");
8105   verifyFormat("void f() {\n"
8106                "  return 42;\n"
8107                "}",
8108                DoNotMerge);
8109   verifyFormat("void f() {\n"
8110                "  // Comment\n"
8111                "}");
8112   verifyFormat("{\n"
8113                "#error {\n"
8114                "  int a;\n"
8115                "}");
8116   verifyFormat("{\n"
8117                "  int a;\n"
8118                "#error {\n"
8119                "}");
8120   verifyFormat("void f() {} // comment");
8121   verifyFormat("void f() { int a; } // comment");
8122   verifyFormat("void f() {\n"
8123                "} // comment",
8124                DoNotMerge);
8125   verifyFormat("void f() {\n"
8126                "  int a;\n"
8127                "} // comment",
8128                DoNotMerge);
8129   verifyFormat("void f() {\n"
8130                "} // comment",
8131                getLLVMStyleWithColumns(15));
8132 
8133   verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
8134   verifyFormat("void f() {\n  return 42;\n}", getLLVMStyleWithColumns(22));
8135 
8136   verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
8137   verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
8138   verifyFormat("class C {\n"
8139                "  C()\n"
8140                "      : iiiiiiii(nullptr),\n"
8141                "        kkkkkkk(nullptr),\n"
8142                "        mmmmmmm(nullptr),\n"
8143                "        nnnnnnn(nullptr) {}\n"
8144                "};",
8145                getGoogleStyle());
8146 
8147   FormatStyle NoColumnLimit = getLLVMStyle();
8148   NoColumnLimit.ColumnLimit = 0;
8149   EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
8150   EXPECT_EQ("class C {\n"
8151             "  A() : b(0) {}\n"
8152             "};",
8153             format("class C{A():b(0){}};", NoColumnLimit));
8154   EXPECT_EQ("A()\n"
8155             "    : b(0) {\n"
8156             "}",
8157             format("A()\n:b(0)\n{\n}", NoColumnLimit));
8158 
8159   FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
8160   DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
8161       FormatStyle::SFS_None;
8162   EXPECT_EQ("A()\n"
8163             "    : b(0) {\n"
8164             "}",
8165             format("A():b(0){}", DoNotMergeNoColumnLimit));
8166   EXPECT_EQ("A()\n"
8167             "    : b(0) {\n"
8168             "}",
8169             format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
8170 
8171   verifyFormat("#define A          \\\n"
8172                "  void f() {       \\\n"
8173                "    int i;         \\\n"
8174                "  }",
8175                getLLVMStyleWithColumns(20));
8176   verifyFormat("#define A           \\\n"
8177                "  void f() { int i; }",
8178                getLLVMStyleWithColumns(21));
8179   verifyFormat("#define A            \\\n"
8180                "  void f() {         \\\n"
8181                "    int i;           \\\n"
8182                "  }                  \\\n"
8183                "  int j;",
8184                getLLVMStyleWithColumns(22));
8185   verifyFormat("#define A             \\\n"
8186                "  void f() { int i; } \\\n"
8187                "  int j;",
8188                getLLVMStyleWithColumns(23));
8189 }
8190 
8191 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
8192   FormatStyle MergeEmptyOnly = getLLVMStyle();
8193   MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
8194   verifyFormat("class C {\n"
8195                "  int f() {}\n"
8196                "};",
8197                MergeEmptyOnly);
8198   verifyFormat("class C {\n"
8199                "  int f() {\n"
8200                "    return 42;\n"
8201                "  }\n"
8202                "};",
8203                MergeEmptyOnly);
8204   verifyFormat("int f() {}", MergeEmptyOnly);
8205   verifyFormat("int f() {\n"
8206                "  return 42;\n"
8207                "}",
8208                MergeEmptyOnly);
8209 
8210   // Also verify behavior when BraceWrapping.AfterFunction = true
8211   MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
8212   MergeEmptyOnly.BraceWrapping.AfterFunction = true;
8213   verifyFormat("int f() {}", MergeEmptyOnly);
8214   verifyFormat("class C {\n"
8215                "  int f() {}\n"
8216                "};",
8217                MergeEmptyOnly);
8218 }
8219 
8220 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
8221   FormatStyle MergeInlineOnly = getLLVMStyle();
8222   MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
8223   verifyFormat("class C {\n"
8224                "  int f() { return 42; }\n"
8225                "};",
8226                MergeInlineOnly);
8227   verifyFormat("int f() {\n"
8228                "  return 42;\n"
8229                "}",
8230                MergeInlineOnly);
8231 
8232   // SFS_Inline implies SFS_Empty
8233   verifyFormat("class C {\n"
8234                "  int f() {}\n"
8235                "};",
8236                MergeInlineOnly);
8237   verifyFormat("int f() {}", MergeInlineOnly);
8238 
8239   // Also verify behavior when BraceWrapping.AfterFunction = true
8240   MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
8241   MergeInlineOnly.BraceWrapping.AfterFunction = true;
8242   verifyFormat("class C {\n"
8243                "  int f() { return 42; }\n"
8244                "};",
8245                MergeInlineOnly);
8246   verifyFormat("int f()\n"
8247                "{\n"
8248                "  return 42;\n"
8249                "}",
8250                MergeInlineOnly);
8251 
8252   // SFS_Inline implies SFS_Empty
8253   verifyFormat("int f() {}", MergeInlineOnly);
8254   verifyFormat("class C {\n"
8255                "  int f() {}\n"
8256                "};",
8257                MergeInlineOnly);
8258 }
8259 
8260 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
8261   FormatStyle MergeInlineOnly = getLLVMStyle();
8262   MergeInlineOnly.AllowShortFunctionsOnASingleLine =
8263       FormatStyle::SFS_InlineOnly;
8264   verifyFormat("class C {\n"
8265                "  int f() { return 42; }\n"
8266                "};",
8267                MergeInlineOnly);
8268   verifyFormat("int f() {\n"
8269                "  return 42;\n"
8270                "}",
8271                MergeInlineOnly);
8272 
8273   // SFS_InlineOnly does not imply SFS_Empty
8274   verifyFormat("class C {\n"
8275                "  int f() {}\n"
8276                "};",
8277                MergeInlineOnly);
8278   verifyFormat("int f() {\n"
8279                "}",
8280                MergeInlineOnly);
8281 
8282   // Also verify behavior when BraceWrapping.AfterFunction = true
8283   MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
8284   MergeInlineOnly.BraceWrapping.AfterFunction = true;
8285   verifyFormat("class C {\n"
8286                "  int f() { return 42; }\n"
8287                "};",
8288                MergeInlineOnly);
8289   verifyFormat("int f()\n"
8290                "{\n"
8291                "  return 42;\n"
8292                "}",
8293                MergeInlineOnly);
8294 
8295   // SFS_InlineOnly does not imply SFS_Empty
8296   verifyFormat("int f()\n"
8297                "{\n"
8298                "}",
8299                MergeInlineOnly);
8300   verifyFormat("class C {\n"
8301                "  int f() {}\n"
8302                "};",
8303                MergeInlineOnly);
8304 }
8305 
8306 TEST_F(FormatTest, SplitEmptyFunction) {
8307   FormatStyle Style = getLLVMStyle();
8308   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
8309   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8310   Style.BraceWrapping.AfterFunction = true;
8311   Style.BraceWrapping.SplitEmptyFunction = false;
8312   Style.ColumnLimit = 40;
8313 
8314   verifyFormat("int f()\n"
8315                "{}",
8316                Style);
8317   verifyFormat("int f()\n"
8318                "{\n"
8319                "  return 42;\n"
8320                "}",
8321                Style);
8322   verifyFormat("int f()\n"
8323                "{\n"
8324                "  // some comment\n"
8325                "}",
8326                Style);
8327 
8328   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
8329   verifyFormat("int f() {}", Style);
8330   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8331                "{}",
8332                Style);
8333   verifyFormat("int f()\n"
8334                "{\n"
8335                "  return 0;\n"
8336                "}",
8337                Style);
8338 
8339   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
8340   verifyFormat("class Foo {\n"
8341                "  int f() {}\n"
8342                "};\n",
8343                Style);
8344   verifyFormat("class Foo {\n"
8345                "  int f() { return 0; }\n"
8346                "};\n",
8347                Style);
8348   verifyFormat("class Foo {\n"
8349                "  int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8350                "  {}\n"
8351                "};\n",
8352                Style);
8353   verifyFormat("class Foo {\n"
8354                "  int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8355                "  {\n"
8356                "    return 0;\n"
8357                "  }\n"
8358                "};\n",
8359                Style);
8360 
8361   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
8362   verifyFormat("int f() {}", Style);
8363   verifyFormat("int f() { return 0; }", Style);
8364   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8365                "{}",
8366                Style);
8367   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8368                "{\n"
8369                "  return 0;\n"
8370                "}",
8371                Style);
8372 }
8373 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
8374   FormatStyle Style = getLLVMStyle();
8375   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
8376   verifyFormat("#ifdef A\n"
8377                "int f() {}\n"
8378                "#else\n"
8379                "int g() {}\n"
8380                "#endif",
8381                Style);
8382 }
8383 
8384 TEST_F(FormatTest, SplitEmptyClass) {
8385   FormatStyle Style = getLLVMStyle();
8386   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8387   Style.BraceWrapping.AfterClass = true;
8388   Style.BraceWrapping.SplitEmptyRecord = false;
8389 
8390   verifyFormat("class Foo\n"
8391                "{};",
8392                Style);
8393   verifyFormat("/* something */ class Foo\n"
8394                "{};",
8395                Style);
8396   verifyFormat("template <typename X> class Foo\n"
8397                "{};",
8398                Style);
8399   verifyFormat("class Foo\n"
8400                "{\n"
8401                "  Foo();\n"
8402                "};",
8403                Style);
8404   verifyFormat("typedef class Foo\n"
8405                "{\n"
8406                "} Foo_t;",
8407                Style);
8408 }
8409 
8410 TEST_F(FormatTest, SplitEmptyStruct) {
8411   FormatStyle Style = getLLVMStyle();
8412   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8413   Style.BraceWrapping.AfterStruct = true;
8414   Style.BraceWrapping.SplitEmptyRecord = false;
8415 
8416   verifyFormat("struct Foo\n"
8417                "{};",
8418                Style);
8419   verifyFormat("/* something */ struct Foo\n"
8420                "{};",
8421                Style);
8422   verifyFormat("template <typename X> struct Foo\n"
8423                "{};",
8424                Style);
8425   verifyFormat("struct Foo\n"
8426                "{\n"
8427                "  Foo();\n"
8428                "};",
8429                Style);
8430   verifyFormat("typedef struct Foo\n"
8431                "{\n"
8432                "} Foo_t;",
8433                Style);
8434   //typedef struct Bar {} Bar_t;
8435 }
8436 
8437 TEST_F(FormatTest, SplitEmptyUnion) {
8438   FormatStyle Style = getLLVMStyle();
8439   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8440   Style.BraceWrapping.AfterUnion = true;
8441   Style.BraceWrapping.SplitEmptyRecord = false;
8442 
8443   verifyFormat("union Foo\n"
8444                "{};",
8445                Style);
8446   verifyFormat("/* something */ union Foo\n"
8447                "{};",
8448                Style);
8449   verifyFormat("union Foo\n"
8450                "{\n"
8451                "  A,\n"
8452                "};",
8453                Style);
8454   verifyFormat("typedef union Foo\n"
8455                "{\n"
8456                "} Foo_t;",
8457                Style);
8458 }
8459 
8460 TEST_F(FormatTest, SplitEmptyNamespace) {
8461   FormatStyle Style = getLLVMStyle();
8462   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8463   Style.BraceWrapping.AfterNamespace = true;
8464   Style.BraceWrapping.SplitEmptyNamespace = false;
8465 
8466   verifyFormat("namespace Foo\n"
8467                "{};",
8468                Style);
8469   verifyFormat("/* something */ namespace Foo\n"
8470                "{};",
8471                Style);
8472   verifyFormat("inline namespace Foo\n"
8473                "{};",
8474                Style);
8475   verifyFormat("/* something */ inline namespace Foo\n"
8476                "{};",
8477                Style);
8478   verifyFormat("export namespace Foo\n"
8479                "{};",
8480                Style);
8481   verifyFormat("namespace Foo\n"
8482                "{\n"
8483                "void Bar();\n"
8484                "};",
8485                Style);
8486 }
8487 
8488 TEST_F(FormatTest, NeverMergeShortRecords) {
8489   FormatStyle Style = getLLVMStyle();
8490 
8491   verifyFormat("class Foo {\n"
8492                "  Foo();\n"
8493                "};",
8494                Style);
8495   verifyFormat("typedef class Foo {\n"
8496                "  Foo();\n"
8497                "} Foo_t;",
8498                Style);
8499   verifyFormat("struct Foo {\n"
8500                "  Foo();\n"
8501                "};",
8502                Style);
8503   verifyFormat("typedef struct Foo {\n"
8504                "  Foo();\n"
8505                "} Foo_t;",
8506                Style);
8507   verifyFormat("union Foo {\n"
8508                "  A,\n"
8509                "};",
8510                Style);
8511   verifyFormat("typedef union Foo {\n"
8512                "  A,\n"
8513                "} Foo_t;",
8514                Style);
8515   verifyFormat("namespace Foo {\n"
8516                "void Bar();\n"
8517                "};",
8518                Style);
8519 
8520   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8521   Style.BraceWrapping.AfterClass = true;
8522   Style.BraceWrapping.AfterStruct = true;
8523   Style.BraceWrapping.AfterUnion = true;
8524   Style.BraceWrapping.AfterNamespace = true;
8525   verifyFormat("class Foo\n"
8526                "{\n"
8527                "  Foo();\n"
8528                "};",
8529                Style);
8530   verifyFormat("typedef class Foo\n"
8531                "{\n"
8532                "  Foo();\n"
8533                "} Foo_t;",
8534                Style);
8535   verifyFormat("struct Foo\n"
8536                "{\n"
8537                "  Foo();\n"
8538                "};",
8539                Style);
8540   verifyFormat("typedef struct Foo\n"
8541                "{\n"
8542                "  Foo();\n"
8543                "} Foo_t;",
8544                Style);
8545   verifyFormat("union Foo\n"
8546                "{\n"
8547                "  A,\n"
8548                "};",
8549                Style);
8550   verifyFormat("typedef union Foo\n"
8551                "{\n"
8552                "  A,\n"
8553                "} Foo_t;",
8554                Style);
8555   verifyFormat("namespace Foo\n"
8556                "{\n"
8557                "void Bar();\n"
8558                "};",
8559                Style);
8560 }
8561 
8562 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
8563   // Elaborate type variable declarations.
8564   verifyFormat("struct foo a = {bar};\nint n;");
8565   verifyFormat("class foo a = {bar};\nint n;");
8566   verifyFormat("union foo a = {bar};\nint n;");
8567 
8568   // Elaborate types inside function definitions.
8569   verifyFormat("struct foo f() {}\nint n;");
8570   verifyFormat("class foo f() {}\nint n;");
8571   verifyFormat("union foo f() {}\nint n;");
8572 
8573   // Templates.
8574   verifyFormat("template <class X> void f() {}\nint n;");
8575   verifyFormat("template <struct X> void f() {}\nint n;");
8576   verifyFormat("template <union X> void f() {}\nint n;");
8577 
8578   // Actual definitions...
8579   verifyFormat("struct {\n} n;");
8580   verifyFormat(
8581       "template <template <class T, class Y>, class Z> class X {\n} n;");
8582   verifyFormat("union Z {\n  int n;\n} x;");
8583   verifyFormat("class MACRO Z {\n} n;");
8584   verifyFormat("class MACRO(X) Z {\n} n;");
8585   verifyFormat("class __attribute__(X) Z {\n} n;");
8586   verifyFormat("class __declspec(X) Z {\n} n;");
8587   verifyFormat("class A##B##C {\n} n;");
8588   verifyFormat("class alignas(16) Z {\n} n;");
8589   verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
8590   verifyFormat("class MACROA MACRO(X) Z {\n} n;");
8591 
8592   // Redefinition from nested context:
8593   verifyFormat("class A::B::C {\n} n;");
8594 
8595   // Template definitions.
8596   verifyFormat(
8597       "template <typename F>\n"
8598       "Matcher(const Matcher<F> &Other,\n"
8599       "        typename enable_if_c<is_base_of<F, T>::value &&\n"
8600       "                             !is_same<F, T>::value>::type * = 0)\n"
8601       "    : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
8602 
8603   // FIXME: This is still incorrectly handled at the formatter side.
8604   verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
8605   verifyFormat("int i = SomeFunction(a<b, a> b);");
8606 
8607   // FIXME:
8608   // This now gets parsed incorrectly as class definition.
8609   // verifyFormat("class A<int> f() {\n}\nint n;");
8610 
8611   // Elaborate types where incorrectly parsing the structural element would
8612   // break the indent.
8613   verifyFormat("if (true)\n"
8614                "  class X x;\n"
8615                "else\n"
8616                "  f();\n");
8617 
8618   // This is simply incomplete. Formatting is not important, but must not crash.
8619   verifyFormat("class A:");
8620 }
8621 
8622 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
8623   EXPECT_EQ("#error Leave     all         white!!!!! space* alone!\n",
8624             format("#error Leave     all         white!!!!! space* alone!\n"));
8625   EXPECT_EQ(
8626       "#warning Leave     all         white!!!!! space* alone!\n",
8627       format("#warning Leave     all         white!!!!! space* alone!\n"));
8628   EXPECT_EQ("#error 1", format("  #  error   1"));
8629   EXPECT_EQ("#warning 1", format("  #  warning 1"));
8630 }
8631 
8632 TEST_F(FormatTest, FormatHashIfExpressions) {
8633   verifyFormat("#if AAAA && BBBB");
8634   verifyFormat("#if (AAAA && BBBB)");
8635   verifyFormat("#elif (AAAA && BBBB)");
8636   // FIXME: Come up with a better indentation for #elif.
8637   verifyFormat(
8638       "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) &&  \\\n"
8639       "    defined(BBBBBBBB)\n"
8640       "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) &&  \\\n"
8641       "    defined(BBBBBBBB)\n"
8642       "#endif",
8643       getLLVMStyleWithColumns(65));
8644 }
8645 
8646 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
8647   FormatStyle AllowsMergedIf = getGoogleStyle();
8648   AllowsMergedIf.AllowShortIfStatementsOnASingleLine =
8649       FormatStyle::SIS_WithoutElse;
8650   verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
8651   verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
8652   verifyFormat("if (true)\n#error E\n  return 42;", AllowsMergedIf);
8653   EXPECT_EQ("if (true) return 42;",
8654             format("if (true)\nreturn 42;", AllowsMergedIf));
8655   FormatStyle ShortMergedIf = AllowsMergedIf;
8656   ShortMergedIf.ColumnLimit = 25;
8657   verifyFormat("#define A \\\n"
8658                "  if (true) return 42;",
8659                ShortMergedIf);
8660   verifyFormat("#define A \\\n"
8661                "  f();    \\\n"
8662                "  if (true)\n"
8663                "#define B",
8664                ShortMergedIf);
8665   verifyFormat("#define A \\\n"
8666                "  f();    \\\n"
8667                "  if (true)\n"
8668                "g();",
8669                ShortMergedIf);
8670   verifyFormat("{\n"
8671                "#ifdef A\n"
8672                "  // Comment\n"
8673                "  if (true) continue;\n"
8674                "#endif\n"
8675                "  // Comment\n"
8676                "  if (true) continue;\n"
8677                "}",
8678                ShortMergedIf);
8679   ShortMergedIf.ColumnLimit = 33;
8680   verifyFormat("#define A \\\n"
8681                "  if constexpr (true) return 42;",
8682                ShortMergedIf);
8683   verifyFormat("#define A \\\n"
8684                "  if CONSTEXPR (true) return 42;",
8685                ShortMergedIf);
8686   ShortMergedIf.ColumnLimit = 29;
8687   verifyFormat("#define A                   \\\n"
8688                "  if (aaaaaaaaaa) return 1; \\\n"
8689                "  return 2;",
8690                ShortMergedIf);
8691   ShortMergedIf.ColumnLimit = 28;
8692   verifyFormat("#define A         \\\n"
8693                "  if (aaaaaaaaaa) \\\n"
8694                "    return 1;     \\\n"
8695                "  return 2;",
8696                ShortMergedIf);
8697   verifyFormat("#define A                \\\n"
8698                "  if constexpr (aaaaaaa) \\\n"
8699                "    return 1;            \\\n"
8700                "  return 2;",
8701                ShortMergedIf);
8702   verifyFormat("#define A                \\\n"
8703                "  if CONSTEXPR (aaaaaaa) \\\n"
8704                "    return 1;            \\\n"
8705                "  return 2;",
8706                ShortMergedIf);
8707 }
8708 
8709 TEST_F(FormatTest, FormatStarDependingOnContext) {
8710   verifyFormat("void f(int *a);");
8711   verifyFormat("void f() { f(fint * b); }");
8712   verifyFormat("class A {\n  void f(int *a);\n};");
8713   verifyFormat("class A {\n  int *a;\n};");
8714   verifyFormat("namespace a {\n"
8715                "namespace b {\n"
8716                "class A {\n"
8717                "  void f() {}\n"
8718                "  int *a;\n"
8719                "};\n"
8720                "} // namespace b\n"
8721                "} // namespace a");
8722 }
8723 
8724 TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
8725   verifyFormat("while");
8726   verifyFormat("operator");
8727 }
8728 
8729 TEST_F(FormatTest, SkipsDeeplyNestedLines) {
8730   // This code would be painfully slow to format if we didn't skip it.
8731   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
8732                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8733                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8734                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8735                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8736                    "A(1, 1)\n"
8737                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
8738                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8739                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8740                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8741                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8742                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8743                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8744                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8745                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8746                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
8747   // Deeply nested part is untouched, rest is formatted.
8748   EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
8749             format(std::string("int    i;\n") + Code + "int    j;\n",
8750                    getLLVMStyle(), SC_ExpectIncomplete));
8751 }
8752 
8753 //===----------------------------------------------------------------------===//
8754 // Objective-C tests.
8755 //===----------------------------------------------------------------------===//
8756 
8757 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
8758   verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
8759   EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
8760             format("-(NSUInteger)indexOfObject:(id)anObject;"));
8761   EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
8762   EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
8763   EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
8764             format("-(NSInteger)Method3:(id)anObject;"));
8765   EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
8766             format("-(NSInteger)Method4:(id)anObject;"));
8767   EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
8768             format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
8769   EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
8770             format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
8771   EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
8772             "forAllCells:(BOOL)flag;",
8773             format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
8774                    "forAllCells:(BOOL)flag;"));
8775 
8776   // Very long objectiveC method declaration.
8777   verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
8778                "    (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
8779   verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
8780                "                    inRange:(NSRange)range\n"
8781                "                   outRange:(NSRange)out_range\n"
8782                "                  outRange1:(NSRange)out_range1\n"
8783                "                  outRange2:(NSRange)out_range2\n"
8784                "                  outRange3:(NSRange)out_range3\n"
8785                "                  outRange4:(NSRange)out_range4\n"
8786                "                  outRange5:(NSRange)out_range5\n"
8787                "                  outRange6:(NSRange)out_range6\n"
8788                "                  outRange7:(NSRange)out_range7\n"
8789                "                  outRange8:(NSRange)out_range8\n"
8790                "                  outRange9:(NSRange)out_range9;");
8791 
8792   // When the function name has to be wrapped.
8793   FormatStyle Style = getLLVMStyle();
8794   // ObjC ignores IndentWrappedFunctionNames when wrapping methods
8795   // and always indents instead.
8796   Style.IndentWrappedFunctionNames = false;
8797   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
8798                "    veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
8799                "               anotherName:(NSString)bbbbbbbbbbbbbb {\n"
8800                "}",
8801                Style);
8802   Style.IndentWrappedFunctionNames = true;
8803   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
8804                "    veryLooooooooooongName:(NSString)cccccccccccccc\n"
8805                "               anotherName:(NSString)dddddddddddddd {\n"
8806                "}",
8807                Style);
8808 
8809   verifyFormat("- (int)sum:(vector<int>)numbers;");
8810   verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
8811   // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
8812   // protocol lists (but not for template classes):
8813   // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
8814 
8815   verifyFormat("- (int (*)())foo:(int (*)())f;");
8816   verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
8817 
8818   // If there's no return type (very rare in practice!), LLVM and Google style
8819   // agree.
8820   verifyFormat("- foo;");
8821   verifyFormat("- foo:(int)f;");
8822   verifyGoogleFormat("- foo:(int)foo;");
8823 }
8824 
8825 
8826 TEST_F(FormatTest, BreaksStringLiterals) {
8827   EXPECT_EQ("\"some text \"\n"
8828             "\"other\";",
8829             format("\"some text other\";", getLLVMStyleWithColumns(12)));
8830   EXPECT_EQ("\"some text \"\n"
8831             "\"other\";",
8832             format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
8833   EXPECT_EQ(
8834       "#define A  \\\n"
8835       "  \"some \"  \\\n"
8836       "  \"text \"  \\\n"
8837       "  \"other\";",
8838       format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
8839   EXPECT_EQ(
8840       "#define A  \\\n"
8841       "  \"so \"    \\\n"
8842       "  \"text \"  \\\n"
8843       "  \"other\";",
8844       format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
8845 
8846   EXPECT_EQ("\"some text\"",
8847             format("\"some text\"", getLLVMStyleWithColumns(1)));
8848   EXPECT_EQ("\"some text\"",
8849             format("\"some text\"", getLLVMStyleWithColumns(11)));
8850   EXPECT_EQ("\"some \"\n"
8851             "\"text\"",
8852             format("\"some text\"", getLLVMStyleWithColumns(10)));
8853   EXPECT_EQ("\"some \"\n"
8854             "\"text\"",
8855             format("\"some text\"", getLLVMStyleWithColumns(7)));
8856   EXPECT_EQ("\"some\"\n"
8857             "\" tex\"\n"
8858             "\"t\"",
8859             format("\"some text\"", getLLVMStyleWithColumns(6)));
8860   EXPECT_EQ("\"some\"\n"
8861             "\" tex\"\n"
8862             "\" and\"",
8863             format("\"some tex and\"", getLLVMStyleWithColumns(6)));
8864   EXPECT_EQ("\"some\"\n"
8865             "\"/tex\"\n"
8866             "\"/and\"",
8867             format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
8868 
8869   EXPECT_EQ("variable =\n"
8870             "    \"long string \"\n"
8871             "    \"literal\";",
8872             format("variable = \"long string literal\";",
8873                    getLLVMStyleWithColumns(20)));
8874 
8875   EXPECT_EQ("variable = f(\n"
8876             "    \"long string \"\n"
8877             "    \"literal\",\n"
8878             "    short,\n"
8879             "    loooooooooooooooooooong);",
8880             format("variable = f(\"long string literal\", short, "
8881                    "loooooooooooooooooooong);",
8882                    getLLVMStyleWithColumns(20)));
8883 
8884   EXPECT_EQ(
8885       "f(g(\"long string \"\n"
8886       "    \"literal\"),\n"
8887       "  b);",
8888       format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
8889   EXPECT_EQ("f(g(\"long string \"\n"
8890             "    \"literal\",\n"
8891             "    a),\n"
8892             "  b);",
8893             format("f(g(\"long string literal\", a), b);",
8894                    getLLVMStyleWithColumns(20)));
8895   EXPECT_EQ(
8896       "f(\"one two\".split(\n"
8897       "    variable));",
8898       format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
8899   EXPECT_EQ("f(\"one two three four five six \"\n"
8900             "  \"seven\".split(\n"
8901             "      really_looooong_variable));",
8902             format("f(\"one two three four five six seven\"."
8903                    "split(really_looooong_variable));",
8904                    getLLVMStyleWithColumns(33)));
8905 
8906   EXPECT_EQ("f(\"some \"\n"
8907             "  \"text\",\n"
8908             "  other);",
8909             format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
8910 
8911   // Only break as a last resort.
8912   verifyFormat(
8913       "aaaaaaaaaaaaaaaaaaaa(\n"
8914       "    aaaaaaaaaaaaaaaaaaaa,\n"
8915       "    aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
8916 
8917   EXPECT_EQ("\"splitmea\"\n"
8918             "\"trandomp\"\n"
8919             "\"oint\"",
8920             format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
8921 
8922   EXPECT_EQ("\"split/\"\n"
8923             "\"pathat/\"\n"
8924             "\"slashes\"",
8925             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
8926 
8927   EXPECT_EQ("\"split/\"\n"
8928             "\"pathat/\"\n"
8929             "\"slashes\"",
8930             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
8931   EXPECT_EQ("\"split at \"\n"
8932             "\"spaces/at/\"\n"
8933             "\"slashes.at.any$\"\n"
8934             "\"non-alphanumeric%\"\n"
8935             "\"1111111111characte\"\n"
8936             "\"rs\"",
8937             format("\"split at "
8938                    "spaces/at/"
8939                    "slashes.at."
8940                    "any$non-"
8941                    "alphanumeric%"
8942                    "1111111111characte"
8943                    "rs\"",
8944                    getLLVMStyleWithColumns(20)));
8945 
8946   // Verify that splitting the strings understands
8947   // Style::AlwaysBreakBeforeMultilineStrings.
8948   EXPECT_EQ(
8949       "aaaaaaaaaaaa(\n"
8950       "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
8951       "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
8952       format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
8953              "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8954              "aaaaaaaaaaaaaaaaaaaaaa\");",
8955              getGoogleStyle()));
8956   EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8957             "       \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
8958             format("return \"aaaaaaaaaaaaaaaaaaaaaa "
8959                    "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8960                    "aaaaaaaaaaaaaaaaaaaaaa\";",
8961                    getGoogleStyle()));
8962   EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8963             "                \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8964             format("llvm::outs() << "
8965                    "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
8966                    "aaaaaaaaaaaaaaaaaaa\";"));
8967   EXPECT_EQ("ffff(\n"
8968             "    {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8969             "     \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8970             format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
8971                    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8972                    getGoogleStyle()));
8973 
8974   FormatStyle Style = getLLVMStyleWithColumns(12);
8975   Style.BreakStringLiterals = false;
8976   EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
8977 
8978   FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
8979   AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
8980   EXPECT_EQ("#define A \\\n"
8981             "  \"some \" \\\n"
8982             "  \"text \" \\\n"
8983             "  \"other\";",
8984             format("#define A \"some text other\";", AlignLeft));
8985 }
8986 
8987 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) {
8988   EXPECT_EQ("C a = \"some more \"\n"
8989             "      \"text\";",
8990             format("C a = \"some more text\";", getLLVMStyleWithColumns(18)));
8991 }
8992 
8993 TEST_F(FormatTest, FullyRemoveEmptyLines) {
8994   FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
8995   NoEmptyLines.MaxEmptyLinesToKeep = 0;
8996   EXPECT_EQ("int i = a(b());",
8997             format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
8998 }
8999 
9000 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
9001   EXPECT_EQ(
9002       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9003       "(\n"
9004       "    \"x\t\");",
9005       format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9006              "aaaaaaa("
9007              "\"x\t\");"));
9008 }
9009 
9010 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
9011   EXPECT_EQ(
9012       "u8\"utf8 string \"\n"
9013       "u8\"literal\";",
9014       format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
9015   EXPECT_EQ(
9016       "u\"utf16 string \"\n"
9017       "u\"literal\";",
9018       format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
9019   EXPECT_EQ(
9020       "U\"utf32 string \"\n"
9021       "U\"literal\";",
9022       format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
9023   EXPECT_EQ("L\"wide string \"\n"
9024             "L\"literal\";",
9025             format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
9026   EXPECT_EQ("@\"NSString \"\n"
9027             "@\"literal\";",
9028             format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
9029   verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
9030 
9031   // This input makes clang-format try to split the incomplete unicode escape
9032   // sequence, which used to lead to a crasher.
9033   verifyNoCrash(
9034       "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
9035       getLLVMStyleWithColumns(60));
9036 }
9037 
9038 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
9039   FormatStyle Style = getGoogleStyleWithColumns(15);
9040   EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
9041   EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
9042   EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
9043   EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
9044   EXPECT_EQ("u8R\"x(raw literal)x\";",
9045             format("u8R\"x(raw literal)x\";", Style));
9046 }
9047 
9048 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
9049   FormatStyle Style = getLLVMStyleWithColumns(20);
9050   EXPECT_EQ(
9051       "_T(\"aaaaaaaaaaaaaa\")\n"
9052       "_T(\"aaaaaaaaaaaaaa\")\n"
9053       "_T(\"aaaaaaaaaaaa\")",
9054       format("  _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
9055   EXPECT_EQ("f(x,\n"
9056             "  _T(\"aaaaaaaaaaaa\")\n"
9057             "  _T(\"aaa\"),\n"
9058             "  z);",
9059             format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
9060 
9061   // FIXME: Handle embedded spaces in one iteration.
9062   //  EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
9063   //            "_T(\"aaaaaaaaaaaaa\")\n"
9064   //            "_T(\"aaaaaaaaaaaaa\")\n"
9065   //            "_T(\"a\")",
9066   //            format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
9067   //                   getLLVMStyleWithColumns(20)));
9068   EXPECT_EQ(
9069       "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
9070       format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
9071   EXPECT_EQ("f(\n"
9072             "#if !TEST\n"
9073             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
9074             "#endif\n"
9075             ");",
9076             format("f(\n"
9077                    "#if !TEST\n"
9078                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
9079                    "#endif\n"
9080                    ");"));
9081   EXPECT_EQ("f(\n"
9082             "\n"
9083             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
9084             format("f(\n"
9085                    "\n"
9086                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
9087 }
9088 
9089 TEST_F(FormatTest, BreaksStringLiteralOperands) {
9090   // In a function call with two operands, the second can be broken with no line
9091   // break before it.
9092   EXPECT_EQ("func(a, \"long long \"\n"
9093             "        \"long long\");",
9094             format("func(a, \"long long long long\");",
9095                    getLLVMStyleWithColumns(24)));
9096   // In a function call with three operands, the second must be broken with a
9097   // line break before it.
9098   EXPECT_EQ("func(a,\n"
9099             "     \"long long long \"\n"
9100             "     \"long\",\n"
9101             "     c);",
9102             format("func(a, \"long long long long\", c);",
9103                    getLLVMStyleWithColumns(24)));
9104   // In a function call with three operands, the third must be broken with a
9105   // line break before it.
9106   EXPECT_EQ("func(a, b,\n"
9107             "     \"long long long \"\n"
9108             "     \"long\");",
9109             format("func(a, b, \"long long long long\");",
9110                    getLLVMStyleWithColumns(24)));
9111   // In a function call with three operands, both the second and the third must
9112   // be broken with a line break before them.
9113   EXPECT_EQ("func(a,\n"
9114             "     \"long long long \"\n"
9115             "     \"long\",\n"
9116             "     \"long long long \"\n"
9117             "     \"long\");",
9118             format("func(a, \"long long long long\", \"long long long long\");",
9119                    getLLVMStyleWithColumns(24)));
9120   // In a chain of << with two operands, the second can be broken with no line
9121   // break before it.
9122   EXPECT_EQ("a << \"line line \"\n"
9123             "     \"line\";",
9124             format("a << \"line line line\";",
9125                    getLLVMStyleWithColumns(20)));
9126   // In a chain of << with three operands, the second can be broken with no line
9127   // break before it.
9128   EXPECT_EQ("abcde << \"line \"\n"
9129             "         \"line line\"\n"
9130             "      << c;",
9131             format("abcde << \"line line line\" << c;",
9132                    getLLVMStyleWithColumns(20)));
9133   // In a chain of << with three operands, the third must be broken with a line
9134   // break before it.
9135   EXPECT_EQ("a << b\n"
9136             "  << \"line line \"\n"
9137             "     \"line\";",
9138             format("a << b << \"line line line\";",
9139                    getLLVMStyleWithColumns(20)));
9140   // In a chain of << with three operands, the second can be broken with no line
9141   // break before it and the third must be broken with a line break before it.
9142   EXPECT_EQ("abcd << \"line line \"\n"
9143             "        \"line\"\n"
9144             "     << \"line line \"\n"
9145             "        \"line\";",
9146             format("abcd << \"line line line\" << \"line line line\";",
9147                    getLLVMStyleWithColumns(20)));
9148   // In a chain of binary operators with two operands, the second can be broken
9149   // with no line break before it.
9150   EXPECT_EQ("abcd + \"line line \"\n"
9151             "       \"line line\";",
9152             format("abcd + \"line line line line\";",
9153                    getLLVMStyleWithColumns(20)));
9154   // In a chain of binary operators with three operands, the second must be
9155   // broken with a line break before it.
9156   EXPECT_EQ("abcd +\n"
9157             "    \"line line \"\n"
9158             "    \"line line\" +\n"
9159             "    e;",
9160             format("abcd + \"line line line line\" + e;",
9161                    getLLVMStyleWithColumns(20)));
9162   // In a function call with two operands, with AlignAfterOpenBracket enabled,
9163   // the first must be broken with a line break before it.
9164   FormatStyle Style = getLLVMStyleWithColumns(25);
9165   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
9166   EXPECT_EQ("someFunction(\n"
9167             "    \"long long long \"\n"
9168             "    \"long\",\n"
9169             "    a);",
9170             format("someFunction(\"long long long long\", a);", Style));
9171 }
9172 
9173 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
9174   EXPECT_EQ(
9175       "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
9176       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
9177       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
9178       format("aaaaaaaaaaa  =  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
9179              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
9180              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
9181 }
9182 
9183 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
9184   EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
9185             format("f(g(R\"x(raw literal)x\",   a), b);", getGoogleStyle()));
9186   EXPECT_EQ("fffffffffff(g(R\"x(\n"
9187             "multiline raw string literal xxxxxxxxxxxxxx\n"
9188             ")x\",\n"
9189             "              a),\n"
9190             "            b);",
9191             format("fffffffffff(g(R\"x(\n"
9192                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9193                    ")x\", a), b);",
9194                    getGoogleStyleWithColumns(20)));
9195   EXPECT_EQ("fffffffffff(\n"
9196             "    g(R\"x(qqq\n"
9197             "multiline raw string literal xxxxxxxxxxxxxx\n"
9198             ")x\",\n"
9199             "      a),\n"
9200             "    b);",
9201             format("fffffffffff(g(R\"x(qqq\n"
9202                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9203                    ")x\", a), b);",
9204                    getGoogleStyleWithColumns(20)));
9205 
9206   EXPECT_EQ("fffffffffff(R\"x(\n"
9207             "multiline raw string literal xxxxxxxxxxxxxx\n"
9208             ")x\");",
9209             format("fffffffffff(R\"x(\n"
9210                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9211                    ")x\");",
9212                    getGoogleStyleWithColumns(20)));
9213   EXPECT_EQ("fffffffffff(R\"x(\n"
9214             "multiline raw string literal xxxxxxxxxxxxxx\n"
9215             ")x\" + bbbbbb);",
9216             format("fffffffffff(R\"x(\n"
9217                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9218                    ")x\" +   bbbbbb);",
9219                    getGoogleStyleWithColumns(20)));
9220   EXPECT_EQ("fffffffffff(\n"
9221             "    R\"x(\n"
9222             "multiline raw string literal xxxxxxxxxxxxxx\n"
9223             ")x\" +\n"
9224             "    bbbbbb);",
9225             format("fffffffffff(\n"
9226                    " R\"x(\n"
9227                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9228                    ")x\" + bbbbbb);",
9229                    getGoogleStyleWithColumns(20)));
9230   EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);",
9231             format("fffffffffff(\n"
9232                    " R\"(single line raw string)\" + bbbbbb);"));
9233 }
9234 
9235 TEST_F(FormatTest, SkipsUnknownStringLiterals) {
9236   verifyFormat("string a = \"unterminated;");
9237   EXPECT_EQ("function(\"unterminated,\n"
9238             "         OtherParameter);",
9239             format("function(  \"unterminated,\n"
9240                    "    OtherParameter);"));
9241 }
9242 
9243 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
9244   FormatStyle Style = getLLVMStyle();
9245   Style.Standard = FormatStyle::LS_Cpp03;
9246   EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
9247             format("#define x(_a) printf(\"foo\"_a);", Style));
9248 }
9249 
9250 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
9251 
9252 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
9253   EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
9254             "             \"ddeeefff\");",
9255             format("someFunction(\"aaabbbcccdddeeefff\");",
9256                    getLLVMStyleWithColumns(25)));
9257   EXPECT_EQ("someFunction1234567890(\n"
9258             "    \"aaabbbcccdddeeefff\");",
9259             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
9260                    getLLVMStyleWithColumns(26)));
9261   EXPECT_EQ("someFunction1234567890(\n"
9262             "    \"aaabbbcccdddeeeff\"\n"
9263             "    \"f\");",
9264             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
9265                    getLLVMStyleWithColumns(25)));
9266   EXPECT_EQ("someFunction1234567890(\n"
9267             "    \"aaabbbcccdddeeeff\"\n"
9268             "    \"f\");",
9269             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
9270                    getLLVMStyleWithColumns(24)));
9271   EXPECT_EQ("someFunction(\n"
9272             "    \"aaabbbcc ddde \"\n"
9273             "    \"efff\");",
9274             format("someFunction(\"aaabbbcc ddde efff\");",
9275                    getLLVMStyleWithColumns(25)));
9276   EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
9277             "             \"ddeeefff\");",
9278             format("someFunction(\"aaabbbccc ddeeefff\");",
9279                    getLLVMStyleWithColumns(25)));
9280   EXPECT_EQ("someFunction1234567890(\n"
9281             "    \"aaabb \"\n"
9282             "    \"cccdddeeefff\");",
9283             format("someFunction1234567890(\"aaabb cccdddeeefff\");",
9284                    getLLVMStyleWithColumns(25)));
9285   EXPECT_EQ("#define A          \\\n"
9286             "  string s =       \\\n"
9287             "      \"123456789\"  \\\n"
9288             "      \"0\";         \\\n"
9289             "  int i;",
9290             format("#define A string s = \"1234567890\"; int i;",
9291                    getLLVMStyleWithColumns(20)));
9292   EXPECT_EQ("someFunction(\n"
9293             "    \"aaabbbcc \"\n"
9294             "    \"dddeeefff\");",
9295             format("someFunction(\"aaabbbcc dddeeefff\");",
9296                    getLLVMStyleWithColumns(25)));
9297 }
9298 
9299 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
9300   EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
9301   EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
9302   EXPECT_EQ("\"test\"\n"
9303             "\"\\n\"",
9304             format("\"test\\n\"", getLLVMStyleWithColumns(7)));
9305   EXPECT_EQ("\"tes\\\\\"\n"
9306             "\"n\"",
9307             format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
9308   EXPECT_EQ("\"\\\\\\\\\"\n"
9309             "\"\\n\"",
9310             format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
9311   EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
9312   EXPECT_EQ("\"\\uff01\"\n"
9313             "\"test\"",
9314             format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
9315   EXPECT_EQ("\"\\Uff01ff02\"",
9316             format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
9317   EXPECT_EQ("\"\\x000000000001\"\n"
9318             "\"next\"",
9319             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
9320   EXPECT_EQ("\"\\x000000000001next\"",
9321             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
9322   EXPECT_EQ("\"\\x000000000001\"",
9323             format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
9324   EXPECT_EQ("\"test\"\n"
9325             "\"\\000000\"\n"
9326             "\"000001\"",
9327             format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
9328   EXPECT_EQ("\"test\\000\"\n"
9329             "\"00000000\"\n"
9330             "\"1\"",
9331             format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
9332 }
9333 
9334 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
9335   verifyFormat("void f() {\n"
9336                "  return g() {}\n"
9337                "  void h() {}");
9338   verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
9339                "g();\n"
9340                "}");
9341 }
9342 
9343 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
9344   verifyFormat(
9345       "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
9346 }
9347 
9348 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
9349   verifyFormat("class X {\n"
9350                "  void f() {\n"
9351                "  }\n"
9352                "};",
9353                getLLVMStyleWithColumns(12));
9354 }
9355 
9356 TEST_F(FormatTest, ConfigurableIndentWidth) {
9357   FormatStyle EightIndent = getLLVMStyleWithColumns(18);
9358   EightIndent.IndentWidth = 8;
9359   EightIndent.ContinuationIndentWidth = 8;
9360   verifyFormat("void f() {\n"
9361                "        someFunction();\n"
9362                "        if (true) {\n"
9363                "                f();\n"
9364                "        }\n"
9365                "}",
9366                EightIndent);
9367   verifyFormat("class X {\n"
9368                "        void f() {\n"
9369                "        }\n"
9370                "};",
9371                EightIndent);
9372   verifyFormat("int x[] = {\n"
9373                "        call(),\n"
9374                "        call()};",
9375                EightIndent);
9376 }
9377 
9378 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
9379   verifyFormat("double\n"
9380                "f();",
9381                getLLVMStyleWithColumns(8));
9382 }
9383 
9384 TEST_F(FormatTest, ConfigurableUseOfTab) {
9385   FormatStyle Tab = getLLVMStyleWithColumns(42);
9386   Tab.IndentWidth = 8;
9387   Tab.UseTab = FormatStyle::UT_Always;
9388   Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
9389 
9390   EXPECT_EQ("if (aaaaaaaa && // q\n"
9391             "    bb)\t\t// w\n"
9392             "\t;",
9393             format("if (aaaaaaaa &&// q\n"
9394                    "bb)// w\n"
9395                    ";",
9396                    Tab));
9397   EXPECT_EQ("if (aaa && bbb) // w\n"
9398             "\t;",
9399             format("if(aaa&&bbb)// w\n"
9400                    ";",
9401                    Tab));
9402 
9403   verifyFormat("class X {\n"
9404                "\tvoid f() {\n"
9405                "\t\tsomeFunction(parameter1,\n"
9406                "\t\t\t     parameter2);\n"
9407                "\t}\n"
9408                "};",
9409                Tab);
9410   verifyFormat("#define A                        \\\n"
9411                "\tvoid f() {               \\\n"
9412                "\t\tsomeFunction(    \\\n"
9413                "\t\t    parameter1,  \\\n"
9414                "\t\t    parameter2); \\\n"
9415                "\t}",
9416                Tab);
9417   verifyFormat("int a;\t      // x\n"
9418                "int bbbbbbbb; // x\n",
9419                Tab);
9420 
9421   Tab.TabWidth = 4;
9422   Tab.IndentWidth = 8;
9423   verifyFormat("class TabWidth4Indent8 {\n"
9424                "\t\tvoid f() {\n"
9425                "\t\t\t\tsomeFunction(parameter1,\n"
9426                "\t\t\t\t\t\t\t parameter2);\n"
9427                "\t\t}\n"
9428                "};",
9429                Tab);
9430 
9431   Tab.TabWidth = 4;
9432   Tab.IndentWidth = 4;
9433   verifyFormat("class TabWidth4Indent4 {\n"
9434                "\tvoid f() {\n"
9435                "\t\tsomeFunction(parameter1,\n"
9436                "\t\t\t\t\t parameter2);\n"
9437                "\t}\n"
9438                "};",
9439                Tab);
9440 
9441   Tab.TabWidth = 8;
9442   Tab.IndentWidth = 4;
9443   verifyFormat("class TabWidth8Indent4 {\n"
9444                "    void f() {\n"
9445                "\tsomeFunction(parameter1,\n"
9446                "\t\t     parameter2);\n"
9447                "    }\n"
9448                "};",
9449                Tab);
9450 
9451   Tab.TabWidth = 8;
9452   Tab.IndentWidth = 8;
9453   EXPECT_EQ("/*\n"
9454             "\t      a\t\tcomment\n"
9455             "\t      in multiple lines\n"
9456             "       */",
9457             format("   /*\t \t \n"
9458                    " \t \t a\t\tcomment\t \t\n"
9459                    " \t \t in multiple lines\t\n"
9460                    " \t  */",
9461                    Tab));
9462 
9463   Tab.UseTab = FormatStyle::UT_ForIndentation;
9464   verifyFormat("{\n"
9465                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9466                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9467                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9468                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9469                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9470                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9471                "};",
9472                Tab);
9473   verifyFormat("enum AA {\n"
9474                "\ta1, // Force multiple lines\n"
9475                "\ta2,\n"
9476                "\ta3\n"
9477                "};",
9478                Tab);
9479   EXPECT_EQ("if (aaaaaaaa && // q\n"
9480             "    bb)         // w\n"
9481             "\t;",
9482             format("if (aaaaaaaa &&// q\n"
9483                    "bb)// w\n"
9484                    ";",
9485                    Tab));
9486   verifyFormat("class X {\n"
9487                "\tvoid f() {\n"
9488                "\t\tsomeFunction(parameter1,\n"
9489                "\t\t             parameter2);\n"
9490                "\t}\n"
9491                "};",
9492                Tab);
9493   verifyFormat("{\n"
9494                "\tQ(\n"
9495                "\t    {\n"
9496                "\t\t    int a;\n"
9497                "\t\t    someFunction(aaaaaaaa,\n"
9498                "\t\t                 bbbbbbb);\n"
9499                "\t    },\n"
9500                "\t    p);\n"
9501                "}",
9502                Tab);
9503   EXPECT_EQ("{\n"
9504             "\t/* aaaa\n"
9505             "\t   bbbb */\n"
9506             "}",
9507             format("{\n"
9508                    "/* aaaa\n"
9509                    "   bbbb */\n"
9510                    "}",
9511                    Tab));
9512   EXPECT_EQ("{\n"
9513             "\t/*\n"
9514             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9515             "\t  bbbbbbbbbbbbb\n"
9516             "\t*/\n"
9517             "}",
9518             format("{\n"
9519                    "/*\n"
9520                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9521                    "*/\n"
9522                    "}",
9523                    Tab));
9524   EXPECT_EQ("{\n"
9525             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9526             "\t// bbbbbbbbbbbbb\n"
9527             "}",
9528             format("{\n"
9529                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9530                    "}",
9531                    Tab));
9532   EXPECT_EQ("{\n"
9533             "\t/*\n"
9534             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9535             "\t  bbbbbbbbbbbbb\n"
9536             "\t*/\n"
9537             "}",
9538             format("{\n"
9539                    "\t/*\n"
9540                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9541                    "\t*/\n"
9542                    "}",
9543                    Tab));
9544   EXPECT_EQ("{\n"
9545             "\t/*\n"
9546             "\n"
9547             "\t*/\n"
9548             "}",
9549             format("{\n"
9550                    "\t/*\n"
9551                    "\n"
9552                    "\t*/\n"
9553                    "}",
9554                    Tab));
9555   EXPECT_EQ("{\n"
9556             "\t/*\n"
9557             " asdf\n"
9558             "\t*/\n"
9559             "}",
9560             format("{\n"
9561                    "\t/*\n"
9562                    " asdf\n"
9563                    "\t*/\n"
9564                    "}",
9565                    Tab));
9566 
9567   Tab.UseTab = FormatStyle::UT_Never;
9568   EXPECT_EQ("/*\n"
9569             "              a\t\tcomment\n"
9570             "              in multiple lines\n"
9571             "       */",
9572             format("   /*\t \t \n"
9573                    " \t \t a\t\tcomment\t \t\n"
9574                    " \t \t in multiple lines\t\n"
9575                    " \t  */",
9576                    Tab));
9577   EXPECT_EQ("/* some\n"
9578             "   comment */",
9579             format(" \t \t /* some\n"
9580                    " \t \t    comment */",
9581                    Tab));
9582   EXPECT_EQ("int a; /* some\n"
9583             "   comment */",
9584             format(" \t \t int a; /* some\n"
9585                    " \t \t    comment */",
9586                    Tab));
9587 
9588   EXPECT_EQ("int a; /* some\n"
9589             "comment */",
9590             format(" \t \t int\ta; /* some\n"
9591                    " \t \t    comment */",
9592                    Tab));
9593   EXPECT_EQ("f(\"\t\t\"); /* some\n"
9594             "    comment */",
9595             format(" \t \t f(\"\t\t\"); /* some\n"
9596                    " \t \t    comment */",
9597                    Tab));
9598   EXPECT_EQ("{\n"
9599             "  /*\n"
9600             "   * Comment\n"
9601             "   */\n"
9602             "  int i;\n"
9603             "}",
9604             format("{\n"
9605                    "\t/*\n"
9606                    "\t * Comment\n"
9607                    "\t */\n"
9608                    "\t int i;\n"
9609                    "}"));
9610 
9611   Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
9612   Tab.TabWidth = 8;
9613   Tab.IndentWidth = 8;
9614   EXPECT_EQ("if (aaaaaaaa && // q\n"
9615             "    bb)         // w\n"
9616             "\t;",
9617             format("if (aaaaaaaa &&// q\n"
9618                    "bb)// w\n"
9619                    ";",
9620                    Tab));
9621   EXPECT_EQ("if (aaa && bbb) // w\n"
9622             "\t;",
9623             format("if(aaa&&bbb)// w\n"
9624                    ";",
9625                    Tab));
9626   verifyFormat("class X {\n"
9627                "\tvoid f() {\n"
9628                "\t\tsomeFunction(parameter1,\n"
9629                "\t\t\t     parameter2);\n"
9630                "\t}\n"
9631                "};",
9632                Tab);
9633   verifyFormat("#define A                        \\\n"
9634                "\tvoid f() {               \\\n"
9635                "\t\tsomeFunction(    \\\n"
9636                "\t\t    parameter1,  \\\n"
9637                "\t\t    parameter2); \\\n"
9638                "\t}",
9639                Tab);
9640   Tab.TabWidth = 4;
9641   Tab.IndentWidth = 8;
9642   verifyFormat("class TabWidth4Indent8 {\n"
9643                "\t\tvoid f() {\n"
9644                "\t\t\t\tsomeFunction(parameter1,\n"
9645                "\t\t\t\t\t\t\t parameter2);\n"
9646                "\t\t}\n"
9647                "};",
9648                Tab);
9649   Tab.TabWidth = 4;
9650   Tab.IndentWidth = 4;
9651   verifyFormat("class TabWidth4Indent4 {\n"
9652                "\tvoid f() {\n"
9653                "\t\tsomeFunction(parameter1,\n"
9654                "\t\t\t\t\t parameter2);\n"
9655                "\t}\n"
9656                "};",
9657                Tab);
9658   Tab.TabWidth = 8;
9659   Tab.IndentWidth = 4;
9660   verifyFormat("class TabWidth8Indent4 {\n"
9661                "    void f() {\n"
9662                "\tsomeFunction(parameter1,\n"
9663                "\t\t     parameter2);\n"
9664                "    }\n"
9665                "};",
9666                Tab);
9667   Tab.TabWidth = 8;
9668   Tab.IndentWidth = 8;
9669   EXPECT_EQ("/*\n"
9670             "\t      a\t\tcomment\n"
9671             "\t      in multiple lines\n"
9672             "       */",
9673             format("   /*\t \t \n"
9674                    " \t \t a\t\tcomment\t \t\n"
9675                    " \t \t in multiple lines\t\n"
9676                    " \t  */",
9677                    Tab));
9678   verifyFormat("{\n"
9679                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9680                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9681                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9682                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9683                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9684                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9685                "};",
9686                Tab);
9687   verifyFormat("enum AA {\n"
9688                "\ta1, // Force multiple lines\n"
9689                "\ta2,\n"
9690                "\ta3\n"
9691                "};",
9692                Tab);
9693   EXPECT_EQ("if (aaaaaaaa && // q\n"
9694             "    bb)         // w\n"
9695             "\t;",
9696             format("if (aaaaaaaa &&// q\n"
9697                    "bb)// w\n"
9698                    ";",
9699                    Tab));
9700   verifyFormat("class X {\n"
9701                "\tvoid f() {\n"
9702                "\t\tsomeFunction(parameter1,\n"
9703                "\t\t\t     parameter2);\n"
9704                "\t}\n"
9705                "};",
9706                Tab);
9707   verifyFormat("{\n"
9708                "\tQ(\n"
9709                "\t    {\n"
9710                "\t\t    int a;\n"
9711                "\t\t    someFunction(aaaaaaaa,\n"
9712                "\t\t\t\t bbbbbbb);\n"
9713                "\t    },\n"
9714                "\t    p);\n"
9715                "}",
9716                Tab);
9717   EXPECT_EQ("{\n"
9718             "\t/* aaaa\n"
9719             "\t   bbbb */\n"
9720             "}",
9721             format("{\n"
9722                    "/* aaaa\n"
9723                    "   bbbb */\n"
9724                    "}",
9725                    Tab));
9726   EXPECT_EQ("{\n"
9727             "\t/*\n"
9728             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9729             "\t  bbbbbbbbbbbbb\n"
9730             "\t*/\n"
9731             "}",
9732             format("{\n"
9733                    "/*\n"
9734                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9735                    "*/\n"
9736                    "}",
9737                    Tab));
9738   EXPECT_EQ("{\n"
9739             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9740             "\t// bbbbbbbbbbbbb\n"
9741             "}",
9742             format("{\n"
9743                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9744                    "}",
9745                    Tab));
9746   EXPECT_EQ("{\n"
9747             "\t/*\n"
9748             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9749             "\t  bbbbbbbbbbbbb\n"
9750             "\t*/\n"
9751             "}",
9752             format("{\n"
9753                    "\t/*\n"
9754                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9755                    "\t*/\n"
9756                    "}",
9757                    Tab));
9758   EXPECT_EQ("{\n"
9759             "\t/*\n"
9760             "\n"
9761             "\t*/\n"
9762             "}",
9763             format("{\n"
9764                    "\t/*\n"
9765                    "\n"
9766                    "\t*/\n"
9767                    "}",
9768                    Tab));
9769   EXPECT_EQ("{\n"
9770             "\t/*\n"
9771             " asdf\n"
9772             "\t*/\n"
9773             "}",
9774             format("{\n"
9775                    "\t/*\n"
9776                    " asdf\n"
9777                    "\t*/\n"
9778                    "}",
9779                    Tab));
9780   EXPECT_EQ("/*\n"
9781             "\t      a\t\tcomment\n"
9782             "\t      in multiple lines\n"
9783             "       */",
9784             format("   /*\t \t \n"
9785                    " \t \t a\t\tcomment\t \t\n"
9786                    " \t \t in multiple lines\t\n"
9787                    " \t  */",
9788                    Tab));
9789   EXPECT_EQ("/* some\n"
9790             "   comment */",
9791             format(" \t \t /* some\n"
9792                    " \t \t    comment */",
9793                    Tab));
9794   EXPECT_EQ("int a; /* some\n"
9795             "   comment */",
9796             format(" \t \t int a; /* some\n"
9797                    " \t \t    comment */",
9798                    Tab));
9799   EXPECT_EQ("int a; /* some\n"
9800             "comment */",
9801             format(" \t \t int\ta; /* some\n"
9802                    " \t \t    comment */",
9803                    Tab));
9804   EXPECT_EQ("f(\"\t\t\"); /* some\n"
9805             "    comment */",
9806             format(" \t \t f(\"\t\t\"); /* some\n"
9807                    " \t \t    comment */",
9808                    Tab));
9809   EXPECT_EQ("{\n"
9810             "  /*\n"
9811             "   * Comment\n"
9812             "   */\n"
9813             "  int i;\n"
9814             "}",
9815             format("{\n"
9816                    "\t/*\n"
9817                    "\t * Comment\n"
9818                    "\t */\n"
9819                    "\t int i;\n"
9820                    "}"));
9821   Tab.AlignConsecutiveAssignments = true;
9822   Tab.AlignConsecutiveDeclarations = true;
9823   Tab.TabWidth = 4;
9824   Tab.IndentWidth = 4;
9825   verifyFormat("class Assign {\n"
9826                "\tvoid f() {\n"
9827                "\t\tint         x      = 123;\n"
9828                "\t\tint         random = 4;\n"
9829                "\t\tstd::string alphabet =\n"
9830                "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
9831                "\t}\n"
9832                "};",
9833                Tab);
9834 }
9835 
9836 TEST_F(FormatTest, CalculatesOriginalColumn) {
9837   EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9838             "q\"; /* some\n"
9839             "       comment */",
9840             format("  \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9841                    "q\"; /* some\n"
9842                    "       comment */",
9843                    getLLVMStyle()));
9844   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
9845             "/* some\n"
9846             "   comment */",
9847             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
9848                    " /* some\n"
9849                    "    comment */",
9850                    getLLVMStyle()));
9851   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9852             "qqq\n"
9853             "/* some\n"
9854             "   comment */",
9855             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9856                    "qqq\n"
9857                    " /* some\n"
9858                    "    comment */",
9859                    getLLVMStyle()));
9860   EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9861             "wwww; /* some\n"
9862             "         comment */",
9863             format("  inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9864                    "wwww; /* some\n"
9865                    "         comment */",
9866                    getLLVMStyle()));
9867 }
9868 
9869 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
9870   FormatStyle NoSpace = getLLVMStyle();
9871   NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
9872 
9873   verifyFormat("while(true)\n"
9874                "  continue;",
9875                NoSpace);
9876   verifyFormat("for(;;)\n"
9877                "  continue;",
9878                NoSpace);
9879   verifyFormat("if(true)\n"
9880                "  f();\n"
9881                "else if(true)\n"
9882                "  f();",
9883                NoSpace);
9884   verifyFormat("do {\n"
9885                "  do_something();\n"
9886                "} while(something());",
9887                NoSpace);
9888   verifyFormat("switch(x) {\n"
9889                "default:\n"
9890                "  break;\n"
9891                "}",
9892                NoSpace);
9893   verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
9894   verifyFormat("size_t x = sizeof(x);", NoSpace);
9895   verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
9896   verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
9897   verifyFormat("alignas(128) char a[128];", NoSpace);
9898   verifyFormat("size_t x = alignof(MyType);", NoSpace);
9899   verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
9900   verifyFormat("int f() throw(Deprecated);", NoSpace);
9901   verifyFormat("typedef void (*cb)(int);", NoSpace);
9902   verifyFormat("T A::operator()();", NoSpace);
9903   verifyFormat("X A::operator++(T);", NoSpace);
9904   verifyFormat("auto lambda = []() { return 0; };", NoSpace);
9905 
9906   FormatStyle Space = getLLVMStyle();
9907   Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
9908 
9909   verifyFormat("int f ();", Space);
9910   verifyFormat("void f (int a, T b) {\n"
9911                "  while (true)\n"
9912                "    continue;\n"
9913                "}",
9914                Space);
9915   verifyFormat("if (true)\n"
9916                "  f ();\n"
9917                "else if (true)\n"
9918                "  f ();",
9919                Space);
9920   verifyFormat("do {\n"
9921                "  do_something ();\n"
9922                "} while (something ());",
9923                Space);
9924   verifyFormat("switch (x) {\n"
9925                "default:\n"
9926                "  break;\n"
9927                "}",
9928                Space);
9929   verifyFormat("A::A () : a (1) {}", Space);
9930   verifyFormat("void f () __attribute__ ((asdf));", Space);
9931   verifyFormat("*(&a + 1);\n"
9932                "&((&a)[1]);\n"
9933                "a[(b + c) * d];\n"
9934                "(((a + 1) * 2) + 3) * 4;",
9935                Space);
9936   verifyFormat("#define A(x) x", Space);
9937   verifyFormat("#define A (x) x", Space);
9938   verifyFormat("#if defined(x)\n"
9939                "#endif",
9940                Space);
9941   verifyFormat("auto i = std::make_unique<int> (5);", Space);
9942   verifyFormat("size_t x = sizeof (x);", Space);
9943   verifyFormat("auto f (int x) -> decltype (x);", Space);
9944   verifyFormat("int f (T x) noexcept (x.create ());", Space);
9945   verifyFormat("alignas (128) char a[128];", Space);
9946   verifyFormat("size_t x = alignof (MyType);", Space);
9947   verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
9948   verifyFormat("int f () throw (Deprecated);", Space);
9949   verifyFormat("typedef void (*cb) (int);", Space);
9950   verifyFormat("T A::operator() ();", Space);
9951   verifyFormat("X A::operator++ (T);", Space);
9952   verifyFormat("auto lambda = [] () { return 0; };", Space);
9953   verifyFormat("int x = int (y);", Space);
9954 
9955   FormatStyle SomeSpace = getLLVMStyle();
9956   SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses;
9957 
9958   verifyFormat("[]() -> float {}", SomeSpace);
9959   verifyFormat("[] (auto foo) {}", SomeSpace);
9960   verifyFormat("[foo]() -> int {}", SomeSpace);
9961   verifyFormat("int f();", SomeSpace);
9962   verifyFormat("void f (int a, T b) {\n"
9963                "  while (true)\n"
9964                "    continue;\n"
9965                "}",
9966                SomeSpace);
9967   verifyFormat("if (true)\n"
9968                "  f();\n"
9969                "else if (true)\n"
9970                "  f();",
9971                SomeSpace);
9972   verifyFormat("do {\n"
9973                "  do_something();\n"
9974                "} while (something());",
9975                SomeSpace);
9976   verifyFormat("switch (x) {\n"
9977                "default:\n"
9978                "  break;\n"
9979                "}",
9980                SomeSpace);
9981   verifyFormat("A::A() : a (1) {}", SomeSpace);
9982   verifyFormat("void f() __attribute__ ((asdf));", SomeSpace);
9983   verifyFormat("*(&a + 1);\n"
9984                "&((&a)[1]);\n"
9985                "a[(b + c) * d];\n"
9986                "(((a + 1) * 2) + 3) * 4;",
9987                SomeSpace);
9988   verifyFormat("#define A(x) x", SomeSpace);
9989   verifyFormat("#define A (x) x", SomeSpace);
9990   verifyFormat("#if defined(x)\n"
9991                "#endif",
9992                SomeSpace);
9993   verifyFormat("auto i = std::make_unique<int> (5);", SomeSpace);
9994   verifyFormat("size_t x = sizeof (x);", SomeSpace);
9995   verifyFormat("auto f (int x) -> decltype (x);", SomeSpace);
9996   verifyFormat("int f (T x) noexcept (x.create());", SomeSpace);
9997   verifyFormat("alignas (128) char a[128];", SomeSpace);
9998   verifyFormat("size_t x = alignof (MyType);", SomeSpace);
9999   verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");",
10000                SomeSpace);
10001   verifyFormat("int f() throw (Deprecated);", SomeSpace);
10002   verifyFormat("typedef void (*cb) (int);", SomeSpace);
10003   verifyFormat("T A::operator()();", SomeSpace);
10004   verifyFormat("X A::operator++ (T);", SomeSpace);
10005   verifyFormat("int x = int (y);", SomeSpace);
10006   verifyFormat("auto lambda = []() { return 0; };", SomeSpace);
10007 }
10008 
10009 TEST_F(FormatTest, SpaceAfterLogicalNot) {
10010   FormatStyle Spaces = getLLVMStyle();
10011   Spaces.SpaceAfterLogicalNot = true;
10012 
10013   verifyFormat("bool x = ! y", Spaces);
10014   verifyFormat("if (! isFailure())", Spaces);
10015   verifyFormat("if (! (a && b))", Spaces);
10016   verifyFormat("\"Error!\"", Spaces);
10017   verifyFormat("! ! x", Spaces);
10018 }
10019 
10020 TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
10021   FormatStyle Spaces = getLLVMStyle();
10022 
10023   Spaces.SpacesInParentheses = true;
10024   verifyFormat("do_something( ::globalVar );", Spaces);
10025   verifyFormat("call( x, y, z );", Spaces);
10026   verifyFormat("call();", Spaces);
10027   verifyFormat("std::function<void( int, int )> callback;", Spaces);
10028   verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
10029                Spaces);
10030   verifyFormat("while ( (bool)1 )\n"
10031                "  continue;",
10032                Spaces);
10033   verifyFormat("for ( ;; )\n"
10034                "  continue;",
10035                Spaces);
10036   verifyFormat("if ( true )\n"
10037                "  f();\n"
10038                "else if ( true )\n"
10039                "  f();",
10040                Spaces);
10041   verifyFormat("do {\n"
10042                "  do_something( (int)i );\n"
10043                "} while ( something() );",
10044                Spaces);
10045   verifyFormat("switch ( x ) {\n"
10046                "default:\n"
10047                "  break;\n"
10048                "}",
10049                Spaces);
10050 
10051   Spaces.SpacesInParentheses = false;
10052   Spaces.SpacesInCStyleCastParentheses = true;
10053   verifyFormat("Type *A = ( Type * )P;", Spaces);
10054   verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
10055   verifyFormat("x = ( int32 )y;", Spaces);
10056   verifyFormat("int a = ( int )(2.0f);", Spaces);
10057   verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
10058   verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
10059   verifyFormat("#define x (( int )-1)", Spaces);
10060 
10061   // Run the first set of tests again with:
10062   Spaces.SpacesInParentheses = false;
10063   Spaces.SpaceInEmptyParentheses = true;
10064   Spaces.SpacesInCStyleCastParentheses = true;
10065   verifyFormat("call(x, y, z);", Spaces);
10066   verifyFormat("call( );", Spaces);
10067   verifyFormat("std::function<void(int, int)> callback;", Spaces);
10068   verifyFormat("while (( bool )1)\n"
10069                "  continue;",
10070                Spaces);
10071   verifyFormat("for (;;)\n"
10072                "  continue;",
10073                Spaces);
10074   verifyFormat("if (true)\n"
10075                "  f( );\n"
10076                "else if (true)\n"
10077                "  f( );",
10078                Spaces);
10079   verifyFormat("do {\n"
10080                "  do_something(( int )i);\n"
10081                "} while (something( ));",
10082                Spaces);
10083   verifyFormat("switch (x) {\n"
10084                "default:\n"
10085                "  break;\n"
10086                "}",
10087                Spaces);
10088 
10089   // Run the first set of tests again with:
10090   Spaces.SpaceAfterCStyleCast = true;
10091   verifyFormat("call(x, y, z);", Spaces);
10092   verifyFormat("call( );", Spaces);
10093   verifyFormat("std::function<void(int, int)> callback;", Spaces);
10094   verifyFormat("while (( bool ) 1)\n"
10095                "  continue;",
10096                Spaces);
10097   verifyFormat("for (;;)\n"
10098                "  continue;",
10099                Spaces);
10100   verifyFormat("if (true)\n"
10101                "  f( );\n"
10102                "else if (true)\n"
10103                "  f( );",
10104                Spaces);
10105   verifyFormat("do {\n"
10106                "  do_something(( int ) i);\n"
10107                "} while (something( ));",
10108                Spaces);
10109   verifyFormat("switch (x) {\n"
10110                "default:\n"
10111                "  break;\n"
10112                "}",
10113                Spaces);
10114 
10115   // Run subset of tests again with:
10116   Spaces.SpacesInCStyleCastParentheses = false;
10117   Spaces.SpaceAfterCStyleCast = true;
10118   verifyFormat("while ((bool) 1)\n"
10119                "  continue;",
10120                Spaces);
10121   verifyFormat("do {\n"
10122                "  do_something((int) i);\n"
10123                "} while (something( ));",
10124                Spaces);
10125 }
10126 
10127 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
10128   verifyFormat("int a[5];");
10129   verifyFormat("a[3] += 42;");
10130 
10131   FormatStyle Spaces = getLLVMStyle();
10132   Spaces.SpacesInSquareBrackets = true;
10133   // Lambdas unchanged.
10134   verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
10135   verifyFormat("return [i, args...] {};", Spaces);
10136 
10137   // Not lambdas.
10138   verifyFormat("int a[ 5 ];", Spaces);
10139   verifyFormat("a[ 3 ] += 42;", Spaces);
10140   verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
10141   verifyFormat("double &operator[](int i) { return 0; }\n"
10142                "int i;",
10143                Spaces);
10144   verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
10145   verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
10146   verifyFormat("int i = (*b)[ a ]->f();", Spaces);
10147 }
10148 
10149 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
10150   verifyFormat("int a = 5;");
10151   verifyFormat("a += 42;");
10152   verifyFormat("a or_eq 8;");
10153 
10154   FormatStyle Spaces = getLLVMStyle();
10155   Spaces.SpaceBeforeAssignmentOperators = false;
10156   verifyFormat("int a= 5;", Spaces);
10157   verifyFormat("a+= 42;", Spaces);
10158   verifyFormat("a or_eq 8;", Spaces);
10159 }
10160 
10161 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
10162   verifyFormat("class Foo : public Bar {};");
10163   verifyFormat("Foo::Foo() : foo(1) {}");
10164   verifyFormat("for (auto a : b) {\n}");
10165   verifyFormat("int x = a ? b : c;");
10166   verifyFormat("{\n"
10167                "label0:\n"
10168                "  int x = 0;\n"
10169                "}");
10170   verifyFormat("switch (x) {\n"
10171                "case 1:\n"
10172                "default:\n"
10173                "}");
10174 
10175   FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30);
10176   CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false;
10177   verifyFormat("class Foo : public Bar {};", CtorInitializerStyle);
10178   verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle);
10179   verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle);
10180   verifyFormat("int x = a ? b : c;", CtorInitializerStyle);
10181   verifyFormat("{\n"
10182                "label1:\n"
10183                "  int x = 0;\n"
10184                "}",
10185                CtorInitializerStyle);
10186   verifyFormat("switch (x) {\n"
10187                "case 1:\n"
10188                "default:\n"
10189                "}",
10190                CtorInitializerStyle);
10191   CtorInitializerStyle.BreakConstructorInitializers =
10192       FormatStyle::BCIS_AfterColon;
10193   verifyFormat("Fooooooooooo::Fooooooooooo():\n"
10194                "    aaaaaaaaaaaaaaaa(1),\n"
10195                "    bbbbbbbbbbbbbbbb(2) {}",
10196                CtorInitializerStyle);
10197   CtorInitializerStyle.BreakConstructorInitializers =
10198       FormatStyle::BCIS_BeforeComma;
10199   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
10200                "    : aaaaaaaaaaaaaaaa(1)\n"
10201                "    , bbbbbbbbbbbbbbbb(2) {}",
10202                CtorInitializerStyle);
10203   CtorInitializerStyle.BreakConstructorInitializers =
10204       FormatStyle::BCIS_BeforeColon;
10205   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
10206                "    : aaaaaaaaaaaaaaaa(1),\n"
10207                "      bbbbbbbbbbbbbbbb(2) {}",
10208                CtorInitializerStyle);
10209   CtorInitializerStyle.ConstructorInitializerIndentWidth = 0;
10210   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
10211                ": aaaaaaaaaaaaaaaa(1),\n"
10212                "  bbbbbbbbbbbbbbbb(2) {}",
10213                CtorInitializerStyle);
10214 
10215   FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30);
10216   InheritanceStyle.SpaceBeforeInheritanceColon = false;
10217   verifyFormat("class Foo: public Bar {};", InheritanceStyle);
10218   verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle);
10219   verifyFormat("for (auto a : b) {\n}", InheritanceStyle);
10220   verifyFormat("int x = a ? b : c;", InheritanceStyle);
10221   verifyFormat("{\n"
10222                "label2:\n"
10223                "  int x = 0;\n"
10224                "}",
10225                InheritanceStyle);
10226   verifyFormat("switch (x) {\n"
10227                "case 1:\n"
10228                "default:\n"
10229                "}",
10230                InheritanceStyle);
10231   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon;
10232   verifyFormat("class Foooooooooooooooooooooo:\n"
10233                "    public aaaaaaaaaaaaaaaaaa,\n"
10234                "    public bbbbbbbbbbbbbbbbbb {\n"
10235                "}",
10236                InheritanceStyle);
10237   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
10238   verifyFormat("class Foooooooooooooooooooooo\n"
10239                "    : public aaaaaaaaaaaaaaaaaa\n"
10240                "    , public bbbbbbbbbbbbbbbbbb {\n"
10241                "}",
10242                InheritanceStyle);
10243   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
10244   verifyFormat("class Foooooooooooooooooooooo\n"
10245                "    : public aaaaaaaaaaaaaaaaaa,\n"
10246                "      public bbbbbbbbbbbbbbbbbb {\n"
10247                "}",
10248                InheritanceStyle);
10249   InheritanceStyle.ConstructorInitializerIndentWidth = 0;
10250   verifyFormat("class Foooooooooooooooooooooo\n"
10251                ": public aaaaaaaaaaaaaaaaaa,\n"
10252                "  public bbbbbbbbbbbbbbbbbb {}",
10253                InheritanceStyle);
10254 
10255   FormatStyle ForLoopStyle = getLLVMStyle();
10256   ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false;
10257   verifyFormat("class Foo : public Bar {};", ForLoopStyle);
10258   verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle);
10259   verifyFormat("for (auto a: b) {\n}", ForLoopStyle);
10260   verifyFormat("int x = a ? b : c;", ForLoopStyle);
10261   verifyFormat("{\n"
10262                "label2:\n"
10263                "  int x = 0;\n"
10264                "}",
10265                ForLoopStyle);
10266   verifyFormat("switch (x) {\n"
10267                "case 1:\n"
10268                "default:\n"
10269                "}",
10270                ForLoopStyle);
10271 
10272   FormatStyle NoSpaceStyle = getLLVMStyle();
10273   NoSpaceStyle.SpaceBeforeCtorInitializerColon = false;
10274   NoSpaceStyle.SpaceBeforeInheritanceColon = false;
10275   NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false;
10276   verifyFormat("class Foo: public Bar {};", NoSpaceStyle);
10277   verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle);
10278   verifyFormat("for (auto a: b) {\n}", NoSpaceStyle);
10279   verifyFormat("int x = a ? b : c;", NoSpaceStyle);
10280   verifyFormat("{\n"
10281                "label3:\n"
10282                "  int x = 0;\n"
10283                "}",
10284                NoSpaceStyle);
10285   verifyFormat("switch (x) {\n"
10286                "case 1:\n"
10287                "default:\n"
10288                "}",
10289                NoSpaceStyle);
10290 }
10291 
10292 TEST_F(FormatTest, AlignConsecutiveMacros) {
10293   FormatStyle Style = getLLVMStyle();
10294   Style.AlignConsecutiveAssignments = true;
10295   Style.AlignConsecutiveDeclarations = true;
10296   Style.AlignConsecutiveMacros = false;
10297 
10298   verifyFormat("#define a 3\n"
10299                "#define bbbb 4\n"
10300                "#define ccc (5)",
10301                Style);
10302 
10303   verifyFormat("#define f(x) (x * x)\n"
10304                "#define fff(x, y, z) (x * y + z)\n"
10305                "#define ffff(x, y) (x - y)",
10306                Style);
10307 
10308   verifyFormat("#define foo(x, y) (x + y)\n"
10309                "#define bar (5, 6)(2 + 2)",
10310                Style);
10311 
10312   verifyFormat("#define a 3\n"
10313                "#define bbbb 4\n"
10314                "#define ccc (5)\n"
10315                "#define f(x) (x * x)\n"
10316                "#define fff(x, y, z) (x * y + z)\n"
10317                "#define ffff(x, y) (x - y)",
10318                Style);
10319 
10320   Style.AlignConsecutiveMacros = true;
10321   verifyFormat("#define a    3\n"
10322                "#define bbbb 4\n"
10323                "#define ccc  (5)",
10324                Style);
10325 
10326   verifyFormat("#define f(x)         (x * x)\n"
10327                "#define fff(x, y, z) (x * y + z)\n"
10328                "#define ffff(x, y)   (x - y)",
10329                Style);
10330 
10331   verifyFormat("#define foo(x, y) (x + y)\n"
10332                "#define bar       (5, 6)(2 + 2)",
10333                Style);
10334 
10335   verifyFormat("#define a            3\n"
10336                "#define bbbb         4\n"
10337                "#define ccc          (5)\n"
10338                "#define f(x)         (x * x)\n"
10339                "#define fff(x, y, z) (x * y + z)\n"
10340                "#define ffff(x, y)   (x - y)",
10341                Style);
10342 
10343   verifyFormat("#define a         5\n"
10344                "#define foo(x, y) (x + y)\n"
10345                "#define CCC       (6)\n"
10346                "auto lambda = []() {\n"
10347                "  auto  ii = 0;\n"
10348                "  float j  = 0;\n"
10349                "  return 0;\n"
10350                "};\n"
10351                "int   i  = 0;\n"
10352                "float i2 = 0;\n"
10353                "auto  v  = type{\n"
10354                "    i = 1,   //\n"
10355                "    (i = 2), //\n"
10356                "    i = 3    //\n"
10357                "};",
10358                Style);
10359 
10360   Style.AlignConsecutiveMacros = false;
10361   Style.ColumnLimit = 20;
10362 
10363   verifyFormat("#define a          \\\n"
10364                "  \"aabbbbbbbbbbbb\"\n"
10365                "#define D          \\\n"
10366                "  \"aabbbbbbbbbbbb\" \\\n"
10367                "  \"ccddeeeeeeeee\"\n"
10368                "#define B          \\\n"
10369                "  \"QQQQQQQQQQQQQ\"  \\\n"
10370                "  \"FFFFFFFFFFFFF\"  \\\n"
10371                "  \"LLLLLLLL\"\n",
10372                Style);
10373 
10374   Style.AlignConsecutiveMacros = true;
10375   verifyFormat("#define a          \\\n"
10376                "  \"aabbbbbbbbbbbb\"\n"
10377                "#define D          \\\n"
10378                "  \"aabbbbbbbbbbbb\" \\\n"
10379                "  \"ccddeeeeeeeee\"\n"
10380                "#define B          \\\n"
10381                "  \"QQQQQQQQQQQQQ\"  \\\n"
10382                "  \"FFFFFFFFFFFFF\"  \\\n"
10383                "  \"LLLLLLLL\"\n",
10384                Style);
10385 }
10386 
10387 TEST_F(FormatTest, AlignConsecutiveAssignments) {
10388   FormatStyle Alignment = getLLVMStyle();
10389   Alignment.AlignConsecutiveMacros = true;
10390   Alignment.AlignConsecutiveAssignments = false;
10391   verifyFormat("int a = 5;\n"
10392                "int oneTwoThree = 123;",
10393                Alignment);
10394   verifyFormat("int a = 5;\n"
10395                "int oneTwoThree = 123;",
10396                Alignment);
10397 
10398   Alignment.AlignConsecutiveAssignments = true;
10399   verifyFormat("int a           = 5;\n"
10400                "int oneTwoThree = 123;",
10401                Alignment);
10402   verifyFormat("int a           = method();\n"
10403                "int oneTwoThree = 133;",
10404                Alignment);
10405   verifyFormat("a &= 5;\n"
10406                "bcd *= 5;\n"
10407                "ghtyf += 5;\n"
10408                "dvfvdb -= 5;\n"
10409                "a /= 5;\n"
10410                "vdsvsv %= 5;\n"
10411                "sfdbddfbdfbb ^= 5;\n"
10412                "dvsdsv |= 5;\n"
10413                "int dsvvdvsdvvv = 123;",
10414                Alignment);
10415   verifyFormat("int i = 1, j = 10;\n"
10416                "something = 2000;",
10417                Alignment);
10418   verifyFormat("something = 2000;\n"
10419                "int i = 1, j = 10;\n",
10420                Alignment);
10421   verifyFormat("something = 2000;\n"
10422                "another   = 911;\n"
10423                "int i = 1, j = 10;\n"
10424                "oneMore = 1;\n"
10425                "i       = 2;",
10426                Alignment);
10427   verifyFormat("int a   = 5;\n"
10428                "int one = 1;\n"
10429                "method();\n"
10430                "int oneTwoThree = 123;\n"
10431                "int oneTwo      = 12;",
10432                Alignment);
10433   verifyFormat("int oneTwoThree = 123;\n"
10434                "int oneTwo      = 12;\n"
10435                "method();\n",
10436                Alignment);
10437   verifyFormat("int oneTwoThree = 123; // comment\n"
10438                "int oneTwo      = 12;  // comment",
10439                Alignment);
10440   EXPECT_EQ("int a = 5;\n"
10441             "\n"
10442             "int oneTwoThree = 123;",
10443             format("int a       = 5;\n"
10444                    "\n"
10445                    "int oneTwoThree= 123;",
10446                    Alignment));
10447   EXPECT_EQ("int a   = 5;\n"
10448             "int one = 1;\n"
10449             "\n"
10450             "int oneTwoThree = 123;",
10451             format("int a = 5;\n"
10452                    "int one = 1;\n"
10453                    "\n"
10454                    "int oneTwoThree = 123;",
10455                    Alignment));
10456   EXPECT_EQ("int a   = 5;\n"
10457             "int one = 1;\n"
10458             "\n"
10459             "int oneTwoThree = 123;\n"
10460             "int oneTwo      = 12;",
10461             format("int a = 5;\n"
10462                    "int one = 1;\n"
10463                    "\n"
10464                    "int oneTwoThree = 123;\n"
10465                    "int oneTwo = 12;",
10466                    Alignment));
10467   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
10468   verifyFormat("#define A \\\n"
10469                "  int aaaa       = 12; \\\n"
10470                "  int b          = 23; \\\n"
10471                "  int ccc        = 234; \\\n"
10472                "  int dddddddddd = 2345;",
10473                Alignment);
10474   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10475   verifyFormat("#define A               \\\n"
10476                "  int aaaa       = 12;  \\\n"
10477                "  int b          = 23;  \\\n"
10478                "  int ccc        = 234; \\\n"
10479                "  int dddddddddd = 2345;",
10480                Alignment);
10481   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
10482   verifyFormat("#define A                                                      "
10483                "                \\\n"
10484                "  int aaaa       = 12;                                         "
10485                "                \\\n"
10486                "  int b          = 23;                                         "
10487                "                \\\n"
10488                "  int ccc        = 234;                                        "
10489                "                \\\n"
10490                "  int dddddddddd = 2345;",
10491                Alignment);
10492   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
10493                "k = 4, int l = 5,\n"
10494                "                  int m = 6) {\n"
10495                "  int j      = 10;\n"
10496                "  otherThing = 1;\n"
10497                "}",
10498                Alignment);
10499   verifyFormat("void SomeFunction(int parameter = 0) {\n"
10500                "  int i   = 1;\n"
10501                "  int j   = 2;\n"
10502                "  int big = 10000;\n"
10503                "}",
10504                Alignment);
10505   verifyFormat("class C {\n"
10506                "public:\n"
10507                "  int i            = 1;\n"
10508                "  virtual void f() = 0;\n"
10509                "};",
10510                Alignment);
10511   verifyFormat("int i = 1;\n"
10512                "if (SomeType t = getSomething()) {\n"
10513                "}\n"
10514                "int j   = 2;\n"
10515                "int big = 10000;",
10516                Alignment);
10517   verifyFormat("int j = 7;\n"
10518                "for (int k = 0; k < N; ++k) {\n"
10519                "}\n"
10520                "int j   = 2;\n"
10521                "int big = 10000;\n"
10522                "}",
10523                Alignment);
10524   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
10525   verifyFormat("int i = 1;\n"
10526                "LooooooooooongType loooooooooooooooooooooongVariable\n"
10527                "    = someLooooooooooooooooongFunction();\n"
10528                "int j = 2;",
10529                Alignment);
10530   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
10531   verifyFormat("int i = 1;\n"
10532                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
10533                "    someLooooooooooooooooongFunction();\n"
10534                "int j = 2;",
10535                Alignment);
10536 
10537   verifyFormat("auto lambda = []() {\n"
10538                "  auto i = 0;\n"
10539                "  return 0;\n"
10540                "};\n"
10541                "int i  = 0;\n"
10542                "auto v = type{\n"
10543                "    i = 1,   //\n"
10544                "    (i = 2), //\n"
10545                "    i = 3    //\n"
10546                "};",
10547                Alignment);
10548 
10549   verifyFormat(
10550       "int i      = 1;\n"
10551       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
10552       "                          loooooooooooooooooooooongParameterB);\n"
10553       "int j      = 2;",
10554       Alignment);
10555 
10556   verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
10557                "          typename B   = very_long_type_name_1,\n"
10558                "          typename T_2 = very_long_type_name_2>\n"
10559                "auto foo() {}\n",
10560                Alignment);
10561   verifyFormat("int a, b = 1;\n"
10562                "int c  = 2;\n"
10563                "int dd = 3;\n",
10564                Alignment);
10565   verifyFormat("int aa       = ((1 > 2) ? 3 : 4);\n"
10566                "float b[1][] = {{3.f}};\n",
10567                Alignment);
10568   verifyFormat("for (int i = 0; i < 1; i++)\n"
10569                "  int x = 1;\n",
10570                Alignment);
10571   verifyFormat("for (i = 0; i < 1; i++)\n"
10572                "  x = 1;\n"
10573                "y = 1;\n",
10574                Alignment);
10575 }
10576 
10577 TEST_F(FormatTest, AlignConsecutiveDeclarations) {
10578   FormatStyle Alignment = getLLVMStyle();
10579   Alignment.AlignConsecutiveMacros = true;
10580   Alignment.AlignConsecutiveDeclarations = false;
10581   verifyFormat("float const a = 5;\n"
10582                "int oneTwoThree = 123;",
10583                Alignment);
10584   verifyFormat("int a = 5;\n"
10585                "float const oneTwoThree = 123;",
10586                Alignment);
10587 
10588   Alignment.AlignConsecutiveDeclarations = true;
10589   verifyFormat("float const a = 5;\n"
10590                "int         oneTwoThree = 123;",
10591                Alignment);
10592   verifyFormat("int         a = method();\n"
10593                "float const oneTwoThree = 133;",
10594                Alignment);
10595   verifyFormat("int i = 1, j = 10;\n"
10596                "something = 2000;",
10597                Alignment);
10598   verifyFormat("something = 2000;\n"
10599                "int i = 1, j = 10;\n",
10600                Alignment);
10601   verifyFormat("float      something = 2000;\n"
10602                "double     another = 911;\n"
10603                "int        i = 1, j = 10;\n"
10604                "const int *oneMore = 1;\n"
10605                "unsigned   i = 2;",
10606                Alignment);
10607   verifyFormat("float a = 5;\n"
10608                "int   one = 1;\n"
10609                "method();\n"
10610                "const double       oneTwoThree = 123;\n"
10611                "const unsigned int oneTwo = 12;",
10612                Alignment);
10613   verifyFormat("int      oneTwoThree{0}; // comment\n"
10614                "unsigned oneTwo;         // comment",
10615                Alignment);
10616   EXPECT_EQ("float const a = 5;\n"
10617             "\n"
10618             "int oneTwoThree = 123;",
10619             format("float const   a = 5;\n"
10620                    "\n"
10621                    "int           oneTwoThree= 123;",
10622                    Alignment));
10623   EXPECT_EQ("float a = 5;\n"
10624             "int   one = 1;\n"
10625             "\n"
10626             "unsigned oneTwoThree = 123;",
10627             format("float    a = 5;\n"
10628                    "int      one = 1;\n"
10629                    "\n"
10630                    "unsigned oneTwoThree = 123;",
10631                    Alignment));
10632   EXPECT_EQ("float a = 5;\n"
10633             "int   one = 1;\n"
10634             "\n"
10635             "unsigned oneTwoThree = 123;\n"
10636             "int      oneTwo = 12;",
10637             format("float    a = 5;\n"
10638                    "int one = 1;\n"
10639                    "\n"
10640                    "unsigned oneTwoThree = 123;\n"
10641                    "int oneTwo = 12;",
10642                    Alignment));
10643   // Function prototype alignment
10644   verifyFormat("int    a();\n"
10645                "double b();",
10646                Alignment);
10647   verifyFormat("int    a(int x);\n"
10648                "double b();",
10649                Alignment);
10650   unsigned OldColumnLimit = Alignment.ColumnLimit;
10651   // We need to set ColumnLimit to zero, in order to stress nested alignments,
10652   // otherwise the function parameters will be re-flowed onto a single line.
10653   Alignment.ColumnLimit = 0;
10654   EXPECT_EQ("int    a(int   x,\n"
10655             "         float y);\n"
10656             "double b(int    x,\n"
10657             "         double y);",
10658             format("int a(int x,\n"
10659                    " float y);\n"
10660                    "double b(int x,\n"
10661                    " double y);",
10662                    Alignment));
10663   // This ensures that function parameters of function declarations are
10664   // correctly indented when their owning functions are indented.
10665   // The failure case here is for 'double y' to not be indented enough.
10666   EXPECT_EQ("double a(int x);\n"
10667             "int    b(int    y,\n"
10668             "         double z);",
10669             format("double a(int x);\n"
10670                    "int b(int y,\n"
10671                    " double z);",
10672                    Alignment));
10673   // Set ColumnLimit low so that we induce wrapping immediately after
10674   // the function name and opening paren.
10675   Alignment.ColumnLimit = 13;
10676   verifyFormat("int function(\n"
10677                "    int  x,\n"
10678                "    bool y);",
10679                Alignment);
10680   Alignment.ColumnLimit = OldColumnLimit;
10681   // Ensure function pointers don't screw up recursive alignment
10682   verifyFormat("int    a(int x, void (*fp)(int y));\n"
10683                "double b();",
10684                Alignment);
10685   Alignment.AlignConsecutiveAssignments = true;
10686   // Ensure recursive alignment is broken by function braces, so that the
10687   // "a = 1" does not align with subsequent assignments inside the function
10688   // body.
10689   verifyFormat("int func(int a = 1) {\n"
10690                "  int b  = 2;\n"
10691                "  int cc = 3;\n"
10692                "}",
10693                Alignment);
10694   verifyFormat("float      something = 2000;\n"
10695                "double     another   = 911;\n"
10696                "int        i = 1, j = 10;\n"
10697                "const int *oneMore = 1;\n"
10698                "unsigned   i       = 2;",
10699                Alignment);
10700   verifyFormat("int      oneTwoThree = {0}; // comment\n"
10701                "unsigned oneTwo      = 0;   // comment",
10702                Alignment);
10703   // Make sure that scope is correctly tracked, in the absence of braces
10704   verifyFormat("for (int i = 0; i < n; i++)\n"
10705                "  j = i;\n"
10706                "double x = 1;\n",
10707                Alignment);
10708   verifyFormat("if (int i = 0)\n"
10709                "  j = i;\n"
10710                "double x = 1;\n",
10711                Alignment);
10712   // Ensure operator[] and operator() are comprehended
10713   verifyFormat("struct test {\n"
10714                "  long long int foo();\n"
10715                "  int           operator[](int a);\n"
10716                "  double        bar();\n"
10717                "};\n",
10718                Alignment);
10719   verifyFormat("struct test {\n"
10720                "  long long int foo();\n"
10721                "  int           operator()(int a);\n"
10722                "  double        bar();\n"
10723                "};\n",
10724                Alignment);
10725   EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
10726             "  int const i   = 1;\n"
10727             "  int *     j   = 2;\n"
10728             "  int       big = 10000;\n"
10729             "\n"
10730             "  unsigned oneTwoThree = 123;\n"
10731             "  int      oneTwo      = 12;\n"
10732             "  method();\n"
10733             "  float k  = 2;\n"
10734             "  int   ll = 10000;\n"
10735             "}",
10736             format("void SomeFunction(int parameter= 0) {\n"
10737                    " int const  i= 1;\n"
10738                    "  int *j=2;\n"
10739                    " int big  =  10000;\n"
10740                    "\n"
10741                    "unsigned oneTwoThree  =123;\n"
10742                    "int oneTwo = 12;\n"
10743                    "  method();\n"
10744                    "float k= 2;\n"
10745                    "int ll=10000;\n"
10746                    "}",
10747                    Alignment));
10748   Alignment.AlignConsecutiveAssignments = false;
10749   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
10750   verifyFormat("#define A \\\n"
10751                "  int       aaaa = 12; \\\n"
10752                "  float     b = 23; \\\n"
10753                "  const int ccc = 234; \\\n"
10754                "  unsigned  dddddddddd = 2345;",
10755                Alignment);
10756   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10757   verifyFormat("#define A              \\\n"
10758                "  int       aaaa = 12; \\\n"
10759                "  float     b = 23;    \\\n"
10760                "  const int ccc = 234; \\\n"
10761                "  unsigned  dddddddddd = 2345;",
10762                Alignment);
10763   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
10764   Alignment.ColumnLimit = 30;
10765   verifyFormat("#define A                    \\\n"
10766                "  int       aaaa = 12;       \\\n"
10767                "  float     b = 23;          \\\n"
10768                "  const int ccc = 234;       \\\n"
10769                "  int       dddddddddd = 2345;",
10770                Alignment);
10771   Alignment.ColumnLimit = 80;
10772   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
10773                "k = 4, int l = 5,\n"
10774                "                  int m = 6) {\n"
10775                "  const int j = 10;\n"
10776                "  otherThing = 1;\n"
10777                "}",
10778                Alignment);
10779   verifyFormat("void SomeFunction(int parameter = 0) {\n"
10780                "  int const i = 1;\n"
10781                "  int *     j = 2;\n"
10782                "  int       big = 10000;\n"
10783                "}",
10784                Alignment);
10785   verifyFormat("class C {\n"
10786                "public:\n"
10787                "  int          i = 1;\n"
10788                "  virtual void f() = 0;\n"
10789                "};",
10790                Alignment);
10791   verifyFormat("float i = 1;\n"
10792                "if (SomeType t = getSomething()) {\n"
10793                "}\n"
10794                "const unsigned j = 2;\n"
10795                "int            big = 10000;",
10796                Alignment);
10797   verifyFormat("float j = 7;\n"
10798                "for (int k = 0; k < N; ++k) {\n"
10799                "}\n"
10800                "unsigned j = 2;\n"
10801                "int      big = 10000;\n"
10802                "}",
10803                Alignment);
10804   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
10805   verifyFormat("float              i = 1;\n"
10806                "LooooooooooongType loooooooooooooooooooooongVariable\n"
10807                "    = someLooooooooooooooooongFunction();\n"
10808                "int j = 2;",
10809                Alignment);
10810   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
10811   verifyFormat("int                i = 1;\n"
10812                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
10813                "    someLooooooooooooooooongFunction();\n"
10814                "int j = 2;",
10815                Alignment);
10816 
10817   Alignment.AlignConsecutiveAssignments = true;
10818   verifyFormat("auto lambda = []() {\n"
10819                "  auto  ii = 0;\n"
10820                "  float j  = 0;\n"
10821                "  return 0;\n"
10822                "};\n"
10823                "int   i  = 0;\n"
10824                "float i2 = 0;\n"
10825                "auto  v  = type{\n"
10826                "    i = 1,   //\n"
10827                "    (i = 2), //\n"
10828                "    i = 3    //\n"
10829                "};",
10830                Alignment);
10831   Alignment.AlignConsecutiveAssignments = false;
10832 
10833   verifyFormat(
10834       "int      i = 1;\n"
10835       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
10836       "                          loooooooooooooooooooooongParameterB);\n"
10837       "int      j = 2;",
10838       Alignment);
10839 
10840   // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
10841   // We expect declarations and assignments to align, as long as it doesn't
10842   // exceed the column limit, starting a new alignment sequence whenever it
10843   // happens.
10844   Alignment.AlignConsecutiveAssignments = true;
10845   Alignment.ColumnLimit = 30;
10846   verifyFormat("float    ii              = 1;\n"
10847                "unsigned j               = 2;\n"
10848                "int someVerylongVariable = 1;\n"
10849                "AnotherLongType  ll = 123456;\n"
10850                "VeryVeryLongType k  = 2;\n"
10851                "int              myvar = 1;",
10852                Alignment);
10853   Alignment.ColumnLimit = 80;
10854   Alignment.AlignConsecutiveAssignments = false;
10855 
10856   verifyFormat(
10857       "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
10858       "          typename LongType, typename B>\n"
10859       "auto foo() {}\n",
10860       Alignment);
10861   verifyFormat("float a, b = 1;\n"
10862                "int   c = 2;\n"
10863                "int   dd = 3;\n",
10864                Alignment);
10865   verifyFormat("int   aa = ((1 > 2) ? 3 : 4);\n"
10866                "float b[1][] = {{3.f}};\n",
10867                Alignment);
10868   Alignment.AlignConsecutiveAssignments = true;
10869   verifyFormat("float a, b = 1;\n"
10870                "int   c  = 2;\n"
10871                "int   dd = 3;\n",
10872                Alignment);
10873   verifyFormat("int   aa     = ((1 > 2) ? 3 : 4);\n"
10874                "float b[1][] = {{3.f}};\n",
10875                Alignment);
10876   Alignment.AlignConsecutiveAssignments = false;
10877 
10878   Alignment.ColumnLimit = 30;
10879   Alignment.BinPackParameters = false;
10880   verifyFormat("void foo(float     a,\n"
10881                "         float     b,\n"
10882                "         int       c,\n"
10883                "         uint32_t *d) {\n"
10884                "  int *  e = 0;\n"
10885                "  float  f = 0;\n"
10886                "  double g = 0;\n"
10887                "}\n"
10888                "void bar(ino_t     a,\n"
10889                "         int       b,\n"
10890                "         uint32_t *c,\n"
10891                "         bool      d) {}\n",
10892                Alignment);
10893   Alignment.BinPackParameters = true;
10894   Alignment.ColumnLimit = 80;
10895 
10896   // Bug 33507
10897   Alignment.PointerAlignment = FormatStyle::PAS_Middle;
10898   verifyFormat(
10899       "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
10900       "  static const Version verVs2017;\n"
10901       "  return true;\n"
10902       "});\n",
10903       Alignment);
10904   Alignment.PointerAlignment = FormatStyle::PAS_Right;
10905 
10906   // See llvm.org/PR35641
10907   Alignment.AlignConsecutiveDeclarations = true;
10908   verifyFormat("int func() { //\n"
10909                "  int      b;\n"
10910                "  unsigned c;\n"
10911                "}",
10912                Alignment);
10913 
10914   // See PR37175
10915   FormatStyle Style = getMozillaStyle();
10916   Style.AlignConsecutiveDeclarations = true;
10917   EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n"
10918             "foo(int a);",
10919             format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style));
10920 }
10921 
10922 TEST_F(FormatTest, LinuxBraceBreaking) {
10923   FormatStyle LinuxBraceStyle = getLLVMStyle();
10924   LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
10925   verifyFormat("namespace a\n"
10926                "{\n"
10927                "class A\n"
10928                "{\n"
10929                "  void f()\n"
10930                "  {\n"
10931                "    if (true) {\n"
10932                "      a();\n"
10933                "      b();\n"
10934                "    } else {\n"
10935                "      a();\n"
10936                "    }\n"
10937                "  }\n"
10938                "  void g() { return; }\n"
10939                "};\n"
10940                "struct B {\n"
10941                "  int x;\n"
10942                "};\n"
10943                "} // namespace a\n",
10944                LinuxBraceStyle);
10945   verifyFormat("enum X {\n"
10946                "  Y = 0,\n"
10947                "}\n",
10948                LinuxBraceStyle);
10949   verifyFormat("struct S {\n"
10950                "  int Type;\n"
10951                "  union {\n"
10952                "    int x;\n"
10953                "    double y;\n"
10954                "  } Value;\n"
10955                "  class C\n"
10956                "  {\n"
10957                "    MyFavoriteType Value;\n"
10958                "  } Class;\n"
10959                "}\n",
10960                LinuxBraceStyle);
10961 }
10962 
10963 TEST_F(FormatTest, MozillaBraceBreaking) {
10964   FormatStyle MozillaBraceStyle = getLLVMStyle();
10965   MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
10966   MozillaBraceStyle.FixNamespaceComments = false;
10967   verifyFormat("namespace a {\n"
10968                "class A\n"
10969                "{\n"
10970                "  void f()\n"
10971                "  {\n"
10972                "    if (true) {\n"
10973                "      a();\n"
10974                "      b();\n"
10975                "    }\n"
10976                "  }\n"
10977                "  void g() { return; }\n"
10978                "};\n"
10979                "enum E\n"
10980                "{\n"
10981                "  A,\n"
10982                "  // foo\n"
10983                "  B,\n"
10984                "  C\n"
10985                "};\n"
10986                "struct B\n"
10987                "{\n"
10988                "  int x;\n"
10989                "};\n"
10990                "}\n",
10991                MozillaBraceStyle);
10992   verifyFormat("struct S\n"
10993                "{\n"
10994                "  int Type;\n"
10995                "  union\n"
10996                "  {\n"
10997                "    int x;\n"
10998                "    double y;\n"
10999                "  } Value;\n"
11000                "  class C\n"
11001                "  {\n"
11002                "    MyFavoriteType Value;\n"
11003                "  } Class;\n"
11004                "}\n",
11005                MozillaBraceStyle);
11006 }
11007 
11008 TEST_F(FormatTest, StroustrupBraceBreaking) {
11009   FormatStyle StroustrupBraceStyle = getLLVMStyle();
11010   StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
11011   verifyFormat("namespace a {\n"
11012                "class A {\n"
11013                "  void f()\n"
11014                "  {\n"
11015                "    if (true) {\n"
11016                "      a();\n"
11017                "      b();\n"
11018                "    }\n"
11019                "  }\n"
11020                "  void g() { return; }\n"
11021                "};\n"
11022                "struct B {\n"
11023                "  int x;\n"
11024                "};\n"
11025                "} // namespace a\n",
11026                StroustrupBraceStyle);
11027 
11028   verifyFormat("void foo()\n"
11029                "{\n"
11030                "  if (a) {\n"
11031                "    a();\n"
11032                "  }\n"
11033                "  else {\n"
11034                "    b();\n"
11035                "  }\n"
11036                "}\n",
11037                StroustrupBraceStyle);
11038 
11039   verifyFormat("#ifdef _DEBUG\n"
11040                "int foo(int i = 0)\n"
11041                "#else\n"
11042                "int foo(int i = 5)\n"
11043                "#endif\n"
11044                "{\n"
11045                "  return i;\n"
11046                "}",
11047                StroustrupBraceStyle);
11048 
11049   verifyFormat("void foo() {}\n"
11050                "void bar()\n"
11051                "#ifdef _DEBUG\n"
11052                "{\n"
11053                "  foo();\n"
11054                "}\n"
11055                "#else\n"
11056                "{\n"
11057                "}\n"
11058                "#endif",
11059                StroustrupBraceStyle);
11060 
11061   verifyFormat("void foobar() { int i = 5; }\n"
11062                "#ifdef _DEBUG\n"
11063                "void bar() {}\n"
11064                "#else\n"
11065                "void bar() { foobar(); }\n"
11066                "#endif",
11067                StroustrupBraceStyle);
11068 }
11069 
11070 TEST_F(FormatTest, AllmanBraceBreaking) {
11071   FormatStyle AllmanBraceStyle = getLLVMStyle();
11072   AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
11073 
11074   EXPECT_EQ("namespace a\n"
11075             "{\n"
11076             "void f();\n"
11077             "void g();\n"
11078             "} // namespace a\n",
11079             format("namespace a\n"
11080                    "{\n"
11081                    "void f();\n"
11082                    "void g();\n"
11083                    "}\n",
11084                    AllmanBraceStyle));
11085 
11086   verifyFormat("namespace a\n"
11087                "{\n"
11088                "class A\n"
11089                "{\n"
11090                "  void f()\n"
11091                "  {\n"
11092                "    if (true)\n"
11093                "    {\n"
11094                "      a();\n"
11095                "      b();\n"
11096                "    }\n"
11097                "  }\n"
11098                "  void g() { return; }\n"
11099                "};\n"
11100                "struct B\n"
11101                "{\n"
11102                "  int x;\n"
11103                "};\n"
11104                "union C\n"
11105                "{\n"
11106                "};\n"
11107                "} // namespace a",
11108                AllmanBraceStyle);
11109 
11110   verifyFormat("void f()\n"
11111                "{\n"
11112                "  if (true)\n"
11113                "  {\n"
11114                "    a();\n"
11115                "  }\n"
11116                "  else if (false)\n"
11117                "  {\n"
11118                "    b();\n"
11119                "  }\n"
11120                "  else\n"
11121                "  {\n"
11122                "    c();\n"
11123                "  }\n"
11124                "}\n",
11125                AllmanBraceStyle);
11126 
11127   verifyFormat("void f()\n"
11128                "{\n"
11129                "  for (int i = 0; i < 10; ++i)\n"
11130                "  {\n"
11131                "    a();\n"
11132                "  }\n"
11133                "  while (false)\n"
11134                "  {\n"
11135                "    b();\n"
11136                "  }\n"
11137                "  do\n"
11138                "  {\n"
11139                "    c();\n"
11140                "  } while (false)\n"
11141                "}\n",
11142                AllmanBraceStyle);
11143 
11144   verifyFormat("void f(int a)\n"
11145                "{\n"
11146                "  switch (a)\n"
11147                "  {\n"
11148                "  case 0:\n"
11149                "    break;\n"
11150                "  case 1:\n"
11151                "  {\n"
11152                "    break;\n"
11153                "  }\n"
11154                "  case 2:\n"
11155                "  {\n"
11156                "  }\n"
11157                "  break;\n"
11158                "  default:\n"
11159                "    break;\n"
11160                "  }\n"
11161                "}\n",
11162                AllmanBraceStyle);
11163 
11164   verifyFormat("enum X\n"
11165                "{\n"
11166                "  Y = 0,\n"
11167                "}\n",
11168                AllmanBraceStyle);
11169   verifyFormat("enum X\n"
11170                "{\n"
11171                "  Y = 0\n"
11172                "}\n",
11173                AllmanBraceStyle);
11174 
11175   verifyFormat("@interface BSApplicationController ()\n"
11176                "{\n"
11177                "@private\n"
11178                "  id _extraIvar;\n"
11179                "}\n"
11180                "@end\n",
11181                AllmanBraceStyle);
11182 
11183   verifyFormat("#ifdef _DEBUG\n"
11184                "int foo(int i = 0)\n"
11185                "#else\n"
11186                "int foo(int i = 5)\n"
11187                "#endif\n"
11188                "{\n"
11189                "  return i;\n"
11190                "}",
11191                AllmanBraceStyle);
11192 
11193   verifyFormat("void foo() {}\n"
11194                "void bar()\n"
11195                "#ifdef _DEBUG\n"
11196                "{\n"
11197                "  foo();\n"
11198                "}\n"
11199                "#else\n"
11200                "{\n"
11201                "}\n"
11202                "#endif",
11203                AllmanBraceStyle);
11204 
11205   verifyFormat("void foobar() { int i = 5; }\n"
11206                "#ifdef _DEBUG\n"
11207                "void bar() {}\n"
11208                "#else\n"
11209                "void bar() { foobar(); }\n"
11210                "#endif",
11211                AllmanBraceStyle);
11212 
11213   // This shouldn't affect ObjC blocks..
11214   verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
11215                "  // ...\n"
11216                "  int i;\n"
11217                "}];",
11218                AllmanBraceStyle);
11219   verifyFormat("void (^block)(void) = ^{\n"
11220                "  // ...\n"
11221                "  int i;\n"
11222                "};",
11223                AllmanBraceStyle);
11224   // .. or dict literals.
11225   verifyFormat("void f()\n"
11226                "{\n"
11227                "  // ...\n"
11228                "  [object someMethod:@{@\"a\" : @\"b\"}];\n"
11229                "}",
11230                AllmanBraceStyle);
11231   verifyFormat("void f()\n"
11232                "{\n"
11233                "  // ...\n"
11234                "  [object someMethod:@{a : @\"b\"}];\n"
11235                "}",
11236                AllmanBraceStyle);
11237   verifyFormat("int f()\n"
11238                "{ // comment\n"
11239                "  return 42;\n"
11240                "}",
11241                AllmanBraceStyle);
11242 
11243   AllmanBraceStyle.ColumnLimit = 19;
11244   verifyFormat("void f() { int i; }", AllmanBraceStyle);
11245   AllmanBraceStyle.ColumnLimit = 18;
11246   verifyFormat("void f()\n"
11247                "{\n"
11248                "  int i;\n"
11249                "}",
11250                AllmanBraceStyle);
11251   AllmanBraceStyle.ColumnLimit = 80;
11252 
11253   FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
11254   BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine =
11255       FormatStyle::SIS_WithoutElse;
11256   BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
11257   verifyFormat("void f(bool b)\n"
11258                "{\n"
11259                "  if (b)\n"
11260                "  {\n"
11261                "    return;\n"
11262                "  }\n"
11263                "}\n",
11264                BreakBeforeBraceShortIfs);
11265   verifyFormat("void f(bool b)\n"
11266                "{\n"
11267                "  if constexpr (b)\n"
11268                "  {\n"
11269                "    return;\n"
11270                "  }\n"
11271                "}\n",
11272                BreakBeforeBraceShortIfs);
11273   verifyFormat("void f(bool b)\n"
11274                "{\n"
11275                "  if CONSTEXPR (b)\n"
11276                "  {\n"
11277                "    return;\n"
11278                "  }\n"
11279                "}\n",
11280                BreakBeforeBraceShortIfs);
11281   verifyFormat("void f(bool b)\n"
11282                "{\n"
11283                "  if (b) return;\n"
11284                "}\n",
11285                BreakBeforeBraceShortIfs);
11286   verifyFormat("void f(bool b)\n"
11287                "{\n"
11288                "  if constexpr (b) return;\n"
11289                "}\n",
11290                BreakBeforeBraceShortIfs);
11291   verifyFormat("void f(bool b)\n"
11292                "{\n"
11293                "  if CONSTEXPR (b) return;\n"
11294                "}\n",
11295                BreakBeforeBraceShortIfs);
11296   verifyFormat("void f(bool b)\n"
11297                "{\n"
11298                "  while (b)\n"
11299                "  {\n"
11300                "    return;\n"
11301                "  }\n"
11302                "}\n",
11303                BreakBeforeBraceShortIfs);
11304 }
11305 
11306 TEST_F(FormatTest, GNUBraceBreaking) {
11307   FormatStyle GNUBraceStyle = getLLVMStyle();
11308   GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
11309   verifyFormat("namespace a\n"
11310                "{\n"
11311                "class A\n"
11312                "{\n"
11313                "  void f()\n"
11314                "  {\n"
11315                "    int a;\n"
11316                "    {\n"
11317                "      int b;\n"
11318                "    }\n"
11319                "    if (true)\n"
11320                "      {\n"
11321                "        a();\n"
11322                "        b();\n"
11323                "      }\n"
11324                "  }\n"
11325                "  void g() { return; }\n"
11326                "}\n"
11327                "} // namespace a",
11328                GNUBraceStyle);
11329 
11330   verifyFormat("void f()\n"
11331                "{\n"
11332                "  if (true)\n"
11333                "    {\n"
11334                "      a();\n"
11335                "    }\n"
11336                "  else if (false)\n"
11337                "    {\n"
11338                "      b();\n"
11339                "    }\n"
11340                "  else\n"
11341                "    {\n"
11342                "      c();\n"
11343                "    }\n"
11344                "}\n",
11345                GNUBraceStyle);
11346 
11347   verifyFormat("void f()\n"
11348                "{\n"
11349                "  for (int i = 0; i < 10; ++i)\n"
11350                "    {\n"
11351                "      a();\n"
11352                "    }\n"
11353                "  while (false)\n"
11354                "    {\n"
11355                "      b();\n"
11356                "    }\n"
11357                "  do\n"
11358                "    {\n"
11359                "      c();\n"
11360                "    }\n"
11361                "  while (false);\n"
11362                "}\n",
11363                GNUBraceStyle);
11364 
11365   verifyFormat("void f(int a)\n"
11366                "{\n"
11367                "  switch (a)\n"
11368                "    {\n"
11369                "    case 0:\n"
11370                "      break;\n"
11371                "    case 1:\n"
11372                "      {\n"
11373                "        break;\n"
11374                "      }\n"
11375                "    case 2:\n"
11376                "      {\n"
11377                "      }\n"
11378                "      break;\n"
11379                "    default:\n"
11380                "      break;\n"
11381                "    }\n"
11382                "}\n",
11383                GNUBraceStyle);
11384 
11385   verifyFormat("enum X\n"
11386                "{\n"
11387                "  Y = 0,\n"
11388                "}\n",
11389                GNUBraceStyle);
11390 
11391   verifyFormat("@interface BSApplicationController ()\n"
11392                "{\n"
11393                "@private\n"
11394                "  id _extraIvar;\n"
11395                "}\n"
11396                "@end\n",
11397                GNUBraceStyle);
11398 
11399   verifyFormat("#ifdef _DEBUG\n"
11400                "int foo(int i = 0)\n"
11401                "#else\n"
11402                "int foo(int i = 5)\n"
11403                "#endif\n"
11404                "{\n"
11405                "  return i;\n"
11406                "}",
11407                GNUBraceStyle);
11408 
11409   verifyFormat("void foo() {}\n"
11410                "void bar()\n"
11411                "#ifdef _DEBUG\n"
11412                "{\n"
11413                "  foo();\n"
11414                "}\n"
11415                "#else\n"
11416                "{\n"
11417                "}\n"
11418                "#endif",
11419                GNUBraceStyle);
11420 
11421   verifyFormat("void foobar() { int i = 5; }\n"
11422                "#ifdef _DEBUG\n"
11423                "void bar() {}\n"
11424                "#else\n"
11425                "void bar() { foobar(); }\n"
11426                "#endif",
11427                GNUBraceStyle);
11428 }
11429 
11430 TEST_F(FormatTest, WebKitBraceBreaking) {
11431   FormatStyle WebKitBraceStyle = getLLVMStyle();
11432   WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
11433   WebKitBraceStyle.FixNamespaceComments = false;
11434   verifyFormat("namespace a {\n"
11435                "class A {\n"
11436                "  void f()\n"
11437                "  {\n"
11438                "    if (true) {\n"
11439                "      a();\n"
11440                "      b();\n"
11441                "    }\n"
11442                "  }\n"
11443                "  void g() { return; }\n"
11444                "};\n"
11445                "enum E {\n"
11446                "  A,\n"
11447                "  // foo\n"
11448                "  B,\n"
11449                "  C\n"
11450                "};\n"
11451                "struct B {\n"
11452                "  int x;\n"
11453                "};\n"
11454                "}\n",
11455                WebKitBraceStyle);
11456   verifyFormat("struct S {\n"
11457                "  int Type;\n"
11458                "  union {\n"
11459                "    int x;\n"
11460                "    double y;\n"
11461                "  } Value;\n"
11462                "  class C {\n"
11463                "    MyFavoriteType Value;\n"
11464                "  } Class;\n"
11465                "};\n",
11466                WebKitBraceStyle);
11467 }
11468 
11469 TEST_F(FormatTest, CatchExceptionReferenceBinding) {
11470   verifyFormat("void f() {\n"
11471                "  try {\n"
11472                "  } catch (const Exception &e) {\n"
11473                "  }\n"
11474                "}\n",
11475                getLLVMStyle());
11476 }
11477 
11478 TEST_F(FormatTest, UnderstandsPragmas) {
11479   verifyFormat("#pragma omp reduction(| : var)");
11480   verifyFormat("#pragma omp reduction(+ : var)");
11481 
11482   EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
11483             "(including parentheses).",
11484             format("#pragma    mark   Any non-hyphenated or hyphenated string "
11485                    "(including parentheses)."));
11486 }
11487 
11488 TEST_F(FormatTest, UnderstandPragmaOption) {
11489   verifyFormat("#pragma option -C -A");
11490 
11491   EXPECT_EQ("#pragma option -C -A", format("#pragma    option   -C   -A"));
11492 }
11493 
11494 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
11495   FormatStyle Style = getLLVMStyle();
11496   Style.ColumnLimit = 20;
11497 
11498   // See PR41213
11499   EXPECT_EQ("/*\n"
11500             " *\t9012345\n"
11501             " * /8901\n"
11502             " */",
11503             format("/*\n"
11504                    " *\t9012345 /8901\n"
11505                    " */",
11506                    Style));
11507   EXPECT_EQ("/*\n"
11508             " *345678\n"
11509             " *\t/8901\n"
11510             " */",
11511             format("/*\n"
11512                    " *345678\t/8901\n"
11513                    " */",
11514                    Style));
11515 
11516   verifyFormat("int a; // the\n"
11517                "       // comment", Style);
11518   EXPECT_EQ("int a; /* first line\n"
11519             "        * second\n"
11520             "        * line third\n"
11521             "        * line\n"
11522             "        */",
11523             format("int a; /* first line\n"
11524                    "        * second\n"
11525                    "        * line third\n"
11526                    "        * line\n"
11527                    "        */",
11528                    Style));
11529   EXPECT_EQ("int a; // first line\n"
11530             "       // second\n"
11531             "       // line third\n"
11532             "       // line",
11533             format("int a; // first line\n"
11534                    "       // second line\n"
11535                    "       // third line",
11536                    Style));
11537 
11538   Style.PenaltyExcessCharacter = 90;
11539   verifyFormat("int a; // the comment", Style);
11540   EXPECT_EQ("int a; // the comment\n"
11541             "       // aaa",
11542             format("int a; // the comment aaa", Style));
11543   EXPECT_EQ("int a; /* first line\n"
11544             "        * second line\n"
11545             "        * third line\n"
11546             "        */",
11547             format("int a; /* first line\n"
11548                    "        * second line\n"
11549                    "        * third line\n"
11550                    "        */",
11551                    Style));
11552   EXPECT_EQ("int a; // first line\n"
11553             "       // second line\n"
11554             "       // third line",
11555             format("int a; // first line\n"
11556                    "       // second line\n"
11557                    "       // third line",
11558                    Style));
11559   // FIXME: Investigate why this is not getting the same layout as the test
11560   // above.
11561   EXPECT_EQ("int a; /* first line\n"
11562             "        * second line\n"
11563             "        * third line\n"
11564             "        */",
11565             format("int a; /* first line second line third line"
11566                    "\n*/",
11567                    Style));
11568 
11569   EXPECT_EQ("// foo bar baz bazfoo\n"
11570             "// foo bar foo bar\n",
11571             format("// foo bar baz bazfoo\n"
11572                    "// foo bar foo           bar\n",
11573                    Style));
11574   EXPECT_EQ("// foo bar baz bazfoo\n"
11575             "// foo bar foo bar\n",
11576             format("// foo bar baz      bazfoo\n"
11577                    "// foo            bar foo bar\n",
11578                    Style));
11579 
11580   // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
11581   // next one.
11582   EXPECT_EQ("// foo bar baz bazfoo\n"
11583             "// bar foo bar\n",
11584             format("// foo bar baz      bazfoo bar\n"
11585                    "// foo            bar\n",
11586                    Style));
11587 
11588   EXPECT_EQ("// foo bar baz bazfoo\n"
11589             "// foo bar baz bazfoo\n"
11590             "// bar foo bar\n",
11591             format("// foo bar baz      bazfoo\n"
11592                    "// foo bar baz      bazfoo bar\n"
11593                    "// foo bar\n",
11594                    Style));
11595 
11596   EXPECT_EQ("// foo bar baz bazfoo\n"
11597             "// foo bar baz bazfoo\n"
11598             "// bar foo bar\n",
11599             format("// foo bar baz      bazfoo\n"
11600                    "// foo bar baz      bazfoo bar\n"
11601                    "// foo           bar\n",
11602                    Style));
11603 
11604   // Make sure we do not keep protruding characters if strict mode reflow is
11605   // cheaper than keeping protruding characters.
11606   Style.ColumnLimit = 21;
11607   EXPECT_EQ("// foo foo foo foo\n"
11608             "// foo foo foo foo\n"
11609             "// foo foo foo foo\n",
11610             format("// foo foo foo foo foo foo foo foo foo foo foo foo\n",
11611                            Style));
11612 
11613   EXPECT_EQ("int a = /* long block\n"
11614             "           comment */\n"
11615             "    42;",
11616             format("int a = /* long block comment */ 42;", Style));
11617 }
11618 
11619 #define EXPECT_ALL_STYLES_EQUAL(Styles)                                        \
11620   for (size_t i = 1; i < Styles.size(); ++i)                                   \
11621   EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
11622                                   << " differs from Style #0"
11623 
11624 TEST_F(FormatTest, GetsPredefinedStyleByName) {
11625   SmallVector<FormatStyle, 3> Styles;
11626   Styles.resize(3);
11627 
11628   Styles[0] = getLLVMStyle();
11629   EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
11630   EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
11631   EXPECT_ALL_STYLES_EQUAL(Styles);
11632 
11633   Styles[0] = getGoogleStyle();
11634   EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
11635   EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
11636   EXPECT_ALL_STYLES_EQUAL(Styles);
11637 
11638   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
11639   EXPECT_TRUE(
11640       getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
11641   EXPECT_TRUE(
11642       getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
11643   EXPECT_ALL_STYLES_EQUAL(Styles);
11644 
11645   Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
11646   EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
11647   EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
11648   EXPECT_ALL_STYLES_EQUAL(Styles);
11649 
11650   Styles[0] = getMozillaStyle();
11651   EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
11652   EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
11653   EXPECT_ALL_STYLES_EQUAL(Styles);
11654 
11655   Styles[0] = getWebKitStyle();
11656   EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
11657   EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
11658   EXPECT_ALL_STYLES_EQUAL(Styles);
11659 
11660   Styles[0] = getGNUStyle();
11661   EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
11662   EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
11663   EXPECT_ALL_STYLES_EQUAL(Styles);
11664 
11665   EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
11666 }
11667 
11668 TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
11669   SmallVector<FormatStyle, 8> Styles;
11670   Styles.resize(2);
11671 
11672   Styles[0] = getGoogleStyle();
11673   Styles[1] = getLLVMStyle();
11674   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
11675   EXPECT_ALL_STYLES_EQUAL(Styles);
11676 
11677   Styles.resize(5);
11678   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
11679   Styles[1] = getLLVMStyle();
11680   Styles[1].Language = FormatStyle::LK_JavaScript;
11681   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
11682 
11683   Styles[2] = getLLVMStyle();
11684   Styles[2].Language = FormatStyle::LK_JavaScript;
11685   EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
11686                                   "BasedOnStyle: Google",
11687                                   &Styles[2])
11688                    .value());
11689 
11690   Styles[3] = getLLVMStyle();
11691   Styles[3].Language = FormatStyle::LK_JavaScript;
11692   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
11693                                   "Language: JavaScript",
11694                                   &Styles[3])
11695                    .value());
11696 
11697   Styles[4] = getLLVMStyle();
11698   Styles[4].Language = FormatStyle::LK_JavaScript;
11699   EXPECT_EQ(0, parseConfiguration("---\n"
11700                                   "BasedOnStyle: LLVM\n"
11701                                   "IndentWidth: 123\n"
11702                                   "---\n"
11703                                   "BasedOnStyle: Google\n"
11704                                   "Language: JavaScript",
11705                                   &Styles[4])
11706                    .value());
11707   EXPECT_ALL_STYLES_EQUAL(Styles);
11708 }
11709 
11710 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME)                             \
11711   Style.FIELD = false;                                                         \
11712   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value());      \
11713   EXPECT_TRUE(Style.FIELD);                                                    \
11714   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value());     \
11715   EXPECT_FALSE(Style.FIELD);
11716 
11717 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
11718 
11719 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME)              \
11720   Style.STRUCT.FIELD = false;                                                  \
11721   EXPECT_EQ(0,                                                                 \
11722             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": true", &Style)   \
11723                 .value());                                                     \
11724   EXPECT_TRUE(Style.STRUCT.FIELD);                                             \
11725   EXPECT_EQ(0,                                                                 \
11726             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": false", &Style)  \
11727                 .value());                                                     \
11728   EXPECT_FALSE(Style.STRUCT.FIELD);
11729 
11730 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD)                                 \
11731   CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
11732 
11733 #define CHECK_PARSE(TEXT, FIELD, VALUE)                                        \
11734   EXPECT_NE(VALUE, Style.FIELD);                                               \
11735   EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value());                      \
11736   EXPECT_EQ(VALUE, Style.FIELD)
11737 
11738 TEST_F(FormatTest, ParsesConfigurationBools) {
11739   FormatStyle Style = {};
11740   Style.Language = FormatStyle::LK_Cpp;
11741   CHECK_PARSE_BOOL(AlignOperands);
11742   CHECK_PARSE_BOOL(AlignTrailingComments);
11743   CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
11744   CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
11745   CHECK_PARSE_BOOL(AlignConsecutiveMacros);
11746   CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine);
11747   CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine);
11748   CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
11749   CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
11750   CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
11751   CHECK_PARSE_BOOL(BinPackArguments);
11752   CHECK_PARSE_BOOL(BinPackParameters);
11753   CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
11754   CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
11755   CHECK_PARSE_BOOL(BreakStringLiterals);
11756   CHECK_PARSE_BOOL(CompactNamespaces);
11757   CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
11758   CHECK_PARSE_BOOL(DerivePointerAlignment);
11759   CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
11760   CHECK_PARSE_BOOL(DisableFormat);
11761   CHECK_PARSE_BOOL(IndentCaseLabels);
11762   CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
11763   CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
11764   CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
11765   CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
11766   CHECK_PARSE_BOOL(Cpp11BracedListStyle);
11767   CHECK_PARSE_BOOL(ReflowComments);
11768   CHECK_PARSE_BOOL(SortIncludes);
11769   CHECK_PARSE_BOOL(SortUsingDeclarations);
11770   CHECK_PARSE_BOOL(SpacesInParentheses);
11771   CHECK_PARSE_BOOL(SpacesInSquareBrackets);
11772   CHECK_PARSE_BOOL(SpacesInAngles);
11773   CHECK_PARSE_BOOL(SpaceInEmptyBlock);
11774   CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
11775   CHECK_PARSE_BOOL(SpacesInContainerLiterals);
11776   CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
11777   CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
11778   CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
11779   CHECK_PARSE_BOOL(SpaceAfterLogicalNot);
11780   CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
11781   CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList);
11782   CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon);
11783   CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon);
11784   CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon);
11785 
11786   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel);
11787   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
11788   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
11789   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
11790   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
11791   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
11792   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
11793   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
11794   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
11795   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
11796   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
11797   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
11798   CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
11799   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
11800   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
11801   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
11802 }
11803 
11804 #undef CHECK_PARSE_BOOL
11805 
11806 TEST_F(FormatTest, ParsesConfiguration) {
11807   FormatStyle Style = {};
11808   Style.Language = FormatStyle::LK_Cpp;
11809   CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
11810   CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
11811               ConstructorInitializerIndentWidth, 1234u);
11812   CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
11813   CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
11814   CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
11815   CHECK_PARSE("PenaltyBreakAssignment: 1234",
11816               PenaltyBreakAssignment, 1234u);
11817   CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
11818               PenaltyBreakBeforeFirstCallParameter, 1234u);
11819   CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234",
11820               PenaltyBreakTemplateDeclaration, 1234u);
11821   CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
11822   CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
11823               PenaltyReturnTypeOnItsOwnLine, 1234u);
11824   CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
11825               SpacesBeforeTrailingComments, 1234u);
11826   CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
11827   CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
11828   CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
11829 
11830   Style.PointerAlignment = FormatStyle::PAS_Middle;
11831   CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
11832               FormatStyle::PAS_Left);
11833   CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
11834               FormatStyle::PAS_Right);
11835   CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
11836               FormatStyle::PAS_Middle);
11837   // For backward compatibility:
11838   CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
11839               FormatStyle::PAS_Left);
11840   CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
11841               FormatStyle::PAS_Right);
11842   CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
11843               FormatStyle::PAS_Middle);
11844 
11845   Style.Standard = FormatStyle::LS_Auto;
11846   CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
11847   CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
11848   CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
11849   CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
11850   CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
11851 
11852   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
11853   CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
11854               BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
11855   CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
11856               FormatStyle::BOS_None);
11857   CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
11858               FormatStyle::BOS_All);
11859   // For backward compatibility:
11860   CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
11861               FormatStyle::BOS_None);
11862   CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
11863               FormatStyle::BOS_All);
11864 
11865   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
11866   CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
11867               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
11868   CHECK_PARSE("BreakConstructorInitializers: AfterColon",
11869               BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
11870   CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
11871               BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
11872   // For backward compatibility:
11873   CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
11874               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
11875 
11876   Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
11877   CHECK_PARSE("BreakInheritanceList: BeforeComma",
11878               BreakInheritanceList, FormatStyle::BILS_BeforeComma);
11879   CHECK_PARSE("BreakInheritanceList: AfterColon",
11880               BreakInheritanceList, FormatStyle::BILS_AfterColon);
11881   CHECK_PARSE("BreakInheritanceList: BeforeColon",
11882               BreakInheritanceList, FormatStyle::BILS_BeforeColon);
11883   // For backward compatibility:
11884   CHECK_PARSE("BreakBeforeInheritanceComma: true",
11885               BreakInheritanceList, FormatStyle::BILS_BeforeComma);
11886 
11887   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
11888   CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
11889               FormatStyle::BAS_Align);
11890   CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
11891               FormatStyle::BAS_DontAlign);
11892   CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
11893               FormatStyle::BAS_AlwaysBreak);
11894   // For backward compatibility:
11895   CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
11896               FormatStyle::BAS_DontAlign);
11897   CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
11898               FormatStyle::BAS_Align);
11899 
11900   Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
11901   CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
11902               FormatStyle::ENAS_DontAlign);
11903   CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
11904               FormatStyle::ENAS_Left);
11905   CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
11906               FormatStyle::ENAS_Right);
11907   // For backward compatibility:
11908   CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
11909               FormatStyle::ENAS_Left);
11910   CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
11911               FormatStyle::ENAS_Right);
11912 
11913   Style.UseTab = FormatStyle::UT_ForIndentation;
11914   CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
11915   CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
11916   CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
11917   CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
11918               FormatStyle::UT_ForContinuationAndIndentation);
11919   // For backward compatibility:
11920   CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
11921   CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
11922 
11923   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty;
11924   CHECK_PARSE("AllowShortBlocksOnASingleLine: Never",
11925               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never);
11926   CHECK_PARSE("AllowShortBlocksOnASingleLine: Empty",
11927               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Empty);
11928   CHECK_PARSE("AllowShortBlocksOnASingleLine: Always",
11929               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always);
11930   // For backward compatibility:
11931   CHECK_PARSE("AllowShortBlocksOnASingleLine: false",
11932               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never);
11933   CHECK_PARSE("AllowShortBlocksOnASingleLine: true",
11934               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always);
11935 
11936   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
11937   CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
11938               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
11939   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
11940               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
11941   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
11942               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
11943   CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
11944               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
11945   // For backward compatibility:
11946   CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
11947               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
11948   CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
11949               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
11950 
11951   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
11952   CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
11953               FormatStyle::SBPO_Never);
11954   CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
11955               FormatStyle::SBPO_Always);
11956   CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
11957               FormatStyle::SBPO_ControlStatements);
11958   CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens,
11959               FormatStyle::SBPO_NonEmptyParentheses);
11960   // For backward compatibility:
11961   CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
11962               FormatStyle::SBPO_Never);
11963   CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
11964               FormatStyle::SBPO_ControlStatements);
11965 
11966   Style.ColumnLimit = 123;
11967   FormatStyle BaseStyle = getLLVMStyle();
11968   CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
11969   CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
11970 
11971   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
11972   CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
11973               FormatStyle::BS_Attach);
11974   CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
11975               FormatStyle::BS_Linux);
11976   CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
11977               FormatStyle::BS_Mozilla);
11978   CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
11979               FormatStyle::BS_Stroustrup);
11980   CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
11981               FormatStyle::BS_Allman);
11982   CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
11983   CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
11984               FormatStyle::BS_WebKit);
11985   CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
11986               FormatStyle::BS_Custom);
11987 
11988   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
11989   CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
11990               FormatStyle::RTBS_None);
11991   CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
11992               FormatStyle::RTBS_All);
11993   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
11994               AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
11995   CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
11996               AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
11997   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
11998               AlwaysBreakAfterReturnType,
11999               FormatStyle::RTBS_TopLevelDefinitions);
12000 
12001   Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
12002   CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", AlwaysBreakTemplateDeclarations,
12003               FormatStyle::BTDS_No);
12004   CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", AlwaysBreakTemplateDeclarations,
12005               FormatStyle::BTDS_MultiLine);
12006   CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", AlwaysBreakTemplateDeclarations,
12007               FormatStyle::BTDS_Yes);
12008   CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", AlwaysBreakTemplateDeclarations,
12009               FormatStyle::BTDS_MultiLine);
12010   CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", AlwaysBreakTemplateDeclarations,
12011               FormatStyle::BTDS_Yes);
12012 
12013   Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
12014   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
12015               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
12016   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
12017               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
12018   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
12019               AlwaysBreakAfterDefinitionReturnType,
12020               FormatStyle::DRTBS_TopLevel);
12021 
12022   Style.NamespaceIndentation = FormatStyle::NI_All;
12023   CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
12024               FormatStyle::NI_None);
12025   CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
12026               FormatStyle::NI_Inner);
12027   CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
12028               FormatStyle::NI_All);
12029 
12030   Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always;
12031   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never",
12032               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
12033   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse",
12034               AllowShortIfStatementsOnASingleLine,
12035               FormatStyle::SIS_WithoutElse);
12036   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always",
12037               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always);
12038   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false",
12039               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
12040   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true",
12041               AllowShortIfStatementsOnASingleLine,
12042               FormatStyle::SIS_WithoutElse);
12043 
12044   // FIXME: This is required because parsing a configuration simply overwrites
12045   // the first N elements of the list instead of resetting it.
12046   Style.ForEachMacros.clear();
12047   std::vector<std::string> BoostForeach;
12048   BoostForeach.push_back("BOOST_FOREACH");
12049   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
12050   std::vector<std::string> BoostAndQForeach;
12051   BoostAndQForeach.push_back("BOOST_FOREACH");
12052   BoostAndQForeach.push_back("Q_FOREACH");
12053   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
12054               BoostAndQForeach);
12055 
12056   Style.StatementMacros.clear();
12057   CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros,
12058               std::vector<std::string>{"QUNUSED"});
12059   CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros,
12060               std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"}));
12061 
12062   Style.NamespaceMacros.clear();
12063   CHECK_PARSE("NamespaceMacros: [TESTSUITE]", NamespaceMacros,
12064               std::vector<std::string>{"TESTSUITE"});
12065   CHECK_PARSE("NamespaceMacros: [TESTSUITE, SUITE]", NamespaceMacros,
12066               std::vector<std::string>({"TESTSUITE", "SUITE"}));
12067 
12068   Style.IncludeStyle.IncludeCategories.clear();
12069   std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = {
12070       {"abc/.*", 2}, {".*", 1}};
12071   CHECK_PARSE("IncludeCategories:\n"
12072               "  - Regex: abc/.*\n"
12073               "    Priority: 2\n"
12074               "  - Regex: .*\n"
12075               "    Priority: 1",
12076               IncludeStyle.IncludeCategories, ExpectedCategories);
12077   CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex,
12078               "abc$");
12079 
12080   Style.RawStringFormats.clear();
12081   std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
12082       {
12083           FormatStyle::LK_TextProto,
12084           {"pb", "proto"},
12085           {"PARSE_TEXT_PROTO"},
12086           /*CanonicalDelimiter=*/"",
12087           "llvm",
12088       },
12089       {
12090           FormatStyle::LK_Cpp,
12091           {"cc", "cpp"},
12092           {"C_CODEBLOCK", "CPPEVAL"},
12093           /*CanonicalDelimiter=*/"cc",
12094           /*BasedOnStyle=*/"",
12095       },
12096   };
12097 
12098   CHECK_PARSE("RawStringFormats:\n"
12099               "  - Language: TextProto\n"
12100               "    Delimiters:\n"
12101               "      - 'pb'\n"
12102               "      - 'proto'\n"
12103               "    EnclosingFunctions:\n"
12104               "      - 'PARSE_TEXT_PROTO'\n"
12105               "    BasedOnStyle: llvm\n"
12106               "  - Language: Cpp\n"
12107               "    Delimiters:\n"
12108               "      - 'cc'\n"
12109               "      - 'cpp'\n"
12110               "    EnclosingFunctions:\n"
12111               "      - 'C_CODEBLOCK'\n"
12112               "      - 'CPPEVAL'\n"
12113               "    CanonicalDelimiter: 'cc'",
12114               RawStringFormats, ExpectedRawStringFormats);
12115 }
12116 
12117 TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
12118   FormatStyle Style = {};
12119   Style.Language = FormatStyle::LK_Cpp;
12120   CHECK_PARSE("Language: Cpp\n"
12121               "IndentWidth: 12",
12122               IndentWidth, 12u);
12123   EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
12124                                "IndentWidth: 34",
12125                                &Style),
12126             ParseError::Unsuitable);
12127   EXPECT_EQ(12u, Style.IndentWidth);
12128   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
12129   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
12130 
12131   Style.Language = FormatStyle::LK_JavaScript;
12132   CHECK_PARSE("Language: JavaScript\n"
12133               "IndentWidth: 12",
12134               IndentWidth, 12u);
12135   CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
12136   EXPECT_EQ(parseConfiguration("Language: Cpp\n"
12137                                "IndentWidth: 34",
12138                                &Style),
12139             ParseError::Unsuitable);
12140   EXPECT_EQ(23u, Style.IndentWidth);
12141   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
12142   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
12143 
12144   CHECK_PARSE("BasedOnStyle: LLVM\n"
12145               "IndentWidth: 67",
12146               IndentWidth, 67u);
12147 
12148   CHECK_PARSE("---\n"
12149               "Language: JavaScript\n"
12150               "IndentWidth: 12\n"
12151               "---\n"
12152               "Language: Cpp\n"
12153               "IndentWidth: 34\n"
12154               "...\n",
12155               IndentWidth, 12u);
12156 
12157   Style.Language = FormatStyle::LK_Cpp;
12158   CHECK_PARSE("---\n"
12159               "Language: JavaScript\n"
12160               "IndentWidth: 12\n"
12161               "---\n"
12162               "Language: Cpp\n"
12163               "IndentWidth: 34\n"
12164               "...\n",
12165               IndentWidth, 34u);
12166   CHECK_PARSE("---\n"
12167               "IndentWidth: 78\n"
12168               "---\n"
12169               "Language: JavaScript\n"
12170               "IndentWidth: 56\n"
12171               "...\n",
12172               IndentWidth, 78u);
12173 
12174   Style.ColumnLimit = 123;
12175   Style.IndentWidth = 234;
12176   Style.BreakBeforeBraces = FormatStyle::BS_Linux;
12177   Style.TabWidth = 345;
12178   EXPECT_FALSE(parseConfiguration("---\n"
12179                                   "IndentWidth: 456\n"
12180                                   "BreakBeforeBraces: Allman\n"
12181                                   "---\n"
12182                                   "Language: JavaScript\n"
12183                                   "IndentWidth: 111\n"
12184                                   "TabWidth: 111\n"
12185                                   "---\n"
12186                                   "Language: Cpp\n"
12187                                   "BreakBeforeBraces: Stroustrup\n"
12188                                   "TabWidth: 789\n"
12189                                   "...\n",
12190                                   &Style));
12191   EXPECT_EQ(123u, Style.ColumnLimit);
12192   EXPECT_EQ(456u, Style.IndentWidth);
12193   EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
12194   EXPECT_EQ(789u, Style.TabWidth);
12195 
12196   EXPECT_EQ(parseConfiguration("---\n"
12197                                "Language: JavaScript\n"
12198                                "IndentWidth: 56\n"
12199                                "---\n"
12200                                "IndentWidth: 78\n"
12201                                "...\n",
12202                                &Style),
12203             ParseError::Error);
12204   EXPECT_EQ(parseConfiguration("---\n"
12205                                "Language: JavaScript\n"
12206                                "IndentWidth: 56\n"
12207                                "---\n"
12208                                "Language: JavaScript\n"
12209                                "IndentWidth: 78\n"
12210                                "...\n",
12211                                &Style),
12212             ParseError::Error);
12213 
12214   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
12215 }
12216 
12217 #undef CHECK_PARSE
12218 
12219 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
12220   FormatStyle Style = {};
12221   Style.Language = FormatStyle::LK_JavaScript;
12222   Style.BreakBeforeTernaryOperators = true;
12223   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
12224   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
12225 
12226   Style.BreakBeforeTernaryOperators = true;
12227   EXPECT_EQ(0, parseConfiguration("---\n"
12228                                   "BasedOnStyle: Google\n"
12229                                   "---\n"
12230                                   "Language: JavaScript\n"
12231                                   "IndentWidth: 76\n"
12232                                   "...\n",
12233                                   &Style)
12234                    .value());
12235   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
12236   EXPECT_EQ(76u, Style.IndentWidth);
12237   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
12238 }
12239 
12240 TEST_F(FormatTest, ConfigurationRoundTripTest) {
12241   FormatStyle Style = getLLVMStyle();
12242   std::string YAML = configurationAsText(Style);
12243   FormatStyle ParsedStyle = {};
12244   ParsedStyle.Language = FormatStyle::LK_Cpp;
12245   EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
12246   EXPECT_EQ(Style, ParsedStyle);
12247 }
12248 
12249 TEST_F(FormatTest, WorksFor8bitEncodings) {
12250   EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
12251             "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
12252             "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
12253             "\"\xef\xee\xf0\xf3...\"",
12254             format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
12255                    "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
12256                    "\xef\xee\xf0\xf3...\"",
12257                    getLLVMStyleWithColumns(12)));
12258 }
12259 
12260 TEST_F(FormatTest, HandlesUTF8BOM) {
12261   EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
12262   EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
12263             format("\xef\xbb\xbf#include <iostream>"));
12264   EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
12265             format("\xef\xbb\xbf\n#include <iostream>"));
12266 }
12267 
12268 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
12269 #if !defined(_MSC_VER)
12270 
12271 TEST_F(FormatTest, CountsUTF8CharactersProperly) {
12272   verifyFormat("\"Однажды в студёную зимнюю пору...\"",
12273                getLLVMStyleWithColumns(35));
12274   verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
12275                getLLVMStyleWithColumns(31));
12276   verifyFormat("// Однажды в студёную зимнюю пору...",
12277                getLLVMStyleWithColumns(36));
12278   verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
12279   verifyFormat("/* Однажды в студёную зимнюю пору... */",
12280                getLLVMStyleWithColumns(39));
12281   verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
12282                getLLVMStyleWithColumns(35));
12283 }
12284 
12285 TEST_F(FormatTest, SplitsUTF8Strings) {
12286   // Non-printable characters' width is currently considered to be the length in
12287   // bytes in UTF8. The characters can be displayed in very different manner
12288   // (zero-width, single width with a substitution glyph, expanded to their code
12289   // (e.g. "<8d>"), so there's no single correct way to handle them.
12290   EXPECT_EQ("\"aaaaÄ\"\n"
12291             "\"\xc2\x8d\";",
12292             format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
12293   EXPECT_EQ("\"aaaaaaaÄ\"\n"
12294             "\"\xc2\x8d\";",
12295             format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
12296   EXPECT_EQ("\"Однажды, в \"\n"
12297             "\"студёную \"\n"
12298             "\"зимнюю \"\n"
12299             "\"пору,\"",
12300             format("\"Однажды, в студёную зимнюю пору,\"",
12301                    getLLVMStyleWithColumns(13)));
12302   EXPECT_EQ(
12303       "\"一 二 三 \"\n"
12304       "\"四 五六 \"\n"
12305       "\"七 八 九 \"\n"
12306       "\"十\"",
12307       format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
12308   EXPECT_EQ("\"一\t\"\n"
12309             "\"二 \t\"\n"
12310             "\"三 四 \"\n"
12311             "\"五\t\"\n"
12312             "\"六 \t\"\n"
12313             "\"七 \"\n"
12314             "\"八九十\tqq\"",
12315             format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
12316                    getLLVMStyleWithColumns(11)));
12317 
12318   // UTF8 character in an escape sequence.
12319   EXPECT_EQ("\"aaaaaa\"\n"
12320             "\"\\\xC2\x8D\"",
12321             format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
12322 }
12323 
12324 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
12325   EXPECT_EQ("const char *sssss =\n"
12326             "    \"一二三四五六七八\\\n"
12327             " 九 十\";",
12328             format("const char *sssss = \"一二三四五六七八\\\n"
12329                    " 九 十\";",
12330                    getLLVMStyleWithColumns(30)));
12331 }
12332 
12333 TEST_F(FormatTest, SplitsUTF8LineComments) {
12334   EXPECT_EQ("// aaaaÄ\xc2\x8d",
12335             format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
12336   EXPECT_EQ("// Я из лесу\n"
12337             "// вышел; был\n"
12338             "// сильный\n"
12339             "// мороз.",
12340             format("// Я из лесу вышел; был сильный мороз.",
12341                    getLLVMStyleWithColumns(13)));
12342   EXPECT_EQ("// 一二三\n"
12343             "// 四五六七\n"
12344             "// 八  九\n"
12345             "// 十",
12346             format("// 一二三 四五六七 八  九 十", getLLVMStyleWithColumns(9)));
12347 }
12348 
12349 TEST_F(FormatTest, SplitsUTF8BlockComments) {
12350   EXPECT_EQ("/* Гляжу,\n"
12351             " * поднимается\n"
12352             " * медленно в\n"
12353             " * гору\n"
12354             " * Лошадка,\n"
12355             " * везущая\n"
12356             " * хворосту\n"
12357             " * воз. */",
12358             format("/* Гляжу, поднимается медленно в гору\n"
12359                    " * Лошадка, везущая хворосту воз. */",
12360                    getLLVMStyleWithColumns(13)));
12361   EXPECT_EQ(
12362       "/* 一二三\n"
12363       " * 四五六七\n"
12364       " * 八  九\n"
12365       " * 十  */",
12366       format("/* 一二三 四五六七 八  九 十  */", getLLVMStyleWithColumns(9)));
12367   EXPECT_EQ("/* �������� ��������\n"
12368             " * ��������\n"
12369             " * ������-�� */",
12370             format("/* �������� �������� �������� ������-�� */", getLLVMStyleWithColumns(12)));
12371 }
12372 
12373 #endif // _MSC_VER
12374 
12375 TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
12376   FormatStyle Style = getLLVMStyle();
12377 
12378   Style.ConstructorInitializerIndentWidth = 4;
12379   verifyFormat(
12380       "SomeClass::Constructor()\n"
12381       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
12382       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
12383       Style);
12384 
12385   Style.ConstructorInitializerIndentWidth = 2;
12386   verifyFormat(
12387       "SomeClass::Constructor()\n"
12388       "  : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
12389       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
12390       Style);
12391 
12392   Style.ConstructorInitializerIndentWidth = 0;
12393   verifyFormat(
12394       "SomeClass::Constructor()\n"
12395       ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
12396       "  aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
12397       Style);
12398   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
12399   verifyFormat(
12400       "SomeLongTemplateVariableName<\n"
12401       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
12402       Style);
12403   verifyFormat(
12404       "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
12405       "                       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
12406       Style);
12407 
12408   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
12409   verifyFormat(
12410       "SomeClass::Constructor() :\n"
12411       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n"
12412       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}",
12413       Style);
12414 }
12415 
12416 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
12417   FormatStyle Style = getLLVMStyle();
12418   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
12419   Style.ConstructorInitializerIndentWidth = 4;
12420   verifyFormat("SomeClass::Constructor()\n"
12421                "    : a(a)\n"
12422                "    , b(b)\n"
12423                "    , c(c) {}",
12424                Style);
12425   verifyFormat("SomeClass::Constructor()\n"
12426                "    : a(a) {}",
12427                Style);
12428 
12429   Style.ColumnLimit = 0;
12430   verifyFormat("SomeClass::Constructor()\n"
12431                "    : a(a) {}",
12432                Style);
12433   verifyFormat("SomeClass::Constructor() noexcept\n"
12434                "    : a(a) {}",
12435                Style);
12436   verifyFormat("SomeClass::Constructor()\n"
12437                "    : a(a)\n"
12438                "    , b(b)\n"
12439                "    , c(c) {}",
12440                Style);
12441   verifyFormat("SomeClass::Constructor()\n"
12442                "    : a(a) {\n"
12443                "  foo();\n"
12444                "  bar();\n"
12445                "}",
12446                Style);
12447 
12448   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
12449   verifyFormat("SomeClass::Constructor()\n"
12450                "    : a(a)\n"
12451                "    , b(b)\n"
12452                "    , c(c) {\n}",
12453                Style);
12454   verifyFormat("SomeClass::Constructor()\n"
12455                "    : a(a) {\n}",
12456                Style);
12457 
12458   Style.ColumnLimit = 80;
12459   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
12460   Style.ConstructorInitializerIndentWidth = 2;
12461   verifyFormat("SomeClass::Constructor()\n"
12462                "  : a(a)\n"
12463                "  , b(b)\n"
12464                "  , c(c) {}",
12465                Style);
12466 
12467   Style.ConstructorInitializerIndentWidth = 0;
12468   verifyFormat("SomeClass::Constructor()\n"
12469                ": a(a)\n"
12470                ", b(b)\n"
12471                ", c(c) {}",
12472                Style);
12473 
12474   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
12475   Style.ConstructorInitializerIndentWidth = 4;
12476   verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
12477   verifyFormat(
12478       "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
12479       Style);
12480   verifyFormat(
12481       "SomeClass::Constructor()\n"
12482       "    : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
12483       Style);
12484   Style.ConstructorInitializerIndentWidth = 4;
12485   Style.ColumnLimit = 60;
12486   verifyFormat("SomeClass::Constructor()\n"
12487                "    : aaaaaaaa(aaaaaaaa)\n"
12488                "    , aaaaaaaa(aaaaaaaa)\n"
12489                "    , aaaaaaaa(aaaaaaaa) {}",
12490                Style);
12491 }
12492 
12493 TEST_F(FormatTest, Destructors) {
12494   verifyFormat("void F(int &i) { i.~int(); }");
12495   verifyFormat("void F(int &i) { i->~int(); }");
12496 }
12497 
12498 TEST_F(FormatTest, FormatsWithWebKitStyle) {
12499   FormatStyle Style = getWebKitStyle();
12500 
12501   // Don't indent in outer namespaces.
12502   verifyFormat("namespace outer {\n"
12503                "int i;\n"
12504                "namespace inner {\n"
12505                "    int i;\n"
12506                "} // namespace inner\n"
12507                "} // namespace outer\n"
12508                "namespace other_outer {\n"
12509                "int i;\n"
12510                "}",
12511                Style);
12512 
12513   // Don't indent case labels.
12514   verifyFormat("switch (variable) {\n"
12515                "case 1:\n"
12516                "case 2:\n"
12517                "    doSomething();\n"
12518                "    break;\n"
12519                "default:\n"
12520                "    ++variable;\n"
12521                "}",
12522                Style);
12523 
12524   // Wrap before binary operators.
12525   EXPECT_EQ("void f()\n"
12526             "{\n"
12527             "    if (aaaaaaaaaaaaaaaa\n"
12528             "        && bbbbbbbbbbbbbbbbbbbbbbbb\n"
12529             "        && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
12530             "        return;\n"
12531             "}",
12532             format("void f() {\n"
12533                    "if (aaaaaaaaaaaaaaaa\n"
12534                    "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
12535                    "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
12536                    "return;\n"
12537                    "}",
12538                    Style));
12539 
12540   // Allow functions on a single line.
12541   verifyFormat("void f() { return; }", Style);
12542 
12543   // Allow empty blocks on a single line and insert a space in empty blocks.
12544   EXPECT_EQ("void f() { }", format("void f() {}", Style));
12545   EXPECT_EQ("while (true) { }", format("while (true) {}", Style));
12546   // However, don't merge non-empty short loops.
12547   EXPECT_EQ("while (true) {\n"
12548             "    continue;\n"
12549             "}", format("while (true) { continue; }", Style));
12550 
12551   // Constructor initializers are formatted one per line with the "," on the
12552   // new line.
12553   verifyFormat("Constructor()\n"
12554                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
12555                "    , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
12556                "          aaaaaaaaaaaaaa)\n"
12557                "    , aaaaaaaaaaaaaaaaaaaaaaa()\n"
12558                "{\n"
12559                "}",
12560                Style);
12561   verifyFormat("SomeClass::Constructor()\n"
12562                "    : a(a)\n"
12563                "{\n"
12564                "}",
12565                Style);
12566   EXPECT_EQ("SomeClass::Constructor()\n"
12567             "    : a(a)\n"
12568             "{\n"
12569             "}",
12570             format("SomeClass::Constructor():a(a){}", Style));
12571   verifyFormat("SomeClass::Constructor()\n"
12572                "    : a(a)\n"
12573                "    , b(b)\n"
12574                "    , c(c)\n"
12575                "{\n"
12576                "}",
12577                Style);
12578   verifyFormat("SomeClass::Constructor()\n"
12579                "    : a(a)\n"
12580                "{\n"
12581                "    foo();\n"
12582                "    bar();\n"
12583                "}",
12584                Style);
12585 
12586   // Access specifiers should be aligned left.
12587   verifyFormat("class C {\n"
12588                "public:\n"
12589                "    int i;\n"
12590                "};",
12591                Style);
12592 
12593   // Do not align comments.
12594   verifyFormat("int a; // Do not\n"
12595                "double b; // align comments.",
12596                Style);
12597 
12598   // Do not align operands.
12599   EXPECT_EQ("ASSERT(aaaa\n"
12600             "    || bbbb);",
12601             format("ASSERT ( aaaa\n||bbbb);", Style));
12602 
12603   // Accept input's line breaks.
12604   EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
12605             "    || bbbbbbbbbbbbbbb) {\n"
12606             "    i++;\n"
12607             "}",
12608             format("if (aaaaaaaaaaaaaaa\n"
12609                    "|| bbbbbbbbbbbbbbb) { i++; }",
12610                    Style));
12611   EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
12612             "    i++;\n"
12613             "}",
12614             format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
12615 
12616   // Don't automatically break all macro definitions (llvm.org/PR17842).
12617   verifyFormat("#define aNumber 10", Style);
12618   // However, generally keep the line breaks that the user authored.
12619   EXPECT_EQ("#define aNumber \\\n"
12620             "    10",
12621             format("#define aNumber \\\n"
12622                    " 10",
12623                    Style));
12624 
12625   // Keep empty and one-element array literals on a single line.
12626   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
12627             "                                  copyItems:YES];",
12628             format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
12629                    "copyItems:YES];",
12630                    Style));
12631   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
12632             "                                  copyItems:YES];",
12633             format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
12634                    "             copyItems:YES];",
12635                    Style));
12636   // FIXME: This does not seem right, there should be more indentation before
12637   // the array literal's entries. Nested blocks have the same problem.
12638   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
12639             "    @\"a\",\n"
12640             "    @\"a\"\n"
12641             "]\n"
12642             "                                  copyItems:YES];",
12643             format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
12644                    "     @\"a\",\n"
12645                    "     @\"a\"\n"
12646                    "     ]\n"
12647                    "       copyItems:YES];",
12648                    Style));
12649   EXPECT_EQ(
12650       "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
12651       "                                  copyItems:YES];",
12652       format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
12653              "   copyItems:YES];",
12654              Style));
12655 
12656   verifyFormat("[self.a b:c c:d];", Style);
12657   EXPECT_EQ("[self.a b:c\n"
12658             "        c:d];",
12659             format("[self.a b:c\n"
12660                    "c:d];",
12661                    Style));
12662 }
12663 
12664 TEST_F(FormatTest, FormatsLambdas) {
12665   verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
12666   verifyFormat(
12667       "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n");
12668   verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
12669   verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
12670   verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
12671   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
12672   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
12673   verifyFormat("auto c = [a = [b = 42] {}] {};\n");
12674   verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
12675   verifyFormat("int x = f(*+[] {});");
12676   verifyFormat("void f() {\n"
12677                "  other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
12678                "}\n");
12679   verifyFormat("void f() {\n"
12680                "  other(x.begin(), //\n"
12681                "        x.end(),   //\n"
12682                "        [&](int, int) { return 1; });\n"
12683                "}\n");
12684   verifyFormat("void f() {\n"
12685                "  other.other.other.other.other(\n"
12686                "      x.begin(), x.end(),\n"
12687                "      [something, rather](int, int, int, int, int, int, int) { return 1; });\n"
12688                "}\n");
12689   verifyFormat("void f() {\n"
12690                "  other.other.other.other.other(\n"
12691                "      x.begin(), x.end(),\n"
12692                "      [something, rather](int, int, int, int, int, int, int) {\n"
12693                "        //\n"
12694                "      });\n"
12695                "}\n");
12696   verifyFormat("SomeFunction([]() { // A cool function...\n"
12697                "  return 43;\n"
12698                "});");
12699   EXPECT_EQ("SomeFunction([]() {\n"
12700             "#define A a\n"
12701             "  return 43;\n"
12702             "});",
12703             format("SomeFunction([](){\n"
12704                    "#define A a\n"
12705                    "return 43;\n"
12706                    "});"));
12707   verifyFormat("void f() {\n"
12708                "  SomeFunction([](decltype(x), A *a) {});\n"
12709                "}");
12710   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
12711                "    [](const aaaaaaaaaa &a) { return a; });");
12712   verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
12713                "  SomeOtherFunctioooooooooooooooooooooooooon();\n"
12714                "});");
12715   verifyFormat("Constructor()\n"
12716                "    : Field([] { // comment\n"
12717                "        int i;\n"
12718                "      }) {}");
12719   verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
12720                "  return some_parameter.size();\n"
12721                "};");
12722   verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
12723                "    [](const string &s) { return s; };");
12724   verifyFormat("int i = aaaaaa ? 1 //\n"
12725                "               : [] {\n"
12726                "                   return 2; //\n"
12727                "                 }();");
12728   verifyFormat("llvm::errs() << \"number of twos is \"\n"
12729                "             << std::count_if(v.begin(), v.end(), [](int x) {\n"
12730                "                  return x == 2; // force break\n"
12731                "                });");
12732   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
12733                "    [=](int iiiiiiiiiiii) {\n"
12734                "      return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
12735                "             aaaaaaaaaaaaaaaaaaaaaaa;\n"
12736                "    });",
12737                getLLVMStyleWithColumns(60));
12738   verifyFormat("SomeFunction({[&] {\n"
12739                "                // comment\n"
12740                "              },\n"
12741                "              [&] {\n"
12742                "                // comment\n"
12743                "              }});");
12744   verifyFormat("SomeFunction({[&] {\n"
12745                "  // comment\n"
12746                "}});");
12747   verifyFormat("virtual aaaaaaaaaaaaaaaa(\n"
12748                "    std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n"
12749                "    aaaaa aaaaaaaaa);");
12750 
12751   // Lambdas with return types.
12752   verifyFormat("int c = []() -> int { return 2; }();\n");
12753   verifyFormat("int c = []() -> int * { return 2; }();\n");
12754   verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
12755   verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
12756   verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
12757   verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
12758   verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
12759   verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
12760   verifyFormat("[a, a]() -> a<1> {};");
12761   verifyFormat("[]() -> foo<5 + 2> { return {}; };");
12762   verifyFormat("[]() -> foo<5 - 2> { return {}; };");
12763   verifyFormat("[]() -> foo<5 / 2> { return {}; };");
12764   verifyFormat("[]() -> foo<5 * 2> { return {}; };");
12765   verifyFormat("[]() -> foo<5 % 2> { return {}; };");
12766   verifyFormat("[]() -> foo<5 << 2> { return {}; };");
12767   verifyFormat("[]() -> foo<!5> { return {}; };");
12768   verifyFormat("[]() -> foo<~5> { return {}; };");
12769   verifyFormat("[]() -> foo<5 | 2> { return {}; };");
12770   verifyFormat("[]() -> foo<5 || 2> { return {}; };");
12771   verifyFormat("[]() -> foo<5 & 2> { return {}; };");
12772   verifyFormat("[]() -> foo<5 && 2> { return {}; };");
12773   verifyFormat("[]() -> foo<5 == 2> { return {}; };");
12774   verifyFormat("[]() -> foo<5 != 2> { return {}; };");
12775   verifyFormat("[]() -> foo<5 >= 2> { return {}; };");
12776   verifyFormat("[]() -> foo<5 <= 2> { return {}; };");
12777   verifyFormat("[]() -> foo<5 < 2> { return {}; };");
12778   verifyFormat("[]() -> foo<2 ? 1 : 0> { return {}; };");
12779   verifyFormat("namespace bar {\n"
12780               "// broken:\n"
12781               "auto foo{[]() -> foo<5 + 2> { return {}; }};\n"
12782               "} // namespace bar");
12783   verifyFormat("namespace bar {\n"
12784               "// broken:\n"
12785               "auto foo{[]() -> foo<5 - 2> { return {}; }};\n"
12786               "} // namespace bar");
12787   verifyFormat("namespace bar {\n"
12788               "// broken:\n"
12789               "auto foo{[]() -> foo<5 / 2> { return {}; }};\n"
12790               "} // namespace bar");
12791   verifyFormat("namespace bar {\n"
12792               "// broken:\n"
12793               "auto foo{[]() -> foo<5 * 2> { return {}; }};\n"
12794               "} // namespace bar");
12795   verifyFormat("namespace bar {\n"
12796               "// broken:\n"
12797               "auto foo{[]() -> foo<5 % 2> { return {}; }};\n"
12798               "} // namespace bar");
12799   verifyFormat("namespace bar {\n"
12800               "// broken:\n"
12801               "auto foo{[]() -> foo<5 << 2> { return {}; }};\n"
12802               "} // namespace bar");
12803   verifyFormat("namespace bar {\n"
12804               "// broken:\n"
12805               "auto foo{[]() -> foo<!5> { return {}; }};\n"
12806               "} // namespace bar");
12807   verifyFormat("namespace bar {\n"
12808               "// broken:\n"
12809               "auto foo{[]() -> foo<~5> { return {}; }};\n"
12810               "} // namespace bar");
12811   verifyFormat("namespace bar {\n"
12812               "// broken:\n"
12813               "auto foo{[]() -> foo<5 | 2> { return {}; }};\n"
12814               "} // namespace bar");
12815   verifyFormat("namespace bar {\n"
12816               "// broken:\n"
12817               "auto foo{[]() -> foo<5 || 2> { return {}; }};\n"
12818               "} // namespace bar");
12819   verifyFormat("namespace bar {\n"
12820               "// broken:\n"
12821               "auto foo{[]() -> foo<5 & 2> { return {}; }};\n"
12822               "} // namespace bar");
12823   verifyFormat("namespace bar {\n"
12824               "// broken:\n"
12825               "auto foo{[]() -> foo<5 && 2> { return {}; }};\n"
12826               "} // namespace bar");
12827   verifyFormat("namespace bar {\n"
12828               "// broken:\n"
12829               "auto foo{[]() -> foo<5 == 2> { return {}; }};\n"
12830               "} // namespace bar");
12831   verifyFormat("namespace bar {\n"
12832               "// broken:\n"
12833               "auto foo{[]() -> foo<5 != 2> { return {}; }};\n"
12834               "} // namespace bar");
12835   verifyFormat("namespace bar {\n"
12836               "// broken:\n"
12837               "auto foo{[]() -> foo<5 >= 2> { return {}; }};\n"
12838               "} // namespace bar");
12839   verifyFormat("namespace bar {\n"
12840               "// broken:\n"
12841               "auto foo{[]() -> foo<5 <= 2> { return {}; }};\n"
12842               "} // namespace bar");
12843   verifyFormat("namespace bar {\n"
12844               "// broken:\n"
12845               "auto foo{[]() -> foo<5 < 2> { return {}; }};\n"
12846               "} // namespace bar");
12847   verifyFormat("namespace bar {\n"
12848               "// broken:\n"
12849               "auto foo{[]() -> foo<2 ? 1 : 0> { return {}; }};\n"
12850               "} // namespace bar");
12851   verifyFormat("[]() -> a<1> {};");
12852   verifyFormat("[]() -> a<1> { ; };");
12853   verifyFormat("[]() -> a<1> { ; }();");
12854   verifyFormat("[a, a]() -> a<true> {};");
12855   verifyFormat("[]() -> a<true> {};");
12856   verifyFormat("[]() -> a<true> { ; };");
12857   verifyFormat("[]() -> a<true> { ; }();");
12858   verifyFormat("[a, a]() -> a<false> {};");
12859   verifyFormat("[]() -> a<false> {};");
12860   verifyFormat("[]() -> a<false> { ; };");
12861   verifyFormat("[]() -> a<false> { ; }();");
12862   verifyFormat("auto foo{[]() -> foo<false> { ; }};");
12863   verifyFormat("namespace bar {\n"
12864                "auto foo{[]() -> foo<false> { ; }};\n"
12865                "} // namespace bar");
12866   verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
12867                "                   int j) -> int {\n"
12868                "  return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
12869                "};");
12870   verifyFormat(
12871       "aaaaaaaaaaaaaaaaaaaaaa(\n"
12872       "    [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
12873       "      return aaaaaaaaaaaaaaaaa;\n"
12874       "    });",
12875       getLLVMStyleWithColumns(70));
12876   verifyFormat("[]() //\n"
12877                "    -> int {\n"
12878                "  return 1; //\n"
12879                "};");
12880 
12881   // Multiple lambdas in the same parentheses change indentation rules. These
12882   // lambdas are forced to start on new lines.
12883   verifyFormat("SomeFunction(\n"
12884                "    []() {\n"
12885                "      //\n"
12886                "    },\n"
12887                "    []() {\n"
12888                "      //\n"
12889                "    });");
12890 
12891   // A lambda passed as arg0 is always pushed to the next line.
12892   verifyFormat("SomeFunction(\n"
12893                "    [this] {\n"
12894                "      //\n"
12895                "    },\n"
12896                "    1);\n");
12897 
12898   // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like the arg0
12899   // case above.
12900   auto Style = getGoogleStyle();
12901   Style.BinPackArguments = false;
12902   verifyFormat("SomeFunction(\n"
12903                "    a,\n"
12904                "    [this] {\n"
12905                "      //\n"
12906                "    },\n"
12907                "    b);\n",
12908                Style);
12909   verifyFormat("SomeFunction(\n"
12910                "    a,\n"
12911                "    [this] {\n"
12912                "      //\n"
12913                "    },\n"
12914                "    b);\n");
12915 
12916   // A lambda with a very long line forces arg0 to be pushed out irrespective of
12917   // the BinPackArguments value (as long as the code is wide enough).
12918   verifyFormat("something->SomeFunction(\n"
12919                "    a,\n"
12920                "    [this] {\n"
12921                "      D0000000000000000000000000000000000000000000000000000000000001();\n"
12922                "    },\n"
12923                "    b);\n");
12924 
12925   // A multi-line lambda is pulled up as long as the introducer fits on the previous
12926   // line and there are no further args.
12927   verifyFormat("function(1, [this, that] {\n"
12928                "  //\n"
12929                "});\n");
12930   verifyFormat("function([this, that] {\n"
12931                "  //\n"
12932                "});\n");
12933   // FIXME: this format is not ideal and we should consider forcing the first arg
12934   // onto its own line.
12935   verifyFormat("function(a, b, c, //\n"
12936                "         d, [this, that] {\n"
12937                "           //\n"
12938                "         });\n");
12939 
12940   // Multiple lambdas are treated correctly even when there is a short arg0.
12941   verifyFormat("SomeFunction(\n"
12942                "    1,\n"
12943                "    [this] {\n"
12944                "      //\n"
12945                "    },\n"
12946                "    [this] {\n"
12947                "      //\n"
12948                "    },\n"
12949                "    1);\n");
12950 
12951   // More complex introducers.
12952   verifyFormat("return [i, args...] {};");
12953 
12954   // Not lambdas.
12955   verifyFormat("constexpr char hello[]{\"hello\"};");
12956   verifyFormat("double &operator[](int i) { return 0; }\n"
12957                "int i;");
12958   verifyFormat("std::unique_ptr<int[]> foo() {}");
12959   verifyFormat("int i = a[a][a]->f();");
12960   verifyFormat("int i = (*b)[a]->f();");
12961 
12962   // Other corner cases.
12963   verifyFormat("void f() {\n"
12964                "  bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
12965                "  );\n"
12966                "}");
12967 
12968   // Lambdas created through weird macros.
12969   verifyFormat("void f() {\n"
12970                "  MACRO((const AA &a) { return 1; });\n"
12971                "  MACRO((AA &a) { return 1; });\n"
12972                "}");
12973 
12974   verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
12975                "      doo_dah();\n"
12976                "      doo_dah();\n"
12977                "    })) {\n"
12978                "}");
12979   verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
12980                "                doo_dah();\n"
12981                "                doo_dah();\n"
12982                "              })) {\n"
12983                "}");
12984   verifyFormat("if CONSTEXPR (blah_blah(whatever, whatever, [] {\n"
12985                "                doo_dah();\n"
12986                "                doo_dah();\n"
12987                "              })) {\n"
12988                "}");
12989   verifyFormat("auto lambda = []() {\n"
12990                "  int a = 2\n"
12991                "#if A\n"
12992                "          + 2\n"
12993                "#endif\n"
12994                "      ;\n"
12995                "};");
12996 
12997   // Lambdas with complex multiline introducers.
12998   verifyFormat(
12999       "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
13000       "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
13001       "        -> ::std::unordered_set<\n"
13002       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
13003       "      //\n"
13004       "    });");
13005 
13006   FormatStyle DoNotMerge = getLLVMStyle();
13007   DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None;
13008   verifyFormat("auto c = []() {\n"
13009                "  return b;\n"
13010                "};",
13011                "auto c = []() { return b; };", DoNotMerge);
13012   verifyFormat("auto c = []() {\n"
13013                "};",
13014                " auto c = []() {};", DoNotMerge);
13015 
13016   FormatStyle MergeEmptyOnly = getLLVMStyle();
13017   MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty;
13018   verifyFormat("auto c = []() {\n"
13019                "  return b;\n"
13020                "};",
13021                "auto c = []() {\n"
13022                "  return b;\n"
13023                " };",
13024                MergeEmptyOnly);
13025   verifyFormat("auto c = []() {};",
13026                "auto c = []() {\n"
13027                "};",
13028                MergeEmptyOnly);
13029 
13030   FormatStyle MergeInline = getLLVMStyle();
13031   MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline;
13032   verifyFormat("auto c = []() {\n"
13033                "  return b;\n"
13034                "};",
13035                "auto c = []() { return b; };", MergeInline);
13036   verifyFormat("function([]() { return b; })", "function([]() { return b; })",
13037                MergeInline);
13038   verifyFormat("function([]() { return b; }, a)",
13039                "function([]() { return b; }, a)", MergeInline);
13040   verifyFormat("function(a, []() { return b; })",
13041                "function(a, []() { return b; })", MergeInline);
13042 }
13043 
13044 TEST_F(FormatTest, EmptyLinesInLambdas) {
13045   verifyFormat("auto lambda = []() {\n"
13046                "  x(); //\n"
13047                "};",
13048                "auto lambda = []() {\n"
13049                "\n"
13050                "  x(); //\n"
13051                "\n"
13052                "};");
13053 }
13054 
13055 TEST_F(FormatTest, FormatsBlocks) {
13056   FormatStyle ShortBlocks = getLLVMStyle();
13057   ShortBlocks.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always;
13058   verifyFormat("int (^Block)(int, int);", ShortBlocks);
13059   verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
13060   verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
13061   verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
13062   verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
13063   verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
13064 
13065   verifyFormat("foo(^{ bar(); });", ShortBlocks);
13066   verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
13067   verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
13068 
13069   verifyFormat("[operation setCompletionBlock:^{\n"
13070                "  [self onOperationDone];\n"
13071                "}];");
13072   verifyFormat("int i = {[operation setCompletionBlock:^{\n"
13073                "  [self onOperationDone];\n"
13074                "}]};");
13075   verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
13076                "  f();\n"
13077                "}];");
13078   verifyFormat("int a = [operation block:^int(int *i) {\n"
13079                "  return 1;\n"
13080                "}];");
13081   verifyFormat("[myObject doSomethingWith:arg1\n"
13082                "                      aaa:^int(int *a) {\n"
13083                "                        return 1;\n"
13084                "                      }\n"
13085                "                      bbb:f(a * bbbbbbbb)];");
13086 
13087   verifyFormat("[operation setCompletionBlock:^{\n"
13088                "  [self.delegate newDataAvailable];\n"
13089                "}];",
13090                getLLVMStyleWithColumns(60));
13091   verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
13092                "  NSString *path = [self sessionFilePath];\n"
13093                "  if (path) {\n"
13094                "    // ...\n"
13095                "  }\n"
13096                "});");
13097   verifyFormat("[[SessionService sharedService]\n"
13098                "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
13099                "      if (window) {\n"
13100                "        [self windowDidLoad:window];\n"
13101                "      } else {\n"
13102                "        [self errorLoadingWindow];\n"
13103                "      }\n"
13104                "    }];");
13105   verifyFormat("void (^largeBlock)(void) = ^{\n"
13106                "  // ...\n"
13107                "};\n",
13108                getLLVMStyleWithColumns(40));
13109   verifyFormat("[[SessionService sharedService]\n"
13110                "    loadWindowWithCompletionBlock: //\n"
13111                "        ^(SessionWindow *window) {\n"
13112                "          if (window) {\n"
13113                "            [self windowDidLoad:window];\n"
13114                "          } else {\n"
13115                "            [self errorLoadingWindow];\n"
13116                "          }\n"
13117                "        }];",
13118                getLLVMStyleWithColumns(60));
13119   verifyFormat("[myObject doSomethingWith:arg1\n"
13120                "    firstBlock:^(Foo *a) {\n"
13121                "      // ...\n"
13122                "      int i;\n"
13123                "    }\n"
13124                "    secondBlock:^(Bar *b) {\n"
13125                "      // ...\n"
13126                "      int i;\n"
13127                "    }\n"
13128                "    thirdBlock:^Foo(Bar *b) {\n"
13129                "      // ...\n"
13130                "      int i;\n"
13131                "    }];");
13132   verifyFormat("[myObject doSomethingWith:arg1\n"
13133                "               firstBlock:-1\n"
13134                "              secondBlock:^(Bar *b) {\n"
13135                "                // ...\n"
13136                "                int i;\n"
13137                "              }];");
13138 
13139   verifyFormat("f(^{\n"
13140                "  @autoreleasepool {\n"
13141                "    if (a) {\n"
13142                "      g();\n"
13143                "    }\n"
13144                "  }\n"
13145                "});");
13146   verifyFormat("Block b = ^int *(A *a, B *b) {}");
13147   verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
13148                "};");
13149 
13150   FormatStyle FourIndent = getLLVMStyle();
13151   FourIndent.ObjCBlockIndentWidth = 4;
13152   verifyFormat("[operation setCompletionBlock:^{\n"
13153                "    [self onOperationDone];\n"
13154                "}];",
13155                FourIndent);
13156 }
13157 
13158 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
13159   FormatStyle ZeroColumn = getLLVMStyle();
13160   ZeroColumn.ColumnLimit = 0;
13161 
13162   verifyFormat("[[SessionService sharedService] "
13163                "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
13164                "  if (window) {\n"
13165                "    [self windowDidLoad:window];\n"
13166                "  } else {\n"
13167                "    [self errorLoadingWindow];\n"
13168                "  }\n"
13169                "}];",
13170                ZeroColumn);
13171   EXPECT_EQ("[[SessionService sharedService]\n"
13172             "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
13173             "      if (window) {\n"
13174             "        [self windowDidLoad:window];\n"
13175             "      } else {\n"
13176             "        [self errorLoadingWindow];\n"
13177             "      }\n"
13178             "    }];",
13179             format("[[SessionService sharedService]\n"
13180                    "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
13181                    "                if (window) {\n"
13182                    "    [self windowDidLoad:window];\n"
13183                    "  } else {\n"
13184                    "    [self errorLoadingWindow];\n"
13185                    "  }\n"
13186                    "}];",
13187                    ZeroColumn));
13188   verifyFormat("[myObject doSomethingWith:arg1\n"
13189                "    firstBlock:^(Foo *a) {\n"
13190                "      // ...\n"
13191                "      int i;\n"
13192                "    }\n"
13193                "    secondBlock:^(Bar *b) {\n"
13194                "      // ...\n"
13195                "      int i;\n"
13196                "    }\n"
13197                "    thirdBlock:^Foo(Bar *b) {\n"
13198                "      // ...\n"
13199                "      int i;\n"
13200                "    }];",
13201                ZeroColumn);
13202   verifyFormat("f(^{\n"
13203                "  @autoreleasepool {\n"
13204                "    if (a) {\n"
13205                "      g();\n"
13206                "    }\n"
13207                "  }\n"
13208                "});",
13209                ZeroColumn);
13210   verifyFormat("void (^largeBlock)(void) = ^{\n"
13211                "  // ...\n"
13212                "};",
13213                ZeroColumn);
13214 
13215   ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always;
13216   EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
13217             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
13218   ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never;
13219   EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
13220             "  int i;\n"
13221             "};",
13222             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
13223 }
13224 
13225 TEST_F(FormatTest, SupportsCRLF) {
13226   EXPECT_EQ("int a;\r\n"
13227             "int b;\r\n"
13228             "int c;\r\n",
13229             format("int a;\r\n"
13230                    "  int b;\r\n"
13231                    "    int c;\r\n",
13232                    getLLVMStyle()));
13233   EXPECT_EQ("int a;\r\n"
13234             "int b;\r\n"
13235             "int c;\r\n",
13236             format("int a;\r\n"
13237                    "  int b;\n"
13238                    "    int c;\r\n",
13239                    getLLVMStyle()));
13240   EXPECT_EQ("int a;\n"
13241             "int b;\n"
13242             "int c;\n",
13243             format("int a;\r\n"
13244                    "  int b;\n"
13245                    "    int c;\n",
13246                    getLLVMStyle()));
13247   EXPECT_EQ("\"aaaaaaa \"\r\n"
13248             "\"bbbbbbb\";\r\n",
13249             format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
13250   EXPECT_EQ("#define A \\\r\n"
13251             "  b;      \\\r\n"
13252             "  c;      \\\r\n"
13253             "  d;\r\n",
13254             format("#define A \\\r\n"
13255                    "  b; \\\r\n"
13256                    "  c; d; \r\n",
13257                    getGoogleStyle()));
13258 
13259   EXPECT_EQ("/*\r\n"
13260             "multi line block comments\r\n"
13261             "should not introduce\r\n"
13262             "an extra carriage return\r\n"
13263             "*/\r\n",
13264             format("/*\r\n"
13265                    "multi line block comments\r\n"
13266                    "should not introduce\r\n"
13267                    "an extra carriage return\r\n"
13268                    "*/\r\n"));
13269   EXPECT_EQ("/*\r\n"
13270             "\r\n"
13271             "*/",
13272             format("/*\r\n"
13273                    "    \r\r\r\n"
13274                    "*/"));
13275 }
13276 
13277 TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
13278   verifyFormat("MY_CLASS(C) {\n"
13279                "  int i;\n"
13280                "  int j;\n"
13281                "};");
13282 }
13283 
13284 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
13285   FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
13286   TwoIndent.ContinuationIndentWidth = 2;
13287 
13288   EXPECT_EQ("int i =\n"
13289             "  longFunction(\n"
13290             "    arg);",
13291             format("int i = longFunction(arg);", TwoIndent));
13292 
13293   FormatStyle SixIndent = getLLVMStyleWithColumns(20);
13294   SixIndent.ContinuationIndentWidth = 6;
13295 
13296   EXPECT_EQ("int i =\n"
13297             "      longFunction(\n"
13298             "            arg);",
13299             format("int i = longFunction(arg);", SixIndent));
13300 }
13301 
13302 TEST_F(FormatTest, WrappedClosingParenthesisIndent) {
13303   FormatStyle Style = getLLVMStyle();
13304   verifyFormat("int Foo::getter(\n"
13305                "    //\n"
13306                ") const {\n"
13307                "  return foo;\n"
13308                "}",
13309                Style);
13310   verifyFormat("void Foo::setter(\n"
13311                "    //\n"
13312                ") {\n"
13313                "  foo = 1;\n"
13314                "}",
13315                Style);
13316 }
13317 
13318 TEST_F(FormatTest, SpacesInAngles) {
13319   FormatStyle Spaces = getLLVMStyle();
13320   Spaces.SpacesInAngles = true;
13321 
13322   verifyFormat("static_cast< int >(arg);", Spaces);
13323   verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
13324   verifyFormat("f< int, float >();", Spaces);
13325   verifyFormat("template <> g() {}", Spaces);
13326   verifyFormat("template < std::vector< int > > f() {}", Spaces);
13327   verifyFormat("std::function< void(int, int) > fct;", Spaces);
13328   verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
13329                Spaces);
13330 
13331   Spaces.Standard = FormatStyle::LS_Cpp03;
13332   Spaces.SpacesInAngles = true;
13333   verifyFormat("A< A< int > >();", Spaces);
13334 
13335   Spaces.SpacesInAngles = false;
13336   verifyFormat("A<A<int> >();", Spaces);
13337 
13338   Spaces.Standard = FormatStyle::LS_Cpp11;
13339   Spaces.SpacesInAngles = true;
13340   verifyFormat("A< A< int > >();", Spaces);
13341 
13342   Spaces.SpacesInAngles = false;
13343   verifyFormat("A<A<int>>();", Spaces);
13344 }
13345 
13346 TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
13347   FormatStyle Style = getLLVMStyle();
13348   Style.SpaceAfterTemplateKeyword = false;
13349   verifyFormat("template<int> void foo();", Style);
13350 }
13351 
13352 TEST_F(FormatTest, TripleAngleBrackets) {
13353   verifyFormat("f<<<1, 1>>>();");
13354   verifyFormat("f<<<1, 1, 1, s>>>();");
13355   verifyFormat("f<<<a, b, c, d>>>();");
13356   EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
13357   verifyFormat("f<param><<<1, 1>>>();");
13358   verifyFormat("f<1><<<1, 1>>>();");
13359   EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
13360   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
13361                "aaaaaaaaaaa<<<\n    1, 1>>>();");
13362   verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
13363                "    <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
13364 }
13365 
13366 TEST_F(FormatTest, MergeLessLessAtEnd) {
13367   verifyFormat("<<");
13368   EXPECT_EQ("< < <", format("\\\n<<<"));
13369   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
13370                "aaallvm::outs() <<");
13371   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
13372                "aaaallvm::outs()\n    <<");
13373 }
13374 
13375 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
13376   std::string code = "#if A\n"
13377                      "#if B\n"
13378                      "a.\n"
13379                      "#endif\n"
13380                      "    a = 1;\n"
13381                      "#else\n"
13382                      "#endif\n"
13383                      "#if C\n"
13384                      "#else\n"
13385                      "#endif\n";
13386   EXPECT_EQ(code, format(code));
13387 }
13388 
13389 TEST_F(FormatTest, HandleConflictMarkers) {
13390   // Git/SVN conflict markers.
13391   EXPECT_EQ("int a;\n"
13392             "void f() {\n"
13393             "  callme(some(parameter1,\n"
13394             "<<<<<<< text by the vcs\n"
13395             "              parameter2),\n"
13396             "||||||| text by the vcs\n"
13397             "              parameter2),\n"
13398             "         parameter3,\n"
13399             "======= text by the vcs\n"
13400             "              parameter2, parameter3),\n"
13401             ">>>>>>> text by the vcs\n"
13402             "         otherparameter);\n",
13403             format("int a;\n"
13404                    "void f() {\n"
13405                    "  callme(some(parameter1,\n"
13406                    "<<<<<<< text by the vcs\n"
13407                    "  parameter2),\n"
13408                    "||||||| text by the vcs\n"
13409                    "  parameter2),\n"
13410                    "  parameter3,\n"
13411                    "======= text by the vcs\n"
13412                    "  parameter2,\n"
13413                    "  parameter3),\n"
13414                    ">>>>>>> text by the vcs\n"
13415                    "  otherparameter);\n"));
13416 
13417   // Perforce markers.
13418   EXPECT_EQ("void f() {\n"
13419             "  function(\n"
13420             ">>>> text by the vcs\n"
13421             "      parameter,\n"
13422             "==== text by the vcs\n"
13423             "      parameter,\n"
13424             "==== text by the vcs\n"
13425             "      parameter,\n"
13426             "<<<< text by the vcs\n"
13427             "      parameter);\n",
13428             format("void f() {\n"
13429                    "  function(\n"
13430                    ">>>> text by the vcs\n"
13431                    "  parameter,\n"
13432                    "==== text by the vcs\n"
13433                    "  parameter,\n"
13434                    "==== text by the vcs\n"
13435                    "  parameter,\n"
13436                    "<<<< text by the vcs\n"
13437                    "  parameter);\n"));
13438 
13439   EXPECT_EQ("<<<<<<<\n"
13440             "|||||||\n"
13441             "=======\n"
13442             ">>>>>>>",
13443             format("<<<<<<<\n"
13444                    "|||||||\n"
13445                    "=======\n"
13446                    ">>>>>>>"));
13447 
13448   EXPECT_EQ("<<<<<<<\n"
13449             "|||||||\n"
13450             "int i;\n"
13451             "=======\n"
13452             ">>>>>>>",
13453             format("<<<<<<<\n"
13454                    "|||||||\n"
13455                    "int i;\n"
13456                    "=======\n"
13457                    ">>>>>>>"));
13458 
13459   // FIXME: Handle parsing of macros around conflict markers correctly:
13460   EXPECT_EQ("#define Macro \\\n"
13461             "<<<<<<<\n"
13462             "Something \\\n"
13463             "|||||||\n"
13464             "Else \\\n"
13465             "=======\n"
13466             "Other \\\n"
13467             ">>>>>>>\n"
13468             "    End int i;\n",
13469             format("#define Macro \\\n"
13470                    "<<<<<<<\n"
13471                    "  Something \\\n"
13472                    "|||||||\n"
13473                    "  Else \\\n"
13474                    "=======\n"
13475                    "  Other \\\n"
13476                    ">>>>>>>\n"
13477                    "  End\n"
13478                    "int i;\n"));
13479 }
13480 
13481 TEST_F(FormatTest, DisableRegions) {
13482   EXPECT_EQ("int i;\n"
13483             "// clang-format off\n"
13484             "  int j;\n"
13485             "// clang-format on\n"
13486             "int k;",
13487             format(" int  i;\n"
13488                    "   // clang-format off\n"
13489                    "  int j;\n"
13490                    " // clang-format on\n"
13491                    "   int   k;"));
13492   EXPECT_EQ("int i;\n"
13493             "/* clang-format off */\n"
13494             "  int j;\n"
13495             "/* clang-format on */\n"
13496             "int k;",
13497             format(" int  i;\n"
13498                    "   /* clang-format off */\n"
13499                    "  int j;\n"
13500                    " /* clang-format on */\n"
13501                    "   int   k;"));
13502 
13503   // Don't reflow comments within disabled regions.
13504   EXPECT_EQ(
13505       "// clang-format off\n"
13506       "// long long long long long long line\n"
13507       "/* clang-format on */\n"
13508       "/* long long long\n"
13509       " * long long long\n"
13510       " * line */\n"
13511       "int i;\n"
13512       "/* clang-format off */\n"
13513       "/* long long long long long long line */\n",
13514       format("// clang-format off\n"
13515              "// long long long long long long line\n"
13516              "/* clang-format on */\n"
13517              "/* long long long long long long line */\n"
13518              "int i;\n"
13519              "/* clang-format off */\n"
13520              "/* long long long long long long line */\n",
13521              getLLVMStyleWithColumns(20)));
13522 }
13523 
13524 TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
13525   format("? ) =");
13526   verifyNoCrash("#define a\\\n /**/}");
13527 }
13528 
13529 TEST_F(FormatTest, FormatsTableGenCode) {
13530   FormatStyle Style = getLLVMStyle();
13531   Style.Language = FormatStyle::LK_TableGen;
13532   verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
13533 }
13534 
13535 TEST_F(FormatTest, ArrayOfTemplates) {
13536   EXPECT_EQ("auto a = new unique_ptr<int>[10];",
13537             format("auto a = new unique_ptr<int > [ 10];"));
13538 
13539   FormatStyle Spaces = getLLVMStyle();
13540   Spaces.SpacesInSquareBrackets = true;
13541   EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
13542             format("auto a = new unique_ptr<int > [10];", Spaces));
13543 }
13544 
13545 TEST_F(FormatTest, ArrayAsTemplateType) {
13546   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
13547             format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
13548 
13549   FormatStyle Spaces = getLLVMStyle();
13550   Spaces.SpacesInSquareBrackets = true;
13551   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
13552             format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
13553 }
13554 
13555 TEST_F(FormatTest, NoSpaceAfterSuper) {
13556     verifyFormat("__super::FooBar();");
13557 }
13558 
13559 TEST(FormatStyle, GetStyleWithEmptyFileName) {
13560   llvm::vfs::InMemoryFileSystem FS;
13561   auto Style1 = getStyle("file", "", "Google", "", &FS);
13562   ASSERT_TRUE((bool)Style1);
13563   ASSERT_EQ(*Style1, getGoogleStyle());
13564 }
13565 
13566 TEST(FormatStyle, GetStyleOfFile) {
13567   llvm::vfs::InMemoryFileSystem FS;
13568   // Test 1: format file in the same directory.
13569   ASSERT_TRUE(
13570       FS.addFile("/a/.clang-format", 0,
13571                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
13572   ASSERT_TRUE(
13573       FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
13574   auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
13575   ASSERT_TRUE((bool)Style1);
13576   ASSERT_EQ(*Style1, getLLVMStyle());
13577 
13578   // Test 2.1: fallback to default.
13579   ASSERT_TRUE(
13580       FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
13581   auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
13582   ASSERT_TRUE((bool)Style2);
13583   ASSERT_EQ(*Style2, getMozillaStyle());
13584 
13585   // Test 2.2: no format on 'none' fallback style.
13586   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
13587   ASSERT_TRUE((bool)Style2);
13588   ASSERT_EQ(*Style2, getNoStyle());
13589 
13590   // Test 2.3: format if config is found with no based style while fallback is
13591   // 'none'.
13592   ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
13593                          llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
13594   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
13595   ASSERT_TRUE((bool)Style2);
13596   ASSERT_EQ(*Style2, getLLVMStyle());
13597 
13598   // Test 2.4: format if yaml with no based style, while fallback is 'none'.
13599   Style2 = getStyle("{}", "a.h", "none", "", &FS);
13600   ASSERT_TRUE((bool)Style2);
13601   ASSERT_EQ(*Style2, getLLVMStyle());
13602 
13603   // Test 3: format file in parent directory.
13604   ASSERT_TRUE(
13605       FS.addFile("/c/.clang-format", 0,
13606                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
13607   ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
13608                          llvm::MemoryBuffer::getMemBuffer("int i;")));
13609   auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
13610   ASSERT_TRUE((bool)Style3);
13611   ASSERT_EQ(*Style3, getGoogleStyle());
13612 
13613   // Test 4: error on invalid fallback style
13614   auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
13615   ASSERT_FALSE((bool)Style4);
13616   llvm::consumeError(Style4.takeError());
13617 
13618   // Test 5: error on invalid yaml on command line
13619   auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
13620   ASSERT_FALSE((bool)Style5);
13621   llvm::consumeError(Style5.takeError());
13622 
13623   // Test 6: error on invalid style
13624   auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
13625   ASSERT_FALSE((bool)Style6);
13626   llvm::consumeError(Style6.takeError());
13627 
13628   // Test 7: found config file, error on parsing it
13629   ASSERT_TRUE(
13630       FS.addFile("/d/.clang-format", 0,
13631                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
13632                                                   "InvalidKey: InvalidValue")));
13633   ASSERT_TRUE(
13634       FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
13635   auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
13636   ASSERT_FALSE((bool)Style7);
13637   llvm::consumeError(Style7.takeError());
13638 
13639   // Test 8: inferred per-language defaults apply.
13640   auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS);
13641   ASSERT_TRUE((bool)StyleTd);
13642   ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen));
13643 }
13644 
13645 TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
13646   // Column limit is 20.
13647   std::string Code = "Type *a =\n"
13648                      "    new Type();\n"
13649                      "g(iiiii, 0, jjjjj,\n"
13650                      "  0, kkkkk, 0, mm);\n"
13651                      "int  bad     = format   ;";
13652   std::string Expected = "auto a = new Type();\n"
13653                          "g(iiiii, nullptr,\n"
13654                          "  jjjjj, nullptr,\n"
13655                          "  kkkkk, nullptr,\n"
13656                          "  mm);\n"
13657                          "int  bad     = format   ;";
13658   FileID ID = Context.createInMemoryFile("format.cpp", Code);
13659   tooling::Replacements Replaces = toReplacements(
13660       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
13661                             "auto "),
13662        tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
13663                             "nullptr"),
13664        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
13665                             "nullptr"),
13666        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
13667                             "nullptr")});
13668 
13669   format::FormatStyle Style = format::getLLVMStyle();
13670   Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
13671   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
13672   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
13673       << llvm::toString(FormattedReplaces.takeError()) << "\n";
13674   auto Result = applyAllReplacements(Code, *FormattedReplaces);
13675   EXPECT_TRUE(static_cast<bool>(Result));
13676   EXPECT_EQ(Expected, *Result);
13677 }
13678 
13679 TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
13680   std::string Code = "#include \"a.h\"\n"
13681                      "#include \"c.h\"\n"
13682                      "\n"
13683                      "int main() {\n"
13684                      "  return 0;\n"
13685                      "}";
13686   std::string Expected = "#include \"a.h\"\n"
13687                          "#include \"b.h\"\n"
13688                          "#include \"c.h\"\n"
13689                          "\n"
13690                          "int main() {\n"
13691                          "  return 0;\n"
13692                          "}";
13693   FileID ID = Context.createInMemoryFile("fix.cpp", Code);
13694   tooling::Replacements Replaces = toReplacements(
13695       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
13696                             "#include \"b.h\"\n")});
13697 
13698   format::FormatStyle Style = format::getLLVMStyle();
13699   Style.SortIncludes = true;
13700   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
13701   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
13702       << llvm::toString(FormattedReplaces.takeError()) << "\n";
13703   auto Result = applyAllReplacements(Code, *FormattedReplaces);
13704   EXPECT_TRUE(static_cast<bool>(Result));
13705   EXPECT_EQ(Expected, *Result);
13706 }
13707 
13708 TEST_F(FormatTest, FormatSortsUsingDeclarations) {
13709   EXPECT_EQ("using std::cin;\n"
13710             "using std::cout;",
13711             format("using std::cout;\n"
13712                    "using std::cin;", getGoogleStyle()));
13713 }
13714 
13715 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
13716   format::FormatStyle Style = format::getLLVMStyle();
13717   Style.Standard = FormatStyle::LS_Cpp03;
13718   // cpp03 recognize this string as identifier u8 and literal character 'a'
13719   EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
13720 }
13721 
13722 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
13723   // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
13724   // all modes, including C++11, C++14 and C++17
13725   EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
13726 }
13727 
13728 TEST_F(FormatTest, DoNotFormatLikelyXml) {
13729   EXPECT_EQ("<!-- ;> -->",
13730             format("<!-- ;> -->", getGoogleStyle()));
13731   EXPECT_EQ(" <!-- >; -->",
13732             format(" <!-- >; -->", getGoogleStyle()));
13733 }
13734 
13735 TEST_F(FormatTest, StructuredBindings) {
13736   // Structured bindings is a C++17 feature.
13737   // all modes, including C++11, C++14 and C++17
13738   verifyFormat("auto [a, b] = f();");
13739   EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
13740   EXPECT_EQ("const auto [a, b] = f();", format("const   auto[a, b] = f();"));
13741   EXPECT_EQ("auto const [a, b] = f();", format("auto  const[a, b] = f();"));
13742   EXPECT_EQ("auto const volatile [a, b] = f();",
13743             format("auto  const   volatile[a, b] = f();"));
13744   EXPECT_EQ("auto [a, b, c] = f();", format("auto   [  a  ,  b,c   ] = f();"));
13745   EXPECT_EQ("auto &[a, b, c] = f();",
13746             format("auto   &[  a  ,  b,c   ] = f();"));
13747   EXPECT_EQ("auto &&[a, b, c] = f();",
13748             format("auto   &&[  a  ,  b,c   ] = f();"));
13749   EXPECT_EQ("auto const &[a, b] = f();", format("auto  const&[a, b] = f();"));
13750   EXPECT_EQ("auto const volatile &&[a, b] = f();",
13751             format("auto  const  volatile  &&[a, b] = f();"));
13752   EXPECT_EQ("auto const &&[a, b] = f();", format("auto  const   &&  [a, b] = f();"));
13753   EXPECT_EQ("const auto &[a, b] = f();", format("const  auto  &  [a, b] = f();"));
13754   EXPECT_EQ("const auto volatile &&[a, b] = f();",
13755             format("const  auto   volatile  &&[a, b] = f();"));
13756   EXPECT_EQ("volatile const auto &&[a, b] = f();",
13757             format("volatile  const  auto   &&[a, b] = f();"));
13758   EXPECT_EQ("const auto &&[a, b] = f();", format("const  auto  &&  [a, b] = f();"));
13759 
13760   // Make sure we don't mistake structured bindings for lambdas.
13761   FormatStyle PointerMiddle = getLLVMStyle();
13762   PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
13763   verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
13764   verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
13765   verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
13766   verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
13767   verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
13768   verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
13769   verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
13770   verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
13771   verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
13772   verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
13773   verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
13774   verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
13775 
13776   EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
13777             format("for (const auto   &&   [a, b] : some_range) {\n}"));
13778   EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
13779             format("for (const auto   &   [a, b] : some_range) {\n}"));
13780   EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
13781             format("for (const auto[a, b] : some_range) {\n}"));
13782   EXPECT_EQ("auto [x, y](expr);", format("auto[x,y]  (expr);"));
13783   EXPECT_EQ("auto &[x, y](expr);", format("auto  &  [x,y]  (expr);"));
13784   EXPECT_EQ("auto &&[x, y](expr);", format("auto  &&  [x,y]  (expr);"));
13785   EXPECT_EQ("auto const &[x, y](expr);", format("auto  const  &  [x,y]  (expr);"));
13786   EXPECT_EQ("auto const &&[x, y](expr);", format("auto  const  &&  [x,y]  (expr);"));
13787   EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y]     {expr};"));
13788   EXPECT_EQ("auto const &[x, y]{expr};", format("auto  const  &  [x,y]  {expr};"));
13789   EXPECT_EQ("auto const &&[x, y]{expr};", format("auto  const  &&  [x,y]  {expr};"));
13790 
13791   format::FormatStyle Spaces = format::getLLVMStyle();
13792   Spaces.SpacesInSquareBrackets = true;
13793   verifyFormat("auto [ a, b ] = f();", Spaces);
13794   verifyFormat("auto &&[ a, b ] = f();", Spaces);
13795   verifyFormat("auto &[ a, b ] = f();", Spaces);
13796   verifyFormat("auto const &&[ a, b ] = f();", Spaces);
13797   verifyFormat("auto const &[ a, b ] = f();", Spaces);
13798 }
13799 
13800 TEST_F(FormatTest, FileAndCode) {
13801   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", ""));
13802   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", ""));
13803   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", ""));
13804   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", ""));
13805   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@interface Foo\n@end\n"));
13806   EXPECT_EQ(
13807       FormatStyle::LK_ObjC,
13808       guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }"));
13809   EXPECT_EQ(FormatStyle::LK_ObjC,
13810             guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))"));
13811   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;"));
13812   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", ""));
13813   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo", "@interface Foo\n@end\n"));
13814   EXPECT_EQ(FormatStyle::LK_ObjC,
13815             guessLanguage("foo.h", "int DoStuff(CGRect rect);\n"));
13816   EXPECT_EQ(
13817       FormatStyle::LK_ObjC,
13818       guessLanguage("foo.h",
13819                     "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n"));
13820   EXPECT_EQ(
13821       FormatStyle::LK_Cpp,
13822       guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;"));
13823 }
13824 
13825 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) {
13826   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];"));
13827   EXPECT_EQ(FormatStyle::LK_ObjC,
13828             guessLanguage("foo.h", "array[[calculator getIndex]];"));
13829   EXPECT_EQ(FormatStyle::LK_Cpp,
13830             guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];"));
13831   EXPECT_EQ(
13832       FormatStyle::LK_Cpp,
13833       guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];"));
13834   EXPECT_EQ(FormatStyle::LK_ObjC,
13835             guessLanguage("foo.h", "[[noreturn foo] bar];"));
13836   EXPECT_EQ(FormatStyle::LK_Cpp,
13837             guessLanguage("foo.h", "[[clang::fallthrough]];"));
13838   EXPECT_EQ(FormatStyle::LK_ObjC,
13839             guessLanguage("foo.h", "[[clang:fallthrough] foo];"));
13840   EXPECT_EQ(FormatStyle::LK_Cpp,
13841             guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];"));
13842   EXPECT_EQ(FormatStyle::LK_Cpp,
13843             guessLanguage("foo.h", "[[using clang: fallthrough]];"));
13844   EXPECT_EQ(FormatStyle::LK_ObjC,
13845             guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];"));
13846   EXPECT_EQ(FormatStyle::LK_Cpp,
13847             guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];"));
13848   EXPECT_EQ(
13849       FormatStyle::LK_Cpp,
13850       guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)"));
13851   EXPECT_EQ(
13852       FormatStyle::LK_Cpp,
13853       guessLanguage("foo.h",
13854                     "[[clang::callable_when(\"unconsumed\", \"unknown\")]]"));
13855   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]"));
13856 }
13857 
13858 TEST_F(FormatTest, GuessLanguageWithCaret) {
13859   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);"));
13860   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);"));
13861   EXPECT_EQ(FormatStyle::LK_ObjC,
13862             guessLanguage("foo.h", "int(^)(char, float);"));
13863   EXPECT_EQ(FormatStyle::LK_ObjC,
13864             guessLanguage("foo.h", "int(^foo)(char, float);"));
13865   EXPECT_EQ(FormatStyle::LK_ObjC,
13866             guessLanguage("foo.h", "int(^foo[10])(char, float);"));
13867   EXPECT_EQ(FormatStyle::LK_ObjC,
13868             guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);"));
13869   EXPECT_EQ(
13870       FormatStyle::LK_ObjC,
13871       guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);"));
13872 }
13873 
13874 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) {
13875   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h",
13876                                                "void f() {\n"
13877                                                "  asm (\"mov %[e], %[d]\"\n"
13878                                                "     : [d] \"=rm\" (d)\n"
13879                                                "       [e] \"rm\" (*e));\n"
13880                                                "}"));
13881   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h",
13882                                                "void f() {\n"
13883                                                "  _asm (\"mov %[e], %[d]\"\n"
13884                                                "     : [d] \"=rm\" (d)\n"
13885                                                "       [e] \"rm\" (*e));\n"
13886                                                "}"));
13887   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h",
13888                                                "void f() {\n"
13889                                                "  __asm (\"mov %[e], %[d]\"\n"
13890                                                "     : [d] \"=rm\" (d)\n"
13891                                                "       [e] \"rm\" (*e));\n"
13892                                                "}"));
13893   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h",
13894                                                "void f() {\n"
13895                                                "  __asm__ (\"mov %[e], %[d]\"\n"
13896                                                "     : [d] \"=rm\" (d)\n"
13897                                                "       [e] \"rm\" (*e));\n"
13898                                                "}"));
13899   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h",
13900                                                "void f() {\n"
13901                                                "  asm (\"mov %[e], %[d]\"\n"
13902                                                "     : [d] \"=rm\" (d),\n"
13903                                                "       [e] \"rm\" (*e));\n"
13904                                                "}"));
13905   EXPECT_EQ(FormatStyle::LK_Cpp,
13906             guessLanguage("foo.h", "void f() {\n"
13907                                    "  asm volatile (\"mov %[e], %[d]\"\n"
13908                                    "     : [d] \"=rm\" (d)\n"
13909                                    "       [e] \"rm\" (*e));\n"
13910                                    "}"));
13911 }
13912 
13913 TEST_F(FormatTest, GuessLanguageWithChildLines) {
13914   EXPECT_EQ(FormatStyle::LK_Cpp,
13915             guessLanguage("foo.h", "#define FOO ({ std::string s; })"));
13916   EXPECT_EQ(FormatStyle::LK_ObjC,
13917             guessLanguage("foo.h", "#define FOO ({ NSString *s; })"));
13918   EXPECT_EQ(
13919       FormatStyle::LK_Cpp,
13920       guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })"));
13921   EXPECT_EQ(
13922       FormatStyle::LK_ObjC,
13923       guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })"));
13924 }
13925 
13926 TEST_F(FormatTest, TypenameMacros) {
13927   std::vector<std::string> TypenameMacros = {"STACK_OF", "LIST", "TAILQ_ENTRY"};
13928 
13929   // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=30353
13930   FormatStyle Google = getGoogleStyleWithColumns(0);
13931   Google.TypenameMacros = TypenameMacros;
13932   verifyFormat("struct foo {\n"
13933                "  int bar;\n"
13934                "  TAILQ_ENTRY(a) bleh;\n"
13935                "};", Google);
13936 
13937   FormatStyle Macros = getLLVMStyle();
13938   Macros.TypenameMacros = TypenameMacros;
13939 
13940   verifyFormat("STACK_OF(int) a;", Macros);
13941   verifyFormat("STACK_OF(int) *a;", Macros);
13942   verifyFormat("STACK_OF(int const *) *a;", Macros);
13943   verifyFormat("STACK_OF(int *const) *a;", Macros);
13944   verifyFormat("STACK_OF(int, string) a;", Macros);
13945   verifyFormat("STACK_OF(LIST(int)) a;", Macros);
13946   verifyFormat("STACK_OF(LIST(int)) a, b;", Macros);
13947   verifyFormat("for (LIST(int) *a = NULL; a;) {\n}", Macros);
13948   verifyFormat("STACK_OF(int) f(LIST(int) *arg);", Macros);
13949 
13950   Macros.PointerAlignment = FormatStyle::PAS_Left;
13951   verifyFormat("STACK_OF(int)* a;", Macros);
13952   verifyFormat("STACK_OF(int*)* a;", Macros);
13953 }
13954 
13955 } // end namespace
13956 } // end namespace format
13957 } // end namespace clang
13958