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 { SC_ExpectComplete, SC_ExpectIncomplete, SC_DoNotCheck };
33 
34   std::string format(llvm::StringRef Code,
35                      const FormatStyle &Style = getLLVMStyle(),
36                      StatusCheck CheckComplete = SC_ExpectComplete) {
37     LLVM_DEBUG(llvm::errs() << "---\n");
38     LLVM_DEBUG(llvm::errs() << Code << "\n\n");
39     std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
40     FormattingAttemptStatus Status;
41     tooling::Replacements Replaces =
42         reformat(Style, Code, Ranges, "<stdin>", &Status);
43     if (CheckComplete != SC_DoNotCheck) {
44       bool ExpectedCompleteFormat = CheckComplete == SC_ExpectComplete;
45       EXPECT_EQ(ExpectedCompleteFormat, Status.FormatComplete)
46           << Code << "\n\n";
47     }
48     ReplacementCount = Replaces.size();
49     auto Result = applyAllReplacements(Code, Replaces);
50     EXPECT_TRUE(static_cast<bool>(Result));
51     LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
52     return *Result;
53   }
54 
55   FormatStyle getStyleWithColumns(FormatStyle Style, unsigned ColumnLimit) {
56     Style.ColumnLimit = ColumnLimit;
57     return Style;
58   }
59 
60   FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) {
61     return getStyleWithColumns(getLLVMStyle(), ColumnLimit);
62   }
63 
64   FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) {
65     return getStyleWithColumns(getGoogleStyle(), ColumnLimit);
66   }
67 
68   void verifyFormat(llvm::StringRef Expected, llvm::StringRef Code,
69                     const FormatStyle &Style = getLLVMStyle()) {
70     EXPECT_EQ(Expected.str(), format(Expected, Style))
71         << "Expected code is not stable";
72     EXPECT_EQ(Expected.str(), format(Code, Style));
73     if (Style.Language == FormatStyle::LK_Cpp) {
74       // Objective-C++ is a superset of C++, so everything checked for C++
75       // needs to be checked for Objective-C++ as well.
76       FormatStyle ObjCStyle = Style;
77       ObjCStyle.Language = FormatStyle::LK_ObjC;
78       EXPECT_EQ(Expected.str(), format(test::messUp(Code), ObjCStyle));
79     }
80   }
81 
82   void verifyFormat(llvm::StringRef Code,
83                     const FormatStyle &Style = getLLVMStyle()) {
84     verifyFormat(Code, test::messUp(Code), Style);
85   }
86 
87   void verifyIncompleteFormat(llvm::StringRef Code,
88                               const FormatStyle &Style = getLLVMStyle()) {
89     EXPECT_EQ(Code.str(),
90               format(test::messUp(Code), Style, SC_ExpectIncomplete));
91   }
92 
93   void verifyGoogleFormat(llvm::StringRef Code) {
94     verifyFormat(Code, getGoogleStyle());
95   }
96 
97   void verifyIndependentOfContext(llvm::StringRef text) {
98     verifyFormat(text);
99     verifyFormat(llvm::Twine("void f() { " + text + " }").str());
100   }
101 
102   /// \brief Verify that clang-format does not crash on the given input.
103   void verifyNoCrash(llvm::StringRef Code,
104                      const FormatStyle &Style = getLLVMStyle()) {
105     format(Code, Style, SC_DoNotCheck);
106   }
107 
108   int ReplacementCount;
109 };
110 
111 TEST_F(FormatTest, MessUp) {
112   EXPECT_EQ("1 2 3", test::messUp("1 2 3"));
113   EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n"));
114   EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc"));
115   EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc"));
116   EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne"));
117 }
118 
119 TEST_F(FormatTest, DefaultLLVMStyleIsCpp) {
120   EXPECT_EQ(FormatStyle::LK_Cpp, getLLVMStyle().Language);
121 }
122 
123 TEST_F(FormatTest, LLVMStyleOverride) {
124   EXPECT_EQ(FormatStyle::LK_Proto,
125             getLLVMStyle(FormatStyle::LK_Proto).Language);
126 }
127 
128 //===----------------------------------------------------------------------===//
129 // Basic function tests.
130 //===----------------------------------------------------------------------===//
131 
132 TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) {
133   EXPECT_EQ(";", format(";"));
134 }
135 
136 TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
137   EXPECT_EQ("int i;", format("  int i;"));
138   EXPECT_EQ("\nint i;", format(" \n\t \v \f  int i;"));
139   EXPECT_EQ("int i;\nint j;", format("    int i; int j;"));
140   EXPECT_EQ("int i;\nint j;", format("    int i;\n  int j;"));
141 }
142 
143 TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
144   EXPECT_EQ("int i;", format("int\ni;"));
145 }
146 
147 TEST_F(FormatTest, FormatsNestedBlockStatements) {
148   EXPECT_EQ("{\n  {\n    {}\n  }\n}", format("{{{}}}"));
149 }
150 
151 TEST_F(FormatTest, FormatsNestedCall) {
152   verifyFormat("Method(f1, f2(f3));");
153   verifyFormat("Method(f1(f2, f3()));");
154   verifyFormat("Method(f1(f2, (f3())));");
155 }
156 
157 TEST_F(FormatTest, NestedNameSpecifiers) {
158   verifyFormat("vector<::Type> v;");
159   verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())");
160   verifyFormat("static constexpr bool Bar = decltype(bar())::value;");
161   verifyFormat("bool a = 2 < ::SomeFunction();");
162   verifyFormat("ALWAYS_INLINE ::std::string getName();");
163   verifyFormat("some::string getName();");
164 }
165 
166 TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
167   EXPECT_EQ("if (a) {\n"
168             "  f();\n"
169             "}",
170             format("if(a){f();}"));
171   EXPECT_EQ(4, ReplacementCount);
172   EXPECT_EQ("if (a) {\n"
173             "  f();\n"
174             "}",
175             format("if (a) {\n"
176                    "  f();\n"
177                    "}"));
178   EXPECT_EQ(0, ReplacementCount);
179   EXPECT_EQ("/*\r\n"
180             "\r\n"
181             "*/\r\n",
182             format("/*\r\n"
183                    "\r\n"
184                    "*/\r\n"));
185   EXPECT_EQ(0, ReplacementCount);
186 }
187 
188 TEST_F(FormatTest, RemovesEmptyLines) {
189   EXPECT_EQ("class C {\n"
190             "  int i;\n"
191             "};",
192             format("class C {\n"
193                    " int i;\n"
194                    "\n"
195                    "};"));
196 
197   // Don't remove empty lines at the start of namespaces or extern "C" blocks.
198   EXPECT_EQ("namespace N {\n"
199             "\n"
200             "int i;\n"
201             "}",
202             format("namespace N {\n"
203                    "\n"
204                    "int    i;\n"
205                    "}",
206                    getGoogleStyle()));
207   EXPECT_EQ("/* something */ namespace N {\n"
208             "\n"
209             "int i;\n"
210             "}",
211             format("/* something */ namespace N {\n"
212                    "\n"
213                    "int    i;\n"
214                    "}",
215                    getGoogleStyle()));
216   EXPECT_EQ("inline namespace N {\n"
217             "\n"
218             "int i;\n"
219             "}",
220             format("inline namespace N {\n"
221                    "\n"
222                    "int    i;\n"
223                    "}",
224                    getGoogleStyle()));
225   EXPECT_EQ("/* something */ inline namespace N {\n"
226             "\n"
227             "int i;\n"
228             "}",
229             format("/* something */ inline namespace N {\n"
230                    "\n"
231                    "int    i;\n"
232                    "}",
233                    getGoogleStyle()));
234   EXPECT_EQ("export namespace N {\n"
235             "\n"
236             "int i;\n"
237             "}",
238             format("export namespace N {\n"
239                    "\n"
240                    "int    i;\n"
241                    "}",
242                    getGoogleStyle()));
243   EXPECT_EQ("extern /**/ \"C\" /**/ {\n"
244             "\n"
245             "int i;\n"
246             "}",
247             format("extern /**/ \"C\" /**/ {\n"
248                    "\n"
249                    "int    i;\n"
250                    "}",
251                    getGoogleStyle()));
252 
253   // ...but do keep inlining and removing empty lines for non-block extern "C"
254   // functions.
255   verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle());
256   EXPECT_EQ("extern \"C\" int f() {\n"
257             "  int i = 42;\n"
258             "  return i;\n"
259             "}",
260             format("extern \"C\" int f() {\n"
261                    "\n"
262                    "  int i = 42;\n"
263                    "  return i;\n"
264                    "}",
265                    getGoogleStyle()));
266 
267   // Remove empty lines at the beginning and end of blocks.
268   EXPECT_EQ("void f() {\n"
269             "\n"
270             "  if (a) {\n"
271             "\n"
272             "    f();\n"
273             "  }\n"
274             "}",
275             format("void f() {\n"
276                    "\n"
277                    "  if (a) {\n"
278                    "\n"
279                    "    f();\n"
280                    "\n"
281                    "  }\n"
282                    "\n"
283                    "}",
284                    getLLVMStyle()));
285   EXPECT_EQ("void f() {\n"
286             "  if (a) {\n"
287             "    f();\n"
288             "  }\n"
289             "}",
290             format("void f() {\n"
291                    "\n"
292                    "  if (a) {\n"
293                    "\n"
294                    "    f();\n"
295                    "\n"
296                    "  }\n"
297                    "\n"
298                    "}",
299                    getGoogleStyle()));
300 
301   // Don't remove empty lines in more complex control statements.
302   EXPECT_EQ("void f() {\n"
303             "  if (a) {\n"
304             "    f();\n"
305             "\n"
306             "  } else if (b) {\n"
307             "    f();\n"
308             "  }\n"
309             "}",
310             format("void f() {\n"
311                    "  if (a) {\n"
312                    "    f();\n"
313                    "\n"
314                    "  } else if (b) {\n"
315                    "    f();\n"
316                    "\n"
317                    "  }\n"
318                    "\n"
319                    "}"));
320 
321   // Don't remove empty lines before namespace endings.
322   FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
323   LLVMWithNoNamespaceFix.FixNamespaceComments = false;
324   EXPECT_EQ("namespace {\n"
325             "int i;\n"
326             "\n"
327             "}",
328             format("namespace {\n"
329                    "int i;\n"
330                    "\n"
331                    "}",
332                    LLVMWithNoNamespaceFix));
333   EXPECT_EQ("namespace {\n"
334             "int i;\n"
335             "}",
336             format("namespace {\n"
337                    "int i;\n"
338                    "}",
339                    LLVMWithNoNamespaceFix));
340   EXPECT_EQ("namespace {\n"
341             "int i;\n"
342             "\n"
343             "};",
344             format("namespace {\n"
345                    "int i;\n"
346                    "\n"
347                    "};",
348                    LLVMWithNoNamespaceFix));
349   EXPECT_EQ("namespace {\n"
350             "int i;\n"
351             "};",
352             format("namespace {\n"
353                    "int i;\n"
354                    "};",
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 =
648       FormatStyle::BWACS_Always;
649 
650   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
651   verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
652   verifyFormat("if CONSTEXPR (true) {}", AllowSimpleBracedStatements);
653   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
654   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
655   verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
656   verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
657   verifyFormat("if CONSTEXPR (true) { f(); }", AllowSimpleBracedStatements);
658   verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
659   verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
660   verifyFormat("if (true)\n"
661                "{\n"
662                "  ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
663                "}",
664                AllowSimpleBracedStatements);
665   verifyFormat("if (true)\n"
666                "{ //\n"
667                "  f();\n"
668                "}",
669                AllowSimpleBracedStatements);
670   verifyFormat("if (true)\n"
671                "{\n"
672                "  f();\n"
673                "  f();\n"
674                "}",
675                AllowSimpleBracedStatements);
676   verifyFormat("if (true)\n"
677                "{\n"
678                "  f();\n"
679                "} else\n"
680                "{\n"
681                "  f();\n"
682                "}",
683                AllowSimpleBracedStatements);
684 
685   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine =
686       FormatStyle::SIS_Never;
687   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
688   verifyFormat("if (true)\n"
689                "{\n"
690                "  f();\n"
691                "}",
692                AllowSimpleBracedStatements);
693   verifyFormat("if (true)\n"
694                "{\n"
695                "  f();\n"
696                "} else\n"
697                "{\n"
698                "  f();\n"
699                "}",
700                AllowSimpleBracedStatements);
701 
702   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
703   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
704   verifyFormat("while (true)\n"
705                "{\n"
706                "  f();\n"
707                "}",
708                AllowSimpleBracedStatements);
709   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
710   verifyFormat("for (;;)\n"
711                "{\n"
712                "  f();\n"
713                "}",
714                AllowSimpleBracedStatements);
715 }
716 
717 TEST_F(FormatTest, ShortBlocksInMacrosDontMergeWithCodeAfterMacro) {
718   FormatStyle Style = getLLVMStyleWithColumns(60);
719   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always;
720   Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse;
721   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
722   EXPECT_EQ("#define A                                                  \\\n"
723             "  if (HANDLEwernufrnuLwrmviferuvnierv)                     \\\n"
724             "  { RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; }\n"
725             "X;",
726             format("#define A \\\n"
727                    "   if (HANDLEwernufrnuLwrmviferuvnierv) { \\\n"
728                    "      RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; \\\n"
729                    "   }\n"
730                    "X;",
731                    Style));
732 }
733 
734 TEST_F(FormatTest, ParseIfElse) {
735   verifyFormat("if (true)\n"
736                "  if (true)\n"
737                "    if (true)\n"
738                "      f();\n"
739                "    else\n"
740                "      g();\n"
741                "  else\n"
742                "    h();\n"
743                "else\n"
744                "  i();");
745   verifyFormat("if (true)\n"
746                "  if (true)\n"
747                "    if (true) {\n"
748                "      if (true)\n"
749                "        f();\n"
750                "    } else {\n"
751                "      g();\n"
752                "    }\n"
753                "  else\n"
754                "    h();\n"
755                "else {\n"
756                "  i();\n"
757                "}");
758   verifyFormat("if (true)\n"
759                "  if constexpr (true)\n"
760                "    if (true) {\n"
761                "      if constexpr (true)\n"
762                "        f();\n"
763                "    } else {\n"
764                "      g();\n"
765                "    }\n"
766                "  else\n"
767                "    h();\n"
768                "else {\n"
769                "  i();\n"
770                "}");
771   verifyFormat("if (true)\n"
772                "  if CONSTEXPR (true)\n"
773                "    if (true) {\n"
774                "      if CONSTEXPR (true)\n"
775                "        f();\n"
776                "    } else {\n"
777                "      g();\n"
778                "    }\n"
779                "  else\n"
780                "    h();\n"
781                "else {\n"
782                "  i();\n"
783                "}");
784   verifyFormat("void f() {\n"
785                "  if (a) {\n"
786                "  } else {\n"
787                "  }\n"
788                "}");
789 }
790 
791 TEST_F(FormatTest, ElseIf) {
792   verifyFormat("if (a) {\n} else if (b) {\n}");
793   verifyFormat("if (a)\n"
794                "  f();\n"
795                "else if (b)\n"
796                "  g();\n"
797                "else\n"
798                "  h();");
799   verifyFormat("if constexpr (a)\n"
800                "  f();\n"
801                "else if constexpr (b)\n"
802                "  g();\n"
803                "else\n"
804                "  h();");
805   verifyFormat("if CONSTEXPR (a)\n"
806                "  f();\n"
807                "else if CONSTEXPR (b)\n"
808                "  g();\n"
809                "else\n"
810                "  h();");
811   verifyFormat("if (a) {\n"
812                "  f();\n"
813                "}\n"
814                "// or else ..\n"
815                "else {\n"
816                "  g()\n"
817                "}");
818 
819   verifyFormat("if (a) {\n"
820                "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
821                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
822                "}");
823   verifyFormat("if (a) {\n"
824                "} else if constexpr (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
825                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
826                "}");
827   verifyFormat("if (a) {\n"
828                "} else if CONSTEXPR (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
829                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
830                "}");
831   verifyFormat("if (a) {\n"
832                "} else if (\n"
833                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
834                "}",
835                getLLVMStyleWithColumns(62));
836   verifyFormat("if (a) {\n"
837                "} else if constexpr (\n"
838                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
839                "}",
840                getLLVMStyleWithColumns(62));
841   verifyFormat("if (a) {\n"
842                "} else if CONSTEXPR (\n"
843                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
844                "}",
845                getLLVMStyleWithColumns(62));
846 }
847 
848 TEST_F(FormatTest, FormatsForLoop) {
849   verifyFormat(
850       "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
851       "     ++VeryVeryLongLoopVariable)\n"
852       "  ;");
853   verifyFormat("for (;;)\n"
854                "  f();");
855   verifyFormat("for (;;) {\n}");
856   verifyFormat("for (;;) {\n"
857                "  f();\n"
858                "}");
859   verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
860 
861   verifyFormat(
862       "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
863       "                                          E = UnwrappedLines.end();\n"
864       "     I != E; ++I) {\n}");
865 
866   verifyFormat(
867       "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
868       "     ++IIIII) {\n}");
869   verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
870                "         aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
871                "     aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
872   verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
873                "         I = FD->getDeclsInPrototypeScope().begin(),\n"
874                "         E = FD->getDeclsInPrototypeScope().end();\n"
875                "     I != E; ++I) {\n}");
876   verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
877                "         I = Container.begin(),\n"
878                "         E = Container.end();\n"
879                "     I != E; ++I) {\n}",
880                getLLVMStyleWithColumns(76));
881 
882   verifyFormat(
883       "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
884       "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
885       "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
886       "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
887       "     ++aaaaaaaaaaa) {\n}");
888   verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
889                "                bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
890                "     ++i) {\n}");
891   verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
892                "     aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
893                "}");
894   verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
895                "         aaaaaaaaaa);\n"
896                "     iter; ++iter) {\n"
897                "}");
898   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
899                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
900                "     aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
901                "     ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
902 
903   // These should not be formatted as Objective-C for-in loops.
904   verifyFormat("for (Foo *x = 0; x != in; x++) {\n}");
905   verifyFormat("Foo *x;\nfor (x = 0; x != in; x++) {\n}");
906   verifyFormat("Foo *x;\nfor (x in y) {\n}");
907   verifyFormat(
908       "for (const Foo<Bar> &baz = in.value(); !baz.at_end(); ++baz) {\n}");
909 
910   FormatStyle NoBinPacking = getLLVMStyle();
911   NoBinPacking.BinPackParameters = false;
912   verifyFormat("for (int aaaaaaaaaaa = 1;\n"
913                "     aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
914                "                                           aaaaaaaaaaaaaaaa,\n"
915                "                                           aaaaaaaaaaaaaaaa,\n"
916                "                                           aaaaaaaaaaaaaaaa);\n"
917                "     aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
918                "}",
919                NoBinPacking);
920   verifyFormat(
921       "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
922       "                                          E = UnwrappedLines.end();\n"
923       "     I != E;\n"
924       "     ++I) {\n}",
925       NoBinPacking);
926 
927   FormatStyle AlignLeft = getLLVMStyle();
928   AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
929   verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft);
930 }
931 
932 TEST_F(FormatTest, RangeBasedForLoops) {
933   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
934                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
935   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
936                "     aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
937   verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
938                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
939   verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
940                "     aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
941 }
942 
943 TEST_F(FormatTest, ForEachLoops) {
944   verifyFormat("void f() {\n"
945                "  foreach (Item *item, itemlist) {}\n"
946                "  Q_FOREACH (Item *item, itemlist) {}\n"
947                "  BOOST_FOREACH (Item *item, itemlist) {}\n"
948                "  UNKNOWN_FORACH(Item * item, itemlist) {}\n"
949                "}");
950 
951   // As function-like macros.
952   verifyFormat("#define foreach(x, y)\n"
953                "#define Q_FOREACH(x, y)\n"
954                "#define BOOST_FOREACH(x, y)\n"
955                "#define UNKNOWN_FOREACH(x, y)\n");
956 
957   // Not as function-like macros.
958   verifyFormat("#define foreach (x, y)\n"
959                "#define Q_FOREACH (x, y)\n"
960                "#define BOOST_FOREACH (x, y)\n"
961                "#define UNKNOWN_FOREACH (x, y)\n");
962 }
963 
964 TEST_F(FormatTest, FormatsWhileLoop) {
965   verifyFormat("while (true) {\n}");
966   verifyFormat("while (true)\n"
967                "  f();");
968   verifyFormat("while () {\n}");
969   verifyFormat("while () {\n"
970                "  f();\n"
971                "}");
972 }
973 
974 TEST_F(FormatTest, FormatsDoWhile) {
975   verifyFormat("do {\n"
976                "  do_something();\n"
977                "} while (something());");
978   verifyFormat("do\n"
979                "  do_something();\n"
980                "while (something());");
981 }
982 
983 TEST_F(FormatTest, FormatsSwitchStatement) {
984   verifyFormat("switch (x) {\n"
985                "case 1:\n"
986                "  f();\n"
987                "  break;\n"
988                "case kFoo:\n"
989                "case ns::kBar:\n"
990                "case kBaz:\n"
991                "  break;\n"
992                "default:\n"
993                "  g();\n"
994                "  break;\n"
995                "}");
996   verifyFormat("switch (x) {\n"
997                "case 1: {\n"
998                "  f();\n"
999                "  break;\n"
1000                "}\n"
1001                "case 2: {\n"
1002                "  break;\n"
1003                "}\n"
1004                "}");
1005   verifyFormat("switch (x) {\n"
1006                "case 1: {\n"
1007                "  f();\n"
1008                "  {\n"
1009                "    g();\n"
1010                "    h();\n"
1011                "  }\n"
1012                "  break;\n"
1013                "}\n"
1014                "}");
1015   verifyFormat("switch (x) {\n"
1016                "case 1: {\n"
1017                "  f();\n"
1018                "  if (foo) {\n"
1019                "    g();\n"
1020                "    h();\n"
1021                "  }\n"
1022                "  break;\n"
1023                "}\n"
1024                "}");
1025   verifyFormat("switch (x) {\n"
1026                "case 1: {\n"
1027                "  f();\n"
1028                "  g();\n"
1029                "} break;\n"
1030                "}");
1031   verifyFormat("switch (test)\n"
1032                "  ;");
1033   verifyFormat("switch (x) {\n"
1034                "default: {\n"
1035                "  // Do nothing.\n"
1036                "}\n"
1037                "}");
1038   verifyFormat("switch (x) {\n"
1039                "// comment\n"
1040                "// if 1, do f()\n"
1041                "case 1:\n"
1042                "  f();\n"
1043                "}");
1044   verifyFormat("switch (x) {\n"
1045                "case 1:\n"
1046                "  // Do amazing stuff\n"
1047                "  {\n"
1048                "    f();\n"
1049                "    g();\n"
1050                "  }\n"
1051                "  break;\n"
1052                "}");
1053   verifyFormat("#define A          \\\n"
1054                "  switch (x) {     \\\n"
1055                "  case a:          \\\n"
1056                "    foo = b;       \\\n"
1057                "  }",
1058                getLLVMStyleWithColumns(20));
1059   verifyFormat("#define OPERATION_CASE(name)           \\\n"
1060                "  case OP_name:                        \\\n"
1061                "    return operations::Operation##name\n",
1062                getLLVMStyleWithColumns(40));
1063   verifyFormat("switch (x) {\n"
1064                "case 1:;\n"
1065                "default:;\n"
1066                "  int i;\n"
1067                "}");
1068 
1069   verifyGoogleFormat("switch (x) {\n"
1070                      "  case 1:\n"
1071                      "    f();\n"
1072                      "    break;\n"
1073                      "  case kFoo:\n"
1074                      "  case ns::kBar:\n"
1075                      "  case kBaz:\n"
1076                      "    break;\n"
1077                      "  default:\n"
1078                      "    g();\n"
1079                      "    break;\n"
1080                      "}");
1081   verifyGoogleFormat("switch (x) {\n"
1082                      "  case 1: {\n"
1083                      "    f();\n"
1084                      "    break;\n"
1085                      "  }\n"
1086                      "}");
1087   verifyGoogleFormat("switch (test)\n"
1088                      "  ;");
1089 
1090   verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
1091                      "  case OP_name:              \\\n"
1092                      "    return operations::Operation##name\n");
1093   verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
1094                      "  // Get the correction operation class.\n"
1095                      "  switch (OpCode) {\n"
1096                      "    CASE(Add);\n"
1097                      "    CASE(Subtract);\n"
1098                      "    default:\n"
1099                      "      return operations::Unknown;\n"
1100                      "  }\n"
1101                      "#undef OPERATION_CASE\n"
1102                      "}");
1103   verifyFormat("DEBUG({\n"
1104                "  switch (x) {\n"
1105                "  case A:\n"
1106                "    f();\n"
1107                "    break;\n"
1108                "    // fallthrough\n"
1109                "  case B:\n"
1110                "    g();\n"
1111                "    break;\n"
1112                "  }\n"
1113                "});");
1114   EXPECT_EQ("DEBUG({\n"
1115             "  switch (x) {\n"
1116             "  case A:\n"
1117             "    f();\n"
1118             "    break;\n"
1119             "  // On B:\n"
1120             "  case B:\n"
1121             "    g();\n"
1122             "    break;\n"
1123             "  }\n"
1124             "});",
1125             format("DEBUG({\n"
1126                    "  switch (x) {\n"
1127                    "  case A:\n"
1128                    "    f();\n"
1129                    "    break;\n"
1130                    "  // On B:\n"
1131                    "  case B:\n"
1132                    "    g();\n"
1133                    "    break;\n"
1134                    "  }\n"
1135                    "});",
1136                    getLLVMStyle()));
1137   EXPECT_EQ("switch (n) {\n"
1138             "case 0: {\n"
1139             "  return false;\n"
1140             "}\n"
1141             "default: {\n"
1142             "  return true;\n"
1143             "}\n"
1144             "}",
1145             format("switch (n)\n"
1146                    "{\n"
1147                    "case 0: {\n"
1148                    "  return false;\n"
1149                    "}\n"
1150                    "default: {\n"
1151                    "  return true;\n"
1152                    "}\n"
1153                    "}",
1154                    getLLVMStyle()));
1155   verifyFormat("switch (a) {\n"
1156                "case (b):\n"
1157                "  return;\n"
1158                "}");
1159 
1160   verifyFormat("switch (a) {\n"
1161                "case some_namespace::\n"
1162                "    some_constant:\n"
1163                "  return;\n"
1164                "}",
1165                getLLVMStyleWithColumns(34));
1166 
1167   FormatStyle Style = getLLVMStyle();
1168   Style.IndentCaseLabels = true;
1169   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never;
1170   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1171   Style.BraceWrapping.AfterCaseLabel = true;
1172   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always;
1173   EXPECT_EQ("switch (n)\n"
1174             "{\n"
1175             "  case 0:\n"
1176             "  {\n"
1177             "    return false;\n"
1178             "  }\n"
1179             "  default:\n"
1180             "  {\n"
1181             "    return true;\n"
1182             "  }\n"
1183             "}",
1184             format("switch (n) {\n"
1185                    "  case 0: {\n"
1186                    "    return false;\n"
1187                    "  }\n"
1188                    "  default: {\n"
1189                    "    return true;\n"
1190                    "  }\n"
1191                    "}",
1192                    Style));
1193   Style.BraceWrapping.AfterCaseLabel = false;
1194   EXPECT_EQ("switch (n)\n"
1195             "{\n"
1196             "  case 0: {\n"
1197             "    return false;\n"
1198             "  }\n"
1199             "  default: {\n"
1200             "    return true;\n"
1201             "  }\n"
1202             "}",
1203             format("switch (n) {\n"
1204                    "  case 0:\n"
1205                    "  {\n"
1206                    "    return false;\n"
1207                    "  }\n"
1208                    "  default:\n"
1209                    "  {\n"
1210                    "    return true;\n"
1211                    "  }\n"
1212                    "}",
1213                    Style));
1214   Style.IndentCaseLabels = false;
1215   Style.IndentCaseBlocks = true;
1216   EXPECT_EQ("switch (n)\n"
1217             "{\n"
1218             "case 0:\n"
1219             "  {\n"
1220             "    return false;\n"
1221             "  }\n"
1222             "case 1:\n"
1223             "  break;\n"
1224             "default:\n"
1225             "  {\n"
1226             "    return true;\n"
1227             "  }\n"
1228             "}",
1229             format("switch (n) {\n"
1230                    "case 0: {\n"
1231                    "  return false;\n"
1232                    "}\n"
1233                    "case 1:\n"
1234                    "  break;\n"
1235                    "default: {\n"
1236                    "  return true;\n"
1237                    "}\n"
1238                    "}",
1239                    Style));
1240   Style.IndentCaseLabels = true;
1241   Style.IndentCaseBlocks = true;
1242   EXPECT_EQ("switch (n)\n"
1243             "{\n"
1244             "  case 0:\n"
1245             "    {\n"
1246             "      return false;\n"
1247             "    }\n"
1248             "  case 1:\n"
1249             "    break;\n"
1250             "  default:\n"
1251             "    {\n"
1252             "      return true;\n"
1253             "    }\n"
1254             "}",
1255             format("switch (n) {\n"
1256                    "case 0: {\n"
1257                    "  return false;\n"
1258                    "}\n"
1259                    "case 1:\n"
1260                    "  break;\n"
1261                    "default: {\n"
1262                    "  return true;\n"
1263                    "}\n"
1264                    "}",
1265                    Style));
1266 }
1267 
1268 TEST_F(FormatTest, CaseRanges) {
1269   verifyFormat("switch (x) {\n"
1270                "case 'A' ... 'Z':\n"
1271                "case 1 ... 5:\n"
1272                "case a ... b:\n"
1273                "  break;\n"
1274                "}");
1275 }
1276 
1277 TEST_F(FormatTest, ShortCaseLabels) {
1278   FormatStyle Style = getLLVMStyle();
1279   Style.AllowShortCaseLabelsOnASingleLine = true;
1280   verifyFormat("switch (a) {\n"
1281                "case 1: x = 1; break;\n"
1282                "case 2: return;\n"
1283                "case 3:\n"
1284                "case 4:\n"
1285                "case 5: return;\n"
1286                "case 6: // comment\n"
1287                "  return;\n"
1288                "case 7:\n"
1289                "  // comment\n"
1290                "  return;\n"
1291                "case 8:\n"
1292                "  x = 8; // comment\n"
1293                "  break;\n"
1294                "default: y = 1; break;\n"
1295                "}",
1296                Style);
1297   verifyFormat("switch (a) {\n"
1298                "case 0: return; // comment\n"
1299                "case 1: break;  // comment\n"
1300                "case 2: return;\n"
1301                "// comment\n"
1302                "case 3: return;\n"
1303                "// comment 1\n"
1304                "// comment 2\n"
1305                "// comment 3\n"
1306                "case 4: break; /* comment */\n"
1307                "case 5:\n"
1308                "  // comment\n"
1309                "  break;\n"
1310                "case 6: /* comment */ x = 1; break;\n"
1311                "case 7: x = /* comment */ 1; break;\n"
1312                "case 8:\n"
1313                "  x = 1; /* comment */\n"
1314                "  break;\n"
1315                "case 9:\n"
1316                "  break; // comment line 1\n"
1317                "         // comment line 2\n"
1318                "}",
1319                Style);
1320   EXPECT_EQ("switch (a) {\n"
1321             "case 1:\n"
1322             "  x = 8;\n"
1323             "  // fall through\n"
1324             "case 2: x = 8;\n"
1325             "// comment\n"
1326             "case 3:\n"
1327             "  return; /* comment line 1\n"
1328             "           * comment line 2 */\n"
1329             "case 4: i = 8;\n"
1330             "// something else\n"
1331             "#if FOO\n"
1332             "case 5: break;\n"
1333             "#endif\n"
1334             "}",
1335             format("switch (a) {\n"
1336                    "case 1: x = 8;\n"
1337                    "  // fall through\n"
1338                    "case 2:\n"
1339                    "  x = 8;\n"
1340                    "// comment\n"
1341                    "case 3:\n"
1342                    "  return; /* comment line 1\n"
1343                    "           * comment line 2 */\n"
1344                    "case 4:\n"
1345                    "  i = 8;\n"
1346                    "// something else\n"
1347                    "#if FOO\n"
1348                    "case 5: break;\n"
1349                    "#endif\n"
1350                    "}",
1351                    Style));
1352   EXPECT_EQ("switch (a) {\n"
1353             "case 0:\n"
1354             "  return; // long long long long long long long long long long "
1355             "long long comment\n"
1356             "          // line\n"
1357             "}",
1358             format("switch (a) {\n"
1359                    "case 0: return; // long long long long long long long long "
1360                    "long long long long comment line\n"
1361                    "}",
1362                    Style));
1363   EXPECT_EQ("switch (a) {\n"
1364             "case 0:\n"
1365             "  return; /* long long long long long long long long long long "
1366             "long long comment\n"
1367             "             line */\n"
1368             "}",
1369             format("switch (a) {\n"
1370                    "case 0: return; /* long long long long long long long long "
1371                    "long long long long comment line */\n"
1372                    "}",
1373                    Style));
1374   verifyFormat("switch (a) {\n"
1375                "#if FOO\n"
1376                "case 0: return 0;\n"
1377                "#endif\n"
1378                "}",
1379                Style);
1380   verifyFormat("switch (a) {\n"
1381                "case 1: {\n"
1382                "}\n"
1383                "case 2: {\n"
1384                "  return;\n"
1385                "}\n"
1386                "case 3: {\n"
1387                "  x = 1;\n"
1388                "  return;\n"
1389                "}\n"
1390                "case 4:\n"
1391                "  if (x)\n"
1392                "    return;\n"
1393                "}",
1394                Style);
1395   Style.ColumnLimit = 21;
1396   verifyFormat("switch (a) {\n"
1397                "case 1: x = 1; break;\n"
1398                "case 2: return;\n"
1399                "case 3:\n"
1400                "case 4:\n"
1401                "case 5: return;\n"
1402                "default:\n"
1403                "  y = 1;\n"
1404                "  break;\n"
1405                "}",
1406                Style);
1407   Style.ColumnLimit = 80;
1408   Style.AllowShortCaseLabelsOnASingleLine = false;
1409   Style.IndentCaseLabels = true;
1410   EXPECT_EQ("switch (n) {\n"
1411             "  default /*comments*/:\n"
1412             "    return true;\n"
1413             "  case 0:\n"
1414             "    return false;\n"
1415             "}",
1416             format("switch (n) {\n"
1417                    "default/*comments*/:\n"
1418                    "  return true;\n"
1419                    "case 0:\n"
1420                    "  return false;\n"
1421                    "}",
1422                    Style));
1423   Style.AllowShortCaseLabelsOnASingleLine = true;
1424   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1425   Style.BraceWrapping.AfterCaseLabel = true;
1426   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always;
1427   EXPECT_EQ("switch (n)\n"
1428             "{\n"
1429             "  case 0:\n"
1430             "  {\n"
1431             "    return false;\n"
1432             "  }\n"
1433             "  default:\n"
1434             "  {\n"
1435             "    return true;\n"
1436             "  }\n"
1437             "}",
1438             format("switch (n) {\n"
1439                    "  case 0: {\n"
1440                    "    return false;\n"
1441                    "  }\n"
1442                    "  default:\n"
1443                    "  {\n"
1444                    "    return true;\n"
1445                    "  }\n"
1446                    "}",
1447                    Style));
1448 }
1449 
1450 TEST_F(FormatTest, FormatsLabels) {
1451   verifyFormat("void f() {\n"
1452                "  some_code();\n"
1453                "test_label:\n"
1454                "  some_other_code();\n"
1455                "  {\n"
1456                "    some_more_code();\n"
1457                "  another_label:\n"
1458                "    some_more_code();\n"
1459                "  }\n"
1460                "}");
1461   verifyFormat("{\n"
1462                "  some_code();\n"
1463                "test_label:\n"
1464                "  some_other_code();\n"
1465                "}");
1466   verifyFormat("{\n"
1467                "  some_code();\n"
1468                "test_label:;\n"
1469                "  int i = 0;\n"
1470                "}");
1471   FormatStyle Style = getLLVMStyle();
1472   Style.IndentGotoLabels = false;
1473   verifyFormat("void f() {\n"
1474                "  some_code();\n"
1475                "test_label:\n"
1476                "  some_other_code();\n"
1477                "  {\n"
1478                "    some_more_code();\n"
1479                "another_label:\n"
1480                "    some_more_code();\n"
1481                "  }\n"
1482                "}",
1483                Style);
1484   verifyFormat("{\n"
1485                "  some_code();\n"
1486                "test_label:\n"
1487                "  some_other_code();\n"
1488                "}",
1489                Style);
1490   verifyFormat("{\n"
1491                "  some_code();\n"
1492                "test_label:;\n"
1493                "  int i = 0;\n"
1494                "}");
1495 }
1496 
1497 TEST_F(FormatTest, MultiLineControlStatements) {
1498   FormatStyle Style = getLLVMStyle();
1499   Style.BreakBeforeBraces = FormatStyle::BraceBreakingStyle::BS_Custom;
1500   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_MultiLine;
1501   Style.ColumnLimit = 20;
1502   // Short lines should keep opening brace on same line.
1503   EXPECT_EQ("if (foo) {\n"
1504             "  bar();\n"
1505             "}",
1506             format("if(foo){bar();}", Style));
1507   EXPECT_EQ("if (foo) {\n"
1508             "  bar();\n"
1509             "} else {\n"
1510             "  baz();\n"
1511             "}",
1512             format("if(foo){bar();}else{baz();}", Style));
1513   EXPECT_EQ("if (foo && bar) {\n"
1514             "  baz();\n"
1515             "}",
1516             format("if(foo&&bar){baz();}", Style));
1517   EXPECT_EQ("if (foo) {\n"
1518             "  bar();\n"
1519             "} else if (baz) {\n"
1520             "  quux();\n"
1521             "}",
1522             format("if(foo){bar();}else if(baz){quux();}", Style));
1523   EXPECT_EQ(
1524       "if (foo) {\n"
1525       "  bar();\n"
1526       "} else if (baz) {\n"
1527       "  quux();\n"
1528       "} else {\n"
1529       "  foobar();\n"
1530       "}",
1531       format("if(foo){bar();}else if(baz){quux();}else{foobar();}", Style));
1532   EXPECT_EQ("for (;;) {\n"
1533             "  foo();\n"
1534             "}",
1535             format("for(;;){foo();}"));
1536   EXPECT_EQ("while (1) {\n"
1537             "  foo();\n"
1538             "}",
1539             format("while(1){foo();}", Style));
1540   EXPECT_EQ("switch (foo) {\n"
1541             "case bar:\n"
1542             "  return;\n"
1543             "}",
1544             format("switch(foo){case bar:return;}", Style));
1545   EXPECT_EQ("try {\n"
1546             "  foo();\n"
1547             "} catch (...) {\n"
1548             "  bar();\n"
1549             "}",
1550             format("try{foo();}catch(...){bar();}", Style));
1551   EXPECT_EQ("do {\n"
1552             "  foo();\n"
1553             "} while (bar &&\n"
1554             "         baz);",
1555             format("do{foo();}while(bar&&baz);", Style));
1556   // Long lines should put opening brace on new line.
1557   EXPECT_EQ("if (foo && bar &&\n"
1558             "    baz)\n"
1559             "{\n"
1560             "  quux();\n"
1561             "}",
1562             format("if(foo&&bar&&baz){quux();}", Style));
1563   EXPECT_EQ("if (foo && bar &&\n"
1564             "    baz)\n"
1565             "{\n"
1566             "  quux();\n"
1567             "}",
1568             format("if (foo && bar &&\n"
1569                    "    baz) {\n"
1570                    "  quux();\n"
1571                    "}",
1572                    Style));
1573   EXPECT_EQ("if (foo) {\n"
1574             "  bar();\n"
1575             "} else if (baz ||\n"
1576             "           quux)\n"
1577             "{\n"
1578             "  foobar();\n"
1579             "}",
1580             format("if(foo){bar();}else if(baz||quux){foobar();}", Style));
1581   EXPECT_EQ(
1582       "if (foo) {\n"
1583       "  bar();\n"
1584       "} else if (baz ||\n"
1585       "           quux)\n"
1586       "{\n"
1587       "  foobar();\n"
1588       "} else {\n"
1589       "  barbaz();\n"
1590       "}",
1591       format("if(foo){bar();}else if(baz||quux){foobar();}else{barbaz();}",
1592              Style));
1593   EXPECT_EQ("for (int i = 0;\n"
1594             "     i < 10; ++i)\n"
1595             "{\n"
1596             "  foo();\n"
1597             "}",
1598             format("for(int i=0;i<10;++i){foo();}", Style));
1599   EXPECT_EQ("while (foo || bar ||\n"
1600             "       baz)\n"
1601             "{\n"
1602             "  quux();\n"
1603             "}",
1604             format("while(foo||bar||baz){quux();}", Style));
1605   EXPECT_EQ("switch (\n"
1606             "    foo = barbaz)\n"
1607             "{\n"
1608             "case quux:\n"
1609             "  return;\n"
1610             "}",
1611             format("switch(foo=barbaz){case quux:return;}", Style));
1612   EXPECT_EQ("try {\n"
1613             "  foo();\n"
1614             "} catch (\n"
1615             "    Exception &bar)\n"
1616             "{\n"
1617             "  baz();\n"
1618             "}",
1619             format("try{foo();}catch(Exception&bar){baz();}", Style));
1620   Style.ColumnLimit =
1621       40; // to concentrate at brace wrapping, not line wrap due to column limit
1622   EXPECT_EQ("try {\n"
1623             "  foo();\n"
1624             "} catch (Exception &bar) {\n"
1625             "  baz();\n"
1626             "}",
1627             format("try{foo();}catch(Exception&bar){baz();}", Style));
1628   Style.ColumnLimit =
1629       20; // to concentrate at brace wrapping, not line wrap due to column limit
1630 
1631   Style.BraceWrapping.BeforeElse = true;
1632   EXPECT_EQ(
1633       "if (foo) {\n"
1634       "  bar();\n"
1635       "}\n"
1636       "else if (baz ||\n"
1637       "         quux)\n"
1638       "{\n"
1639       "  foobar();\n"
1640       "}\n"
1641       "else {\n"
1642       "  barbaz();\n"
1643       "}",
1644       format("if(foo){bar();}else if(baz||quux){foobar();}else{barbaz();}",
1645              Style));
1646 
1647   Style.BraceWrapping.BeforeCatch = true;
1648   EXPECT_EQ("try {\n"
1649             "  foo();\n"
1650             "}\n"
1651             "catch (...) {\n"
1652             "  baz();\n"
1653             "}",
1654             format("try{foo();}catch(...){baz();}", Style));
1655 }
1656 
1657 //===----------------------------------------------------------------------===//
1658 // Tests for classes, namespaces, etc.
1659 //===----------------------------------------------------------------------===//
1660 
1661 TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
1662   verifyFormat("class A {};");
1663 }
1664 
1665 TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1666   verifyFormat("class A {\n"
1667                "public:\n"
1668                "public: // comment\n"
1669                "protected:\n"
1670                "private:\n"
1671                "  void f() {}\n"
1672                "};");
1673   verifyFormat("export class A {\n"
1674                "public:\n"
1675                "public: // comment\n"
1676                "protected:\n"
1677                "private:\n"
1678                "  void f() {}\n"
1679                "};");
1680   verifyGoogleFormat("class A {\n"
1681                      " public:\n"
1682                      " protected:\n"
1683                      " private:\n"
1684                      "  void f() {}\n"
1685                      "};");
1686   verifyGoogleFormat("export class A {\n"
1687                      " public:\n"
1688                      " protected:\n"
1689                      " private:\n"
1690                      "  void f() {}\n"
1691                      "};");
1692   verifyFormat("class A {\n"
1693                "public slots:\n"
1694                "  void f1() {}\n"
1695                "public Q_SLOTS:\n"
1696                "  void f2() {}\n"
1697                "protected slots:\n"
1698                "  void f3() {}\n"
1699                "protected Q_SLOTS:\n"
1700                "  void f4() {}\n"
1701                "private slots:\n"
1702                "  void f5() {}\n"
1703                "private Q_SLOTS:\n"
1704                "  void f6() {}\n"
1705                "signals:\n"
1706                "  void g1();\n"
1707                "Q_SIGNALS:\n"
1708                "  void g2();\n"
1709                "};");
1710 
1711   // Don't interpret 'signals' the wrong way.
1712   verifyFormat("signals.set();");
1713   verifyFormat("for (Signals signals : f()) {\n}");
1714   verifyFormat("{\n"
1715                "  signals.set(); // This needs indentation.\n"
1716                "}");
1717   verifyFormat("void f() {\n"
1718                "label:\n"
1719                "  signals.baz();\n"
1720                "}");
1721 }
1722 
1723 TEST_F(FormatTest, SeparatesLogicalBlocks) {
1724   EXPECT_EQ("class A {\n"
1725             "public:\n"
1726             "  void f();\n"
1727             "\n"
1728             "private:\n"
1729             "  void g() {}\n"
1730             "  // test\n"
1731             "protected:\n"
1732             "  int h;\n"
1733             "};",
1734             format("class A {\n"
1735                    "public:\n"
1736                    "void f();\n"
1737                    "private:\n"
1738                    "void g() {}\n"
1739                    "// test\n"
1740                    "protected:\n"
1741                    "int h;\n"
1742                    "};"));
1743   EXPECT_EQ("class A {\n"
1744             "protected:\n"
1745             "public:\n"
1746             "  void f();\n"
1747             "};",
1748             format("class A {\n"
1749                    "protected:\n"
1750                    "\n"
1751                    "public:\n"
1752                    "\n"
1753                    "  void f();\n"
1754                    "};"));
1755 
1756   // Even ensure proper spacing inside macros.
1757   EXPECT_EQ("#define B     \\\n"
1758             "  class A {   \\\n"
1759             "   protected: \\\n"
1760             "   public:    \\\n"
1761             "    void f(); \\\n"
1762             "  };",
1763             format("#define B     \\\n"
1764                    "  class A {   \\\n"
1765                    "   protected: \\\n"
1766                    "              \\\n"
1767                    "   public:    \\\n"
1768                    "              \\\n"
1769                    "    void f(); \\\n"
1770                    "  };",
1771                    getGoogleStyle()));
1772   // But don't remove empty lines after macros ending in access specifiers.
1773   EXPECT_EQ("#define A private:\n"
1774             "\n"
1775             "int i;",
1776             format("#define A         private:\n"
1777                    "\n"
1778                    "int              i;"));
1779 }
1780 
1781 TEST_F(FormatTest, FormatsClasses) {
1782   verifyFormat("class A : public B {};");
1783   verifyFormat("class A : public ::B {};");
1784 
1785   verifyFormat(
1786       "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1787       "                             public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
1788   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1789                "    : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1790                "      public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
1791   verifyFormat(
1792       "class A : public B, public C, public D, public E, public F {};");
1793   verifyFormat("class AAAAAAAAAAAA : public B,\n"
1794                "                     public C,\n"
1795                "                     public D,\n"
1796                "                     public E,\n"
1797                "                     public F,\n"
1798                "                     public G {};");
1799 
1800   verifyFormat("class\n"
1801                "    ReallyReallyLongClassName {\n"
1802                "  int i;\n"
1803                "};",
1804                getLLVMStyleWithColumns(32));
1805   verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1806                "                           aaaaaaaaaaaaaaaa> {};");
1807   verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1808                "    : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1809                "                                 aaaaaaaaaaaaaaaaaaaaaa> {};");
1810   verifyFormat("template <class R, class C>\n"
1811                "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1812                "    : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
1813   verifyFormat("class ::A::B {};");
1814 }
1815 
1816 TEST_F(FormatTest, BreakInheritanceStyle) {
1817   FormatStyle StyleWithInheritanceBreakBeforeComma = getLLVMStyle();
1818   StyleWithInheritanceBreakBeforeComma.BreakInheritanceList =
1819       FormatStyle::BILS_BeforeComma;
1820   verifyFormat("class MyClass : public X {};",
1821                StyleWithInheritanceBreakBeforeComma);
1822   verifyFormat("class MyClass\n"
1823                "    : public X\n"
1824                "    , public Y {};",
1825                StyleWithInheritanceBreakBeforeComma);
1826   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA\n"
1827                "    : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n"
1828                "    , public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};",
1829                StyleWithInheritanceBreakBeforeComma);
1830   verifyFormat("struct aaaaaaaaaaaaa\n"
1831                "    : public aaaaaaaaaaaaaaaaaaa< // break\n"
1832                "          aaaaaaaaaaaaaaaa> {};",
1833                StyleWithInheritanceBreakBeforeComma);
1834 
1835   FormatStyle StyleWithInheritanceBreakAfterColon = getLLVMStyle();
1836   StyleWithInheritanceBreakAfterColon.BreakInheritanceList =
1837       FormatStyle::BILS_AfterColon;
1838   verifyFormat("class MyClass : public X {};",
1839                StyleWithInheritanceBreakAfterColon);
1840   verifyFormat("class MyClass : public X, public Y {};",
1841                StyleWithInheritanceBreakAfterColon);
1842   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA :\n"
1843                "    public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1844                "    public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};",
1845                StyleWithInheritanceBreakAfterColon);
1846   verifyFormat("struct aaaaaaaaaaaaa :\n"
1847                "    public aaaaaaaaaaaaaaaaaaa< // break\n"
1848                "        aaaaaaaaaaaaaaaa> {};",
1849                StyleWithInheritanceBreakAfterColon);
1850 }
1851 
1852 TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
1853   verifyFormat("class A {\n} a, b;");
1854   verifyFormat("struct A {\n} a, b;");
1855   verifyFormat("union A {\n} a;");
1856 }
1857 
1858 TEST_F(FormatTest, FormatsEnum) {
1859   verifyFormat("enum {\n"
1860                "  Zero,\n"
1861                "  One = 1,\n"
1862                "  Two = One + 1,\n"
1863                "  Three = (One + Two),\n"
1864                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1865                "  Five = (One, Two, Three, Four, 5)\n"
1866                "};");
1867   verifyGoogleFormat("enum {\n"
1868                      "  Zero,\n"
1869                      "  One = 1,\n"
1870                      "  Two = One + 1,\n"
1871                      "  Three = (One + Two),\n"
1872                      "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1873                      "  Five = (One, Two, Three, Four, 5)\n"
1874                      "};");
1875   verifyFormat("enum Enum {};");
1876   verifyFormat("enum {};");
1877   verifyFormat("enum X E {} d;");
1878   verifyFormat("enum __attribute__((...)) E {} d;");
1879   verifyFormat("enum __declspec__((...)) E {} d;");
1880   verifyFormat("enum {\n"
1881                "  Bar = Foo<int, int>::value\n"
1882                "};",
1883                getLLVMStyleWithColumns(30));
1884 
1885   verifyFormat("enum ShortEnum { A, B, C };");
1886   verifyGoogleFormat("enum ShortEnum { A, B, C };");
1887 
1888   EXPECT_EQ("enum KeepEmptyLines {\n"
1889             "  ONE,\n"
1890             "\n"
1891             "  TWO,\n"
1892             "\n"
1893             "  THREE\n"
1894             "}",
1895             format("enum KeepEmptyLines {\n"
1896                    "  ONE,\n"
1897                    "\n"
1898                    "  TWO,\n"
1899                    "\n"
1900                    "\n"
1901                    "  THREE\n"
1902                    "}"));
1903   verifyFormat("enum E { // comment\n"
1904                "  ONE,\n"
1905                "  TWO\n"
1906                "};\n"
1907                "int i;");
1908   // Not enums.
1909   verifyFormat("enum X f() {\n"
1910                "  a();\n"
1911                "  return 42;\n"
1912                "}");
1913   verifyFormat("enum X Type::f() {\n"
1914                "  a();\n"
1915                "  return 42;\n"
1916                "}");
1917   verifyFormat("enum ::X f() {\n"
1918                "  a();\n"
1919                "  return 42;\n"
1920                "}");
1921   verifyFormat("enum ns::X f() {\n"
1922                "  a();\n"
1923                "  return 42;\n"
1924                "}");
1925 }
1926 
1927 TEST_F(FormatTest, FormatsEnumsWithErrors) {
1928   verifyFormat("enum Type {\n"
1929                "  One = 0; // These semicolons should be commas.\n"
1930                "  Two = 1;\n"
1931                "};");
1932   verifyFormat("namespace n {\n"
1933                "enum Type {\n"
1934                "  One,\n"
1935                "  Two, // missing };\n"
1936                "  int i;\n"
1937                "}\n"
1938                "void g() {}");
1939 }
1940 
1941 TEST_F(FormatTest, FormatsEnumStruct) {
1942   verifyFormat("enum struct {\n"
1943                "  Zero,\n"
1944                "  One = 1,\n"
1945                "  Two = One + 1,\n"
1946                "  Three = (One + Two),\n"
1947                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1948                "  Five = (One, Two, Three, Four, 5)\n"
1949                "};");
1950   verifyFormat("enum struct Enum {};");
1951   verifyFormat("enum struct {};");
1952   verifyFormat("enum struct X E {} d;");
1953   verifyFormat("enum struct __attribute__((...)) E {} d;");
1954   verifyFormat("enum struct __declspec__((...)) E {} d;");
1955   verifyFormat("enum struct X f() {\n  a();\n  return 42;\n}");
1956 }
1957 
1958 TEST_F(FormatTest, FormatsEnumClass) {
1959   verifyFormat("enum class {\n"
1960                "  Zero,\n"
1961                "  One = 1,\n"
1962                "  Two = One + 1,\n"
1963                "  Three = (One + Two),\n"
1964                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1965                "  Five = (One, Two, Three, Four, 5)\n"
1966                "};");
1967   verifyFormat("enum class Enum {};");
1968   verifyFormat("enum class {};");
1969   verifyFormat("enum class X E {} d;");
1970   verifyFormat("enum class __attribute__((...)) E {} d;");
1971   verifyFormat("enum class __declspec__((...)) E {} d;");
1972   verifyFormat("enum class X f() {\n  a();\n  return 42;\n}");
1973 }
1974 
1975 TEST_F(FormatTest, FormatsEnumTypes) {
1976   verifyFormat("enum X : int {\n"
1977                "  A, // Force multiple lines.\n"
1978                "  B\n"
1979                "};");
1980   verifyFormat("enum X : int { A, B };");
1981   verifyFormat("enum X : std::uint32_t { A, B };");
1982 }
1983 
1984 TEST_F(FormatTest, FormatsTypedefEnum) {
1985   FormatStyle Style = getLLVMStyle();
1986   Style.ColumnLimit = 40;
1987   verifyFormat("typedef enum {} EmptyEnum;");
1988   verifyFormat("typedef enum { A, B, C } ShortEnum;");
1989   verifyFormat("typedef enum {\n"
1990                "  ZERO = 0,\n"
1991                "  ONE = 1,\n"
1992                "  TWO = 2,\n"
1993                "  THREE = 3\n"
1994                "} LongEnum;",
1995                Style);
1996   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1997   Style.BraceWrapping.AfterEnum = true;
1998   verifyFormat("typedef enum {} EmptyEnum;");
1999   verifyFormat("typedef enum { A, B, C } ShortEnum;");
2000   verifyFormat("typedef enum\n"
2001                "{\n"
2002                "  ZERO = 0,\n"
2003                "  ONE = 1,\n"
2004                "  TWO = 2,\n"
2005                "  THREE = 3\n"
2006                "} LongEnum;",
2007                Style);
2008 }
2009 
2010 TEST_F(FormatTest, FormatsNSEnums) {
2011   verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
2012   verifyGoogleFormat(
2013       "typedef NS_CLOSED_ENUM(NSInteger, SomeName) { AAA, BBB }");
2014   verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
2015                      "  // Information about someDecentlyLongValue.\n"
2016                      "  someDecentlyLongValue,\n"
2017                      "  // Information about anotherDecentlyLongValue.\n"
2018                      "  anotherDecentlyLongValue,\n"
2019                      "  // Information about aThirdDecentlyLongValue.\n"
2020                      "  aThirdDecentlyLongValue\n"
2021                      "};");
2022   verifyGoogleFormat("typedef NS_CLOSED_ENUM(NSInteger, MyType) {\n"
2023                      "  // Information about someDecentlyLongValue.\n"
2024                      "  someDecentlyLongValue,\n"
2025                      "  // Information about anotherDecentlyLongValue.\n"
2026                      "  anotherDecentlyLongValue,\n"
2027                      "  // Information about aThirdDecentlyLongValue.\n"
2028                      "  aThirdDecentlyLongValue\n"
2029                      "};");
2030   verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
2031                      "  a = 1,\n"
2032                      "  b = 2,\n"
2033                      "  c = 3,\n"
2034                      "};");
2035   verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
2036                      "  a = 1,\n"
2037                      "  b = 2,\n"
2038                      "  c = 3,\n"
2039                      "};");
2040   verifyGoogleFormat("typedef CF_CLOSED_ENUM(NSInteger, MyType) {\n"
2041                      "  a = 1,\n"
2042                      "  b = 2,\n"
2043                      "  c = 3,\n"
2044                      "};");
2045   verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
2046                      "  a = 1,\n"
2047                      "  b = 2,\n"
2048                      "  c = 3,\n"
2049                      "};");
2050 }
2051 
2052 TEST_F(FormatTest, FormatsBitfields) {
2053   verifyFormat("struct Bitfields {\n"
2054                "  unsigned sClass : 8;\n"
2055                "  unsigned ValueKind : 2;\n"
2056                "};");
2057   verifyFormat("struct A {\n"
2058                "  int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
2059                "      bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
2060                "};");
2061   verifyFormat("struct MyStruct {\n"
2062                "  uchar data;\n"
2063                "  uchar : 8;\n"
2064                "  uchar : 8;\n"
2065                "  uchar other;\n"
2066                "};");
2067 }
2068 
2069 TEST_F(FormatTest, FormatsNamespaces) {
2070   FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
2071   LLVMWithNoNamespaceFix.FixNamespaceComments = false;
2072 
2073   verifyFormat("namespace some_namespace {\n"
2074                "class A {};\n"
2075                "void f() { f(); }\n"
2076                "}",
2077                LLVMWithNoNamespaceFix);
2078   verifyFormat("namespace N::inline D {\n"
2079                "class A {};\n"
2080                "void f() { f(); }\n"
2081                "}",
2082                LLVMWithNoNamespaceFix);
2083   verifyFormat("namespace N::inline D::E {\n"
2084                "class A {};\n"
2085                "void f() { f(); }\n"
2086                "}",
2087                LLVMWithNoNamespaceFix);
2088   verifyFormat("namespace [[deprecated(\"foo[bar\")]] some_namespace {\n"
2089                "class A {};\n"
2090                "void f() { f(); }\n"
2091                "}",
2092                LLVMWithNoNamespaceFix);
2093   verifyFormat("/* something */ namespace some_namespace {\n"
2094                "class A {};\n"
2095                "void f() { f(); }\n"
2096                "}",
2097                LLVMWithNoNamespaceFix);
2098   verifyFormat("namespace {\n"
2099                "class A {};\n"
2100                "void f() { f(); }\n"
2101                "}",
2102                LLVMWithNoNamespaceFix);
2103   verifyFormat("/* something */ namespace {\n"
2104                "class A {};\n"
2105                "void f() { f(); }\n"
2106                "}",
2107                LLVMWithNoNamespaceFix);
2108   verifyFormat("inline namespace X {\n"
2109                "class A {};\n"
2110                "void f() { f(); }\n"
2111                "}",
2112                LLVMWithNoNamespaceFix);
2113   verifyFormat("/* something */ inline namespace X {\n"
2114                "class A {};\n"
2115                "void f() { f(); }\n"
2116                "}",
2117                LLVMWithNoNamespaceFix);
2118   verifyFormat("export namespace X {\n"
2119                "class A {};\n"
2120                "void f() { f(); }\n"
2121                "}",
2122                LLVMWithNoNamespaceFix);
2123   verifyFormat("using namespace some_namespace;\n"
2124                "class A {};\n"
2125                "void f() { f(); }",
2126                LLVMWithNoNamespaceFix);
2127 
2128   // This code is more common than we thought; if we
2129   // layout this correctly the semicolon will go into
2130   // its own line, which is undesirable.
2131   verifyFormat("namespace {};", LLVMWithNoNamespaceFix);
2132   verifyFormat("namespace {\n"
2133                "class A {};\n"
2134                "};",
2135                LLVMWithNoNamespaceFix);
2136 
2137   verifyFormat("namespace {\n"
2138                "int SomeVariable = 0; // comment\n"
2139                "} // namespace",
2140                LLVMWithNoNamespaceFix);
2141   EXPECT_EQ("#ifndef HEADER_GUARD\n"
2142             "#define HEADER_GUARD\n"
2143             "namespace my_namespace {\n"
2144             "int i;\n"
2145             "} // my_namespace\n"
2146             "#endif // HEADER_GUARD",
2147             format("#ifndef HEADER_GUARD\n"
2148                    " #define HEADER_GUARD\n"
2149                    "   namespace my_namespace {\n"
2150                    "int i;\n"
2151                    "}    // my_namespace\n"
2152                    "#endif    // HEADER_GUARD",
2153                    LLVMWithNoNamespaceFix));
2154 
2155   EXPECT_EQ("namespace A::B {\n"
2156             "class C {};\n"
2157             "}",
2158             format("namespace A::B {\n"
2159                    "class C {};\n"
2160                    "}",
2161                    LLVMWithNoNamespaceFix));
2162 
2163   FormatStyle Style = getLLVMStyle();
2164   Style.NamespaceIndentation = FormatStyle::NI_All;
2165   EXPECT_EQ("namespace out {\n"
2166             "  int i;\n"
2167             "  namespace in {\n"
2168             "    int i;\n"
2169             "  } // namespace in\n"
2170             "} // namespace out",
2171             format("namespace out {\n"
2172                    "int i;\n"
2173                    "namespace in {\n"
2174                    "int i;\n"
2175                    "} // namespace in\n"
2176                    "} // namespace out",
2177                    Style));
2178 
2179   Style.NamespaceIndentation = FormatStyle::NI_Inner;
2180   EXPECT_EQ("namespace out {\n"
2181             "int i;\n"
2182             "namespace in {\n"
2183             "  int i;\n"
2184             "} // namespace in\n"
2185             "} // namespace out",
2186             format("namespace out {\n"
2187                    "int i;\n"
2188                    "namespace in {\n"
2189                    "int i;\n"
2190                    "} // namespace in\n"
2191                    "} // namespace out",
2192                    Style));
2193 }
2194 
2195 TEST_F(FormatTest, NamespaceMacros) {
2196   FormatStyle Style = getLLVMStyle();
2197   Style.NamespaceMacros.push_back("TESTSUITE");
2198 
2199   verifyFormat("TESTSUITE(A) {\n"
2200                "int foo();\n"
2201                "} // TESTSUITE(A)",
2202                Style);
2203 
2204   verifyFormat("TESTSUITE(A, B) {\n"
2205                "int foo();\n"
2206                "} // TESTSUITE(A)",
2207                Style);
2208 
2209   // Properly indent according to NamespaceIndentation style
2210   Style.NamespaceIndentation = FormatStyle::NI_All;
2211   verifyFormat("TESTSUITE(A) {\n"
2212                "  int foo();\n"
2213                "} // TESTSUITE(A)",
2214                Style);
2215   verifyFormat("TESTSUITE(A) {\n"
2216                "  namespace B {\n"
2217                "    int foo();\n"
2218                "  } // namespace B\n"
2219                "} // TESTSUITE(A)",
2220                Style);
2221   verifyFormat("namespace A {\n"
2222                "  TESTSUITE(B) {\n"
2223                "    int foo();\n"
2224                "  } // TESTSUITE(B)\n"
2225                "} // namespace A",
2226                Style);
2227 
2228   Style.NamespaceIndentation = FormatStyle::NI_Inner;
2229   verifyFormat("TESTSUITE(A) {\n"
2230                "TESTSUITE(B) {\n"
2231                "  int foo();\n"
2232                "} // TESTSUITE(B)\n"
2233                "} // TESTSUITE(A)",
2234                Style);
2235   verifyFormat("TESTSUITE(A) {\n"
2236                "namespace B {\n"
2237                "  int foo();\n"
2238                "} // namespace B\n"
2239                "} // TESTSUITE(A)",
2240                Style);
2241   verifyFormat("namespace A {\n"
2242                "TESTSUITE(B) {\n"
2243                "  int foo();\n"
2244                "} // TESTSUITE(B)\n"
2245                "} // namespace A",
2246                Style);
2247 
2248   // Properly merge namespace-macros blocks in CompactNamespaces mode
2249   Style.NamespaceIndentation = FormatStyle::NI_None;
2250   Style.CompactNamespaces = true;
2251   verifyFormat("TESTSUITE(A) { TESTSUITE(B) {\n"
2252                "}} // TESTSUITE(A::B)",
2253                Style);
2254 
2255   EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n"
2256             "}} // TESTSUITE(out::in)",
2257             format("TESTSUITE(out) {\n"
2258                    "TESTSUITE(in) {\n"
2259                    "} // TESTSUITE(in)\n"
2260                    "} // TESTSUITE(out)",
2261                    Style));
2262 
2263   EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n"
2264             "}} // TESTSUITE(out::in)",
2265             format("TESTSUITE(out) {\n"
2266                    "TESTSUITE(in) {\n"
2267                    "} // TESTSUITE(in)\n"
2268                    "} // TESTSUITE(out)",
2269                    Style));
2270 
2271   // Do not merge different namespaces/macros
2272   EXPECT_EQ("namespace out {\n"
2273             "TESTSUITE(in) {\n"
2274             "} // TESTSUITE(in)\n"
2275             "} // namespace out",
2276             format("namespace out {\n"
2277                    "TESTSUITE(in) {\n"
2278                    "} // TESTSUITE(in)\n"
2279                    "} // namespace out",
2280                    Style));
2281   EXPECT_EQ("TESTSUITE(out) {\n"
2282             "namespace in {\n"
2283             "} // namespace in\n"
2284             "} // TESTSUITE(out)",
2285             format("TESTSUITE(out) {\n"
2286                    "namespace in {\n"
2287                    "} // namespace in\n"
2288                    "} // TESTSUITE(out)",
2289                    Style));
2290   Style.NamespaceMacros.push_back("FOOBAR");
2291   EXPECT_EQ("TESTSUITE(out) {\n"
2292             "FOOBAR(in) {\n"
2293             "} // FOOBAR(in)\n"
2294             "} // TESTSUITE(out)",
2295             format("TESTSUITE(out) {\n"
2296                    "FOOBAR(in) {\n"
2297                    "} // FOOBAR(in)\n"
2298                    "} // TESTSUITE(out)",
2299                    Style));
2300 }
2301 
2302 TEST_F(FormatTest, FormatsCompactNamespaces) {
2303   FormatStyle Style = getLLVMStyle();
2304   Style.CompactNamespaces = true;
2305   Style.NamespaceMacros.push_back("TESTSUITE");
2306 
2307   verifyFormat("namespace A { namespace B {\n"
2308                "}} // namespace A::B",
2309                Style);
2310 
2311   EXPECT_EQ("namespace out { namespace in {\n"
2312             "}} // namespace out::in",
2313             format("namespace out {\n"
2314                    "namespace in {\n"
2315                    "} // namespace in\n"
2316                    "} // namespace out",
2317                    Style));
2318 
2319   // Only namespaces which have both consecutive opening and end get compacted
2320   EXPECT_EQ("namespace out {\n"
2321             "namespace in1 {\n"
2322             "} // namespace in1\n"
2323             "namespace in2 {\n"
2324             "} // namespace in2\n"
2325             "} // namespace out",
2326             format("namespace out {\n"
2327                    "namespace in1 {\n"
2328                    "} // namespace in1\n"
2329                    "namespace in2 {\n"
2330                    "} // namespace in2\n"
2331                    "} // namespace out",
2332                    Style));
2333 
2334   EXPECT_EQ("namespace out {\n"
2335             "int i;\n"
2336             "namespace in {\n"
2337             "int j;\n"
2338             "} // namespace in\n"
2339             "int k;\n"
2340             "} // namespace out",
2341             format("namespace out { int i;\n"
2342                    "namespace in { int j; } // namespace in\n"
2343                    "int k; } // namespace out",
2344                    Style));
2345 
2346   EXPECT_EQ("namespace A { namespace B { namespace C {\n"
2347             "}}} // namespace A::B::C\n",
2348             format("namespace A { namespace B {\n"
2349                    "namespace C {\n"
2350                    "}} // namespace B::C\n"
2351                    "} // namespace A\n",
2352                    Style));
2353 
2354   Style.ColumnLimit = 40;
2355   EXPECT_EQ("namespace aaaaaaaaaa {\n"
2356             "namespace bbbbbbbbbb {\n"
2357             "}} // namespace aaaaaaaaaa::bbbbbbbbbb",
2358             format("namespace aaaaaaaaaa {\n"
2359                    "namespace bbbbbbbbbb {\n"
2360                    "} // namespace bbbbbbbbbb\n"
2361                    "} // namespace aaaaaaaaaa",
2362                    Style));
2363 
2364   EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n"
2365             "namespace cccccc {\n"
2366             "}}} // namespace aaaaaa::bbbbbb::cccccc",
2367             format("namespace aaaaaa {\n"
2368                    "namespace bbbbbb {\n"
2369                    "namespace cccccc {\n"
2370                    "} // namespace cccccc\n"
2371                    "} // namespace bbbbbb\n"
2372                    "} // namespace aaaaaa",
2373                    Style));
2374   Style.ColumnLimit = 80;
2375 
2376   // Extra semicolon after 'inner' closing brace prevents merging
2377   EXPECT_EQ("namespace out { namespace in {\n"
2378             "}; } // namespace out::in",
2379             format("namespace out {\n"
2380                    "namespace in {\n"
2381                    "}; // namespace in\n"
2382                    "} // namespace out",
2383                    Style));
2384 
2385   // Extra semicolon after 'outer' closing brace is conserved
2386   EXPECT_EQ("namespace out { namespace in {\n"
2387             "}}; // namespace out::in",
2388             format("namespace out {\n"
2389                    "namespace in {\n"
2390                    "} // namespace in\n"
2391                    "}; // namespace out",
2392                    Style));
2393 
2394   Style.NamespaceIndentation = FormatStyle::NI_All;
2395   EXPECT_EQ("namespace out { namespace in {\n"
2396             "  int i;\n"
2397             "}} // namespace out::in",
2398             format("namespace out {\n"
2399                    "namespace in {\n"
2400                    "int i;\n"
2401                    "} // namespace in\n"
2402                    "} // namespace out",
2403                    Style));
2404   EXPECT_EQ("namespace out { namespace mid {\n"
2405             "  namespace in {\n"
2406             "    int j;\n"
2407             "  } // namespace in\n"
2408             "  int k;\n"
2409             "}} // namespace out::mid",
2410             format("namespace out { namespace mid {\n"
2411                    "namespace in { int j; } // namespace in\n"
2412                    "int k; }} // namespace out::mid",
2413                    Style));
2414 
2415   Style.NamespaceIndentation = FormatStyle::NI_Inner;
2416   EXPECT_EQ("namespace out { namespace in {\n"
2417             "  int i;\n"
2418             "}} // namespace out::in",
2419             format("namespace out {\n"
2420                    "namespace in {\n"
2421                    "int i;\n"
2422                    "} // namespace in\n"
2423                    "} // namespace out",
2424                    Style));
2425   EXPECT_EQ("namespace out { namespace mid { namespace in {\n"
2426             "  int i;\n"
2427             "}}} // namespace out::mid::in",
2428             format("namespace out {\n"
2429                    "namespace mid {\n"
2430                    "namespace in {\n"
2431                    "int i;\n"
2432                    "} // namespace in\n"
2433                    "} // namespace mid\n"
2434                    "} // namespace out",
2435                    Style));
2436 }
2437 
2438 TEST_F(FormatTest, FormatsExternC) {
2439   verifyFormat("extern \"C\" {\nint a;");
2440   verifyFormat("extern \"C\" {}");
2441   verifyFormat("extern \"C\" {\n"
2442                "int foo();\n"
2443                "}");
2444   verifyFormat("extern \"C\" int foo() {}");
2445   verifyFormat("extern \"C\" int foo();");
2446   verifyFormat("extern \"C\" int foo() {\n"
2447                "  int i = 42;\n"
2448                "  return i;\n"
2449                "}");
2450 
2451   FormatStyle Style = getLLVMStyle();
2452   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2453   Style.BraceWrapping.AfterFunction = true;
2454   verifyFormat("extern \"C\" int foo() {}", Style);
2455   verifyFormat("extern \"C\" int foo();", Style);
2456   verifyFormat("extern \"C\" int foo()\n"
2457                "{\n"
2458                "  int i = 42;\n"
2459                "  return i;\n"
2460                "}",
2461                Style);
2462 
2463   Style.BraceWrapping.AfterExternBlock = true;
2464   Style.BraceWrapping.SplitEmptyRecord = false;
2465   verifyFormat("extern \"C\"\n"
2466                "{}",
2467                Style);
2468   verifyFormat("extern \"C\"\n"
2469                "{\n"
2470                "  int foo();\n"
2471                "}",
2472                Style);
2473 }
2474 
2475 TEST_F(FormatTest, FormatsInlineASM) {
2476   verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
2477   verifyFormat("asm(\"nop\" ::: \"memory\");");
2478   verifyFormat(
2479       "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
2480       "    \"cpuid\\n\\t\"\n"
2481       "    \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
2482       "    : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
2483       "    : \"a\"(value));");
2484   EXPECT_EQ(
2485       "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
2486       "  __asm {\n"
2487       "        mov     edx,[that] // vtable in edx\n"
2488       "        mov     eax,methodIndex\n"
2489       "        call    [edx][eax*4] // stdcall\n"
2490       "  }\n"
2491       "}",
2492       format("void NS_InvokeByIndex(void *that,   unsigned int methodIndex) {\n"
2493              "    __asm {\n"
2494              "        mov     edx,[that] // vtable in edx\n"
2495              "        mov     eax,methodIndex\n"
2496              "        call    [edx][eax*4] // stdcall\n"
2497              "    }\n"
2498              "}"));
2499   EXPECT_EQ("_asm {\n"
2500             "  xor eax, eax;\n"
2501             "  cpuid;\n"
2502             "}",
2503             format("_asm {\n"
2504                    "  xor eax, eax;\n"
2505                    "  cpuid;\n"
2506                    "}"));
2507   verifyFormat("void function() {\n"
2508                "  // comment\n"
2509                "  asm(\"\");\n"
2510                "}");
2511   EXPECT_EQ("__asm {\n"
2512             "}\n"
2513             "int i;",
2514             format("__asm   {\n"
2515                    "}\n"
2516                    "int   i;"));
2517 }
2518 
2519 TEST_F(FormatTest, FormatTryCatch) {
2520   verifyFormat("try {\n"
2521                "  throw a * b;\n"
2522                "} catch (int a) {\n"
2523                "  // Do nothing.\n"
2524                "} catch (...) {\n"
2525                "  exit(42);\n"
2526                "}");
2527 
2528   // Function-level try statements.
2529   verifyFormat("int f() try { return 4; } catch (...) {\n"
2530                "  return 5;\n"
2531                "}");
2532   verifyFormat("class A {\n"
2533                "  int a;\n"
2534                "  A() try : a(0) {\n"
2535                "  } catch (...) {\n"
2536                "    throw;\n"
2537                "  }\n"
2538                "};\n");
2539 
2540   // Incomplete try-catch blocks.
2541   verifyIncompleteFormat("try {} catch (");
2542 }
2543 
2544 TEST_F(FormatTest, FormatSEHTryCatch) {
2545   verifyFormat("__try {\n"
2546                "  int a = b * c;\n"
2547                "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
2548                "  // Do nothing.\n"
2549                "}");
2550 
2551   verifyFormat("__try {\n"
2552                "  int a = b * c;\n"
2553                "} __finally {\n"
2554                "  // Do nothing.\n"
2555                "}");
2556 
2557   verifyFormat("DEBUG({\n"
2558                "  __try {\n"
2559                "  } __finally {\n"
2560                "  }\n"
2561                "});\n");
2562 }
2563 
2564 TEST_F(FormatTest, IncompleteTryCatchBlocks) {
2565   verifyFormat("try {\n"
2566                "  f();\n"
2567                "} catch {\n"
2568                "  g();\n"
2569                "}");
2570   verifyFormat("try {\n"
2571                "  f();\n"
2572                "} catch (A a) MACRO(x) {\n"
2573                "  g();\n"
2574                "} catch (B b) MACRO(x) {\n"
2575                "  g();\n"
2576                "}");
2577 }
2578 
2579 TEST_F(FormatTest, FormatTryCatchBraceStyles) {
2580   FormatStyle Style = getLLVMStyle();
2581   for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
2582                           FormatStyle::BS_WebKit}) {
2583     Style.BreakBeforeBraces = BraceStyle;
2584     verifyFormat("try {\n"
2585                  "  // something\n"
2586                  "} catch (...) {\n"
2587                  "  // something\n"
2588                  "}",
2589                  Style);
2590   }
2591   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
2592   verifyFormat("try {\n"
2593                "  // something\n"
2594                "}\n"
2595                "catch (...) {\n"
2596                "  // something\n"
2597                "}",
2598                Style);
2599   verifyFormat("__try {\n"
2600                "  // something\n"
2601                "}\n"
2602                "__finally {\n"
2603                "  // something\n"
2604                "}",
2605                Style);
2606   verifyFormat("@try {\n"
2607                "  // something\n"
2608                "}\n"
2609                "@finally {\n"
2610                "  // something\n"
2611                "}",
2612                Style);
2613   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2614   verifyFormat("try\n"
2615                "{\n"
2616                "  // something\n"
2617                "}\n"
2618                "catch (...)\n"
2619                "{\n"
2620                "  // something\n"
2621                "}",
2622                Style);
2623   Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths;
2624   verifyFormat("try\n"
2625                "  {\n"
2626                "  // something white\n"
2627                "  }\n"
2628                "catch (...)\n"
2629                "  {\n"
2630                "  // something white\n"
2631                "  }",
2632                Style);
2633   Style.BreakBeforeBraces = FormatStyle::BS_GNU;
2634   verifyFormat("try\n"
2635                "  {\n"
2636                "    // something\n"
2637                "  }\n"
2638                "catch (...)\n"
2639                "  {\n"
2640                "    // something\n"
2641                "  }",
2642                Style);
2643   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2644   Style.BraceWrapping.BeforeCatch = true;
2645   verifyFormat("try {\n"
2646                "  // something\n"
2647                "}\n"
2648                "catch (...) {\n"
2649                "  // something\n"
2650                "}",
2651                Style);
2652 }
2653 
2654 TEST_F(FormatTest, StaticInitializers) {
2655   verifyFormat("static SomeClass SC = {1, 'a'};");
2656 
2657   verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
2658                "    100000000, "
2659                "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
2660 
2661   // Here, everything other than the "}" would fit on a line.
2662   verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
2663                "    10000000000000000000000000};");
2664   EXPECT_EQ("S s = {a,\n"
2665             "\n"
2666             "       b};",
2667             format("S s = {\n"
2668                    "  a,\n"
2669                    "\n"
2670                    "  b\n"
2671                    "};"));
2672 
2673   // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
2674   // line. However, the formatting looks a bit off and this probably doesn't
2675   // happen often in practice.
2676   verifyFormat("static int Variable[1] = {\n"
2677                "    {1000000000000000000000000000000000000}};",
2678                getLLVMStyleWithColumns(40));
2679 }
2680 
2681 TEST_F(FormatTest, DesignatedInitializers) {
2682   verifyFormat("const struct A a = {.a = 1, .b = 2};");
2683   verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
2684                "                    .bbbbbbbbbb = 2,\n"
2685                "                    .cccccccccc = 3,\n"
2686                "                    .dddddddddd = 4,\n"
2687                "                    .eeeeeeeeee = 5};");
2688   verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
2689                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
2690                "    .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
2691                "    .ccccccccccccccccccccccccccc = 3,\n"
2692                "    .ddddddddddddddddddddddddddd = 4,\n"
2693                "    .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
2694 
2695   verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
2696 
2697   verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
2698   verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n"
2699                "                    [2] = bbbbbbbbbb,\n"
2700                "                    [3] = cccccccccc,\n"
2701                "                    [4] = dddddddddd,\n"
2702                "                    [5] = eeeeeeeeee};");
2703   verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
2704                "    [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2705                "    [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2706                "    [3] = cccccccccccccccccccccccccccccccccccccc,\n"
2707                "    [4] = dddddddddddddddddddddddddddddddddddddd,\n"
2708                "    [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};");
2709 }
2710 
2711 TEST_F(FormatTest, NestedStaticInitializers) {
2712   verifyFormat("static A x = {{{}}};\n");
2713   verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
2714                "               {init1, init2, init3, init4}}};",
2715                getLLVMStyleWithColumns(50));
2716 
2717   verifyFormat("somes Status::global_reps[3] = {\n"
2718                "    {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2719                "    {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2720                "    {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
2721                getLLVMStyleWithColumns(60));
2722   verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
2723                      "    {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2724                      "    {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2725                      "    {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
2726   verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
2727                "                  {rect.fRight - rect.fLeft, rect.fBottom - "
2728                "rect.fTop}};");
2729 
2730   verifyFormat(
2731       "SomeArrayOfSomeType a = {\n"
2732       "    {{1, 2, 3},\n"
2733       "     {1, 2, 3},\n"
2734       "     {111111111111111111111111111111, 222222222222222222222222222222,\n"
2735       "      333333333333333333333333333333},\n"
2736       "     {1, 2, 3},\n"
2737       "     {1, 2, 3}}};");
2738   verifyFormat(
2739       "SomeArrayOfSomeType a = {\n"
2740       "    {{1, 2, 3}},\n"
2741       "    {{1, 2, 3}},\n"
2742       "    {{111111111111111111111111111111, 222222222222222222222222222222,\n"
2743       "      333333333333333333333333333333}},\n"
2744       "    {{1, 2, 3}},\n"
2745       "    {{1, 2, 3}}};");
2746 
2747   verifyFormat("struct {\n"
2748                "  unsigned bit;\n"
2749                "  const char *const name;\n"
2750                "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
2751                "                 {kOsWin, \"Windows\"},\n"
2752                "                 {kOsLinux, \"Linux\"},\n"
2753                "                 {kOsCrOS, \"Chrome OS\"}};");
2754   verifyFormat("struct {\n"
2755                "  unsigned bit;\n"
2756                "  const char *const name;\n"
2757                "} kBitsToOs[] = {\n"
2758                "    {kOsMac, \"Mac\"},\n"
2759                "    {kOsWin, \"Windows\"},\n"
2760                "    {kOsLinux, \"Linux\"},\n"
2761                "    {kOsCrOS, \"Chrome OS\"},\n"
2762                "};");
2763 }
2764 
2765 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
2766   verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2767                "                      \\\n"
2768                "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
2769 }
2770 
2771 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
2772   verifyFormat("virtual void write(ELFWriter *writerrr,\n"
2773                "                   OwningPtr<FileOutputBuffer> &buffer) = 0;");
2774 
2775   // Do break defaulted and deleted functions.
2776   verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2777                "    default;",
2778                getLLVMStyleWithColumns(40));
2779   verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2780                "    delete;",
2781                getLLVMStyleWithColumns(40));
2782 }
2783 
2784 TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
2785   verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
2786                getLLVMStyleWithColumns(40));
2787   verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2788                getLLVMStyleWithColumns(40));
2789   EXPECT_EQ("#define Q                              \\\n"
2790             "  \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\"    \\\n"
2791             "  \"aaaaaaaa.cpp\"",
2792             format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2793                    getLLVMStyleWithColumns(40)));
2794 }
2795 
2796 TEST_F(FormatTest, UnderstandsLinePPDirective) {
2797   EXPECT_EQ("# 123 \"A string literal\"",
2798             format("   #     123    \"A string literal\""));
2799 }
2800 
2801 TEST_F(FormatTest, LayoutUnknownPPDirective) {
2802   EXPECT_EQ("#;", format("#;"));
2803   verifyFormat("#\n;\n;\n;");
2804 }
2805 
2806 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
2807   EXPECT_EQ("#line 42 \"test\"\n",
2808             format("#  \\\n  line  \\\n  42  \\\n  \"test\"\n"));
2809   EXPECT_EQ("#define A B\n", format("#  \\\n define  \\\n    A  \\\n       B\n",
2810                                     getLLVMStyleWithColumns(12)));
2811 }
2812 
2813 TEST_F(FormatTest, EndOfFileEndsPPDirective) {
2814   EXPECT_EQ("#line 42 \"test\"",
2815             format("#  \\\n  line  \\\n  42  \\\n  \"test\""));
2816   EXPECT_EQ("#define A B", format("#  \\\n define  \\\n    A  \\\n       B"));
2817 }
2818 
2819 TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
2820   verifyFormat("#define A \\x20");
2821   verifyFormat("#define A \\ x20");
2822   EXPECT_EQ("#define A \\ x20", format("#define A \\   x20"));
2823   verifyFormat("#define A ''");
2824   verifyFormat("#define A ''qqq");
2825   verifyFormat("#define A `qqq");
2826   verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
2827   EXPECT_EQ("const char *c = STRINGIFY(\n"
2828             "\\na : b);",
2829             format("const char * c = STRINGIFY(\n"
2830                    "\\na : b);"));
2831 
2832   verifyFormat("a\r\\");
2833   verifyFormat("a\v\\");
2834   verifyFormat("a\f\\");
2835 }
2836 
2837 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
2838   verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
2839   verifyFormat("#define A( \\\n    BB)", getLLVMStyleWithColumns(12));
2840   verifyFormat("#define A( \\\n    A, B)", getLLVMStyleWithColumns(12));
2841   // FIXME: We never break before the macro name.
2842   verifyFormat("#define AA( \\\n    B)", getLLVMStyleWithColumns(12));
2843 
2844   verifyFormat("#define A A\n#define A A");
2845   verifyFormat("#define A(X) A\n#define A A");
2846 
2847   verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
2848   verifyFormat("#define Something    \\\n  Other", getLLVMStyleWithColumns(22));
2849 }
2850 
2851 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
2852   EXPECT_EQ("// somecomment\n"
2853             "#include \"a.h\"\n"
2854             "#define A(  \\\n"
2855             "    A, B)\n"
2856             "#include \"b.h\"\n"
2857             "// somecomment\n",
2858             format("  // somecomment\n"
2859                    "  #include \"a.h\"\n"
2860                    "#define A(A,\\\n"
2861                    "    B)\n"
2862                    "    #include \"b.h\"\n"
2863                    " // somecomment\n",
2864                    getLLVMStyleWithColumns(13)));
2865 }
2866 
2867 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
2868 
2869 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
2870   EXPECT_EQ("#define A    \\\n"
2871             "  c;         \\\n"
2872             "  e;\n"
2873             "f;",
2874             format("#define A c; e;\n"
2875                    "f;",
2876                    getLLVMStyleWithColumns(14)));
2877 }
2878 
2879 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
2880 
2881 TEST_F(FormatTest, MacroDefinitionInsideStatement) {
2882   EXPECT_EQ("int x,\n"
2883             "#define A\n"
2884             "    y;",
2885             format("int x,\n#define A\ny;"));
2886 }
2887 
2888 TEST_F(FormatTest, HashInMacroDefinition) {
2889   EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
2890   verifyFormat("#define A \\\n  b #c;", getLLVMStyleWithColumns(11));
2891   verifyFormat("#define A  \\\n"
2892                "  {        \\\n"
2893                "    f(#c); \\\n"
2894                "  }",
2895                getLLVMStyleWithColumns(11));
2896 
2897   verifyFormat("#define A(X)         \\\n"
2898                "  void function##X()",
2899                getLLVMStyleWithColumns(22));
2900 
2901   verifyFormat("#define A(a, b, c)   \\\n"
2902                "  void a##b##c()",
2903                getLLVMStyleWithColumns(22));
2904 
2905   verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
2906 }
2907 
2908 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
2909   EXPECT_EQ("#define A (x)", format("#define A (x)"));
2910   EXPECT_EQ("#define A(x)", format("#define A(x)"));
2911 
2912   FormatStyle Style = getLLVMStyle();
2913   Style.SpaceBeforeParens = FormatStyle::SBPO_Never;
2914   verifyFormat("#define true ((foo)1)", Style);
2915   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
2916   verifyFormat("#define false((foo)0)", Style);
2917 }
2918 
2919 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
2920   EXPECT_EQ("#define A b;", format("#define A \\\n"
2921                                    "          \\\n"
2922                                    "  b;",
2923                                    getLLVMStyleWithColumns(25)));
2924   EXPECT_EQ("#define A \\\n"
2925             "          \\\n"
2926             "  a;      \\\n"
2927             "  b;",
2928             format("#define A \\\n"
2929                    "          \\\n"
2930                    "  a;      \\\n"
2931                    "  b;",
2932                    getLLVMStyleWithColumns(11)));
2933   EXPECT_EQ("#define A \\\n"
2934             "  a;      \\\n"
2935             "          \\\n"
2936             "  b;",
2937             format("#define A \\\n"
2938                    "  a;      \\\n"
2939                    "          \\\n"
2940                    "  b;",
2941                    getLLVMStyleWithColumns(11)));
2942 }
2943 
2944 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
2945   verifyIncompleteFormat("#define A :");
2946   verifyFormat("#define SOMECASES  \\\n"
2947                "  case 1:          \\\n"
2948                "  case 2\n",
2949                getLLVMStyleWithColumns(20));
2950   verifyFormat("#define MACRO(a) \\\n"
2951                "  if (a)         \\\n"
2952                "    f();         \\\n"
2953                "  else           \\\n"
2954                "    g()",
2955                getLLVMStyleWithColumns(18));
2956   verifyFormat("#define A template <typename T>");
2957   verifyIncompleteFormat("#define STR(x) #x\n"
2958                          "f(STR(this_is_a_string_literal{));");
2959   verifyFormat("#pragma omp threadprivate( \\\n"
2960                "    y)), // expected-warning",
2961                getLLVMStyleWithColumns(28));
2962   verifyFormat("#d, = };");
2963   verifyFormat("#if \"a");
2964   verifyIncompleteFormat("({\n"
2965                          "#define b     \\\n"
2966                          "  }           \\\n"
2967                          "  a\n"
2968                          "a",
2969                          getLLVMStyleWithColumns(15));
2970   verifyFormat("#define A     \\\n"
2971                "  {           \\\n"
2972                "    {\n"
2973                "#define B     \\\n"
2974                "  }           \\\n"
2975                "  }",
2976                getLLVMStyleWithColumns(15));
2977   verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
2978   verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
2979   verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
2980   verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() {      \n)}");
2981 }
2982 
2983 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
2984   verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
2985   EXPECT_EQ("class A : public QObject {\n"
2986             "  Q_OBJECT\n"
2987             "\n"
2988             "  A() {}\n"
2989             "};",
2990             format("class A  :  public QObject {\n"
2991                    "     Q_OBJECT\n"
2992                    "\n"
2993                    "  A() {\n}\n"
2994                    "}  ;"));
2995   EXPECT_EQ("MACRO\n"
2996             "/*static*/ int i;",
2997             format("MACRO\n"
2998                    " /*static*/ int   i;"));
2999   EXPECT_EQ("SOME_MACRO\n"
3000             "namespace {\n"
3001             "void f();\n"
3002             "} // namespace",
3003             format("SOME_MACRO\n"
3004                    "  namespace    {\n"
3005                    "void   f(  );\n"
3006                    "} // namespace"));
3007   // Only if the identifier contains at least 5 characters.
3008   EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
3009   EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
3010   // Only if everything is upper case.
3011   EXPECT_EQ("class A : public QObject {\n"
3012             "  Q_Object A() {}\n"
3013             "};",
3014             format("class A  :  public QObject {\n"
3015                    "     Q_Object\n"
3016                    "  A() {\n}\n"
3017                    "}  ;"));
3018 
3019   // Only if the next line can actually start an unwrapped line.
3020   EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
3021             format("SOME_WEIRD_LOG_MACRO\n"
3022                    "<< SomeThing;"));
3023 
3024   verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
3025                "(n, buffers))\n",
3026                getChromiumStyle(FormatStyle::LK_Cpp));
3027 
3028   // See PR41483
3029   EXPECT_EQ("/**/ FOO(a)\n"
3030             "FOO(b)",
3031             format("/**/ FOO(a)\n"
3032                    "FOO(b)"));
3033 }
3034 
3035 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
3036   EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3037             "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3038             "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
3039             "class X {};\n"
3040             "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3041             "int *createScopDetectionPass() { return 0; }",
3042             format("  INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3043                    "  INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3044                    "  INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
3045                    "  class X {};\n"
3046                    "  INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3047                    "  int *createScopDetectionPass() { return 0; }"));
3048   // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
3049   // braces, so that inner block is indented one level more.
3050   EXPECT_EQ("int q() {\n"
3051             "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3052             "  IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3053             "  IPC_END_MESSAGE_MAP()\n"
3054             "}",
3055             format("int q() {\n"
3056                    "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3057                    "    IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3058                    "  IPC_END_MESSAGE_MAP()\n"
3059                    "}"));
3060 
3061   // Same inside macros.
3062   EXPECT_EQ("#define LIST(L) \\\n"
3063             "  L(A)          \\\n"
3064             "  L(B)          \\\n"
3065             "  L(C)",
3066             format("#define LIST(L) \\\n"
3067                    "  L(A) \\\n"
3068                    "  L(B) \\\n"
3069                    "  L(C)",
3070                    getGoogleStyle()));
3071 
3072   // These must not be recognized as macros.
3073   EXPECT_EQ("int q() {\n"
3074             "  f(x);\n"
3075             "  f(x) {}\n"
3076             "  f(x)->g();\n"
3077             "  f(x)->*g();\n"
3078             "  f(x).g();\n"
3079             "  f(x) = x;\n"
3080             "  f(x) += x;\n"
3081             "  f(x) -= x;\n"
3082             "  f(x) *= x;\n"
3083             "  f(x) /= x;\n"
3084             "  f(x) %= x;\n"
3085             "  f(x) &= x;\n"
3086             "  f(x) |= x;\n"
3087             "  f(x) ^= x;\n"
3088             "  f(x) >>= x;\n"
3089             "  f(x) <<= x;\n"
3090             "  f(x)[y].z();\n"
3091             "  LOG(INFO) << x;\n"
3092             "  ifstream(x) >> x;\n"
3093             "}\n",
3094             format("int q() {\n"
3095                    "  f(x)\n;\n"
3096                    "  f(x)\n {}\n"
3097                    "  f(x)\n->g();\n"
3098                    "  f(x)\n->*g();\n"
3099                    "  f(x)\n.g();\n"
3100                    "  f(x)\n = x;\n"
3101                    "  f(x)\n += x;\n"
3102                    "  f(x)\n -= x;\n"
3103                    "  f(x)\n *= x;\n"
3104                    "  f(x)\n /= x;\n"
3105                    "  f(x)\n %= x;\n"
3106                    "  f(x)\n &= x;\n"
3107                    "  f(x)\n |= x;\n"
3108                    "  f(x)\n ^= x;\n"
3109                    "  f(x)\n >>= x;\n"
3110                    "  f(x)\n <<= x;\n"
3111                    "  f(x)\n[y].z();\n"
3112                    "  LOG(INFO)\n << x;\n"
3113                    "  ifstream(x)\n >> x;\n"
3114                    "}\n"));
3115   EXPECT_EQ("int q() {\n"
3116             "  F(x)\n"
3117             "  if (1) {\n"
3118             "  }\n"
3119             "  F(x)\n"
3120             "  while (1) {\n"
3121             "  }\n"
3122             "  F(x)\n"
3123             "  G(x);\n"
3124             "  F(x)\n"
3125             "  try {\n"
3126             "    Q();\n"
3127             "  } catch (...) {\n"
3128             "  }\n"
3129             "}\n",
3130             format("int q() {\n"
3131                    "F(x)\n"
3132                    "if (1) {}\n"
3133                    "F(x)\n"
3134                    "while (1) {}\n"
3135                    "F(x)\n"
3136                    "G(x);\n"
3137                    "F(x)\n"
3138                    "try { Q(); } catch (...) {}\n"
3139                    "}\n"));
3140   EXPECT_EQ("class A {\n"
3141             "  A() : t(0) {}\n"
3142             "  A(int i) noexcept() : {}\n"
3143             "  A(X x)\n" // FIXME: function-level try blocks are broken.
3144             "  try : t(0) {\n"
3145             "  } catch (...) {\n"
3146             "  }\n"
3147             "};",
3148             format("class A {\n"
3149                    "  A()\n : t(0) {}\n"
3150                    "  A(int i)\n noexcept() : {}\n"
3151                    "  A(X x)\n"
3152                    "  try : t(0) {} catch (...) {}\n"
3153                    "};"));
3154   FormatStyle Style = getLLVMStyle();
3155   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
3156   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always;
3157   Style.BraceWrapping.AfterFunction = true;
3158   EXPECT_EQ("void f()\n"
3159             "try\n"
3160             "{\n"
3161             "}",
3162             format("void f() try {\n"
3163                    "}",
3164                    Style));
3165   EXPECT_EQ("class SomeClass {\n"
3166             "public:\n"
3167             "  SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3168             "};",
3169             format("class SomeClass {\n"
3170                    "public:\n"
3171                    "  SomeClass()\n"
3172                    "  EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3173                    "};"));
3174   EXPECT_EQ("class SomeClass {\n"
3175             "public:\n"
3176             "  SomeClass()\n"
3177             "      EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3178             "};",
3179             format("class SomeClass {\n"
3180                    "public:\n"
3181                    "  SomeClass()\n"
3182                    "  EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3183                    "};",
3184                    getLLVMStyleWithColumns(40)));
3185 
3186   verifyFormat("MACRO(>)");
3187 
3188   // Some macros contain an implicit semicolon.
3189   Style = getLLVMStyle();
3190   Style.StatementMacros.push_back("FOO");
3191   verifyFormat("FOO(a) int b = 0;");
3192   verifyFormat("FOO(a)\n"
3193                "int b = 0;",
3194                Style);
3195   verifyFormat("FOO(a);\n"
3196                "int b = 0;",
3197                Style);
3198   verifyFormat("FOO(argc, argv, \"4.0.2\")\n"
3199                "int b = 0;",
3200                Style);
3201   verifyFormat("FOO()\n"
3202                "int b = 0;",
3203                Style);
3204   verifyFormat("FOO\n"
3205                "int b = 0;",
3206                Style);
3207   verifyFormat("void f() {\n"
3208                "  FOO(a)\n"
3209                "  return a;\n"
3210                "}",
3211                Style);
3212   verifyFormat("FOO(a)\n"
3213                "FOO(b)",
3214                Style);
3215   verifyFormat("int a = 0;\n"
3216                "FOO(b)\n"
3217                "int c = 0;",
3218                Style);
3219   verifyFormat("int a = 0;\n"
3220                "int x = FOO(a)\n"
3221                "int b = 0;",
3222                Style);
3223   verifyFormat("void foo(int a) { FOO(a) }\n"
3224                "uint32_t bar() {}",
3225                Style);
3226 }
3227 
3228 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
3229   verifyFormat("#define A \\\n"
3230                "  f({     \\\n"
3231                "    g();  \\\n"
3232                "  });",
3233                getLLVMStyleWithColumns(11));
3234 }
3235 
3236 TEST_F(FormatTest, IndentPreprocessorDirectives) {
3237   FormatStyle Style = getLLVMStyle();
3238   Style.IndentPPDirectives = FormatStyle::PPDIS_None;
3239   Style.ColumnLimit = 40;
3240   verifyFormat("#ifdef _WIN32\n"
3241                "#define A 0\n"
3242                "#ifdef VAR2\n"
3243                "#define B 1\n"
3244                "#include <someheader.h>\n"
3245                "#define MACRO                          \\\n"
3246                "  some_very_long_func_aaaaaaaaaa();\n"
3247                "#endif\n"
3248                "#else\n"
3249                "#define A 1\n"
3250                "#endif",
3251                Style);
3252   Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash;
3253   verifyFormat("#ifdef _WIN32\n"
3254                "#  define A 0\n"
3255                "#  ifdef VAR2\n"
3256                "#    define B 1\n"
3257                "#    include <someheader.h>\n"
3258                "#    define MACRO                      \\\n"
3259                "      some_very_long_func_aaaaaaaaaa();\n"
3260                "#  endif\n"
3261                "#else\n"
3262                "#  define A 1\n"
3263                "#endif",
3264                Style);
3265   verifyFormat("#if A\n"
3266                "#  define MACRO                        \\\n"
3267                "    void a(int x) {                    \\\n"
3268                "      b();                             \\\n"
3269                "      c();                             \\\n"
3270                "      d();                             \\\n"
3271                "      e();                             \\\n"
3272                "      f();                             \\\n"
3273                "    }\n"
3274                "#endif",
3275                Style);
3276   // Comments before include guard.
3277   verifyFormat("// file comment\n"
3278                "// file comment\n"
3279                "#ifndef HEADER_H\n"
3280                "#define HEADER_H\n"
3281                "code();\n"
3282                "#endif",
3283                Style);
3284   // Test with include guards.
3285   verifyFormat("#ifndef HEADER_H\n"
3286                "#define HEADER_H\n"
3287                "code();\n"
3288                "#endif",
3289                Style);
3290   // Include guards must have a #define with the same variable immediately
3291   // after #ifndef.
3292   verifyFormat("#ifndef NOT_GUARD\n"
3293                "#  define FOO\n"
3294                "code();\n"
3295                "#endif",
3296                Style);
3297 
3298   // Include guards must cover the entire file.
3299   verifyFormat("code();\n"
3300                "code();\n"
3301                "#ifndef NOT_GUARD\n"
3302                "#  define NOT_GUARD\n"
3303                "code();\n"
3304                "#endif",
3305                Style);
3306   verifyFormat("#ifndef NOT_GUARD\n"
3307                "#  define NOT_GUARD\n"
3308                "code();\n"
3309                "#endif\n"
3310                "code();",
3311                Style);
3312   // Test with trailing blank lines.
3313   verifyFormat("#ifndef HEADER_H\n"
3314                "#define HEADER_H\n"
3315                "code();\n"
3316                "#endif\n",
3317                Style);
3318   // Include guards don't have #else.
3319   verifyFormat("#ifndef NOT_GUARD\n"
3320                "#  define NOT_GUARD\n"
3321                "code();\n"
3322                "#else\n"
3323                "#endif",
3324                Style);
3325   verifyFormat("#ifndef NOT_GUARD\n"
3326                "#  define NOT_GUARD\n"
3327                "code();\n"
3328                "#elif FOO\n"
3329                "#endif",
3330                Style);
3331   // Non-identifier #define after potential include guard.
3332   verifyFormat("#ifndef FOO\n"
3333                "#  define 1\n"
3334                "#endif\n",
3335                Style);
3336   // #if closes past last non-preprocessor line.
3337   verifyFormat("#ifndef FOO\n"
3338                "#define FOO\n"
3339                "#if 1\n"
3340                "int i;\n"
3341                "#  define A 0\n"
3342                "#endif\n"
3343                "#endif\n",
3344                Style);
3345   // Don't crash if there is an #elif directive without a condition.
3346   verifyFormat("#if 1\n"
3347                "int x;\n"
3348                "#elif\n"
3349                "int y;\n"
3350                "#else\n"
3351                "int z;\n"
3352                "#endif",
3353                Style);
3354   // FIXME: This doesn't handle the case where there's code between the
3355   // #ifndef and #define but all other conditions hold. This is because when
3356   // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the
3357   // previous code line yet, so we can't detect it.
3358   EXPECT_EQ("#ifndef NOT_GUARD\n"
3359             "code();\n"
3360             "#define NOT_GUARD\n"
3361             "code();\n"
3362             "#endif",
3363             format("#ifndef NOT_GUARD\n"
3364                    "code();\n"
3365                    "#  define NOT_GUARD\n"
3366                    "code();\n"
3367                    "#endif",
3368                    Style));
3369   // FIXME: This doesn't handle cases where legitimate preprocessor lines may
3370   // be outside an include guard. Examples are #pragma once and
3371   // #pragma GCC diagnostic, or anything else that does not change the meaning
3372   // of the file if it's included multiple times.
3373   EXPECT_EQ("#ifdef WIN32\n"
3374             "#  pragma once\n"
3375             "#endif\n"
3376             "#ifndef HEADER_H\n"
3377             "#  define HEADER_H\n"
3378             "code();\n"
3379             "#endif",
3380             format("#ifdef WIN32\n"
3381                    "#  pragma once\n"
3382                    "#endif\n"
3383                    "#ifndef HEADER_H\n"
3384                    "#define HEADER_H\n"
3385                    "code();\n"
3386                    "#endif",
3387                    Style));
3388   // FIXME: This does not detect when there is a single non-preprocessor line
3389   // in front of an include-guard-like structure where other conditions hold
3390   // because ScopedLineState hides the line.
3391   EXPECT_EQ("code();\n"
3392             "#ifndef HEADER_H\n"
3393             "#define HEADER_H\n"
3394             "code();\n"
3395             "#endif",
3396             format("code();\n"
3397                    "#ifndef HEADER_H\n"
3398                    "#  define HEADER_H\n"
3399                    "code();\n"
3400                    "#endif",
3401                    Style));
3402   // Keep comments aligned with #, otherwise indent comments normally. These
3403   // tests cannot use verifyFormat because messUp manipulates leading
3404   // whitespace.
3405   {
3406     const char *Expected = ""
3407                            "void f() {\n"
3408                            "#if 1\n"
3409                            "// Preprocessor aligned.\n"
3410                            "#  define A 0\n"
3411                            "  // Code. Separated by blank line.\n"
3412                            "\n"
3413                            "#  define B 0\n"
3414                            "  // Code. Not aligned with #\n"
3415                            "#  define C 0\n"
3416                            "#endif";
3417     const char *ToFormat = ""
3418                            "void f() {\n"
3419                            "#if 1\n"
3420                            "// Preprocessor aligned.\n"
3421                            "#  define A 0\n"
3422                            "// Code. Separated by blank line.\n"
3423                            "\n"
3424                            "#  define B 0\n"
3425                            "   // Code. Not aligned with #\n"
3426                            "#  define C 0\n"
3427                            "#endif";
3428     EXPECT_EQ(Expected, format(ToFormat, Style));
3429     EXPECT_EQ(Expected, format(Expected, Style));
3430   }
3431   // Keep block quotes aligned.
3432   {
3433     const char *Expected = ""
3434                            "void f() {\n"
3435                            "#if 1\n"
3436                            "/* Preprocessor aligned. */\n"
3437                            "#  define A 0\n"
3438                            "  /* Code. Separated by blank line. */\n"
3439                            "\n"
3440                            "#  define B 0\n"
3441                            "  /* Code. Not aligned with # */\n"
3442                            "#  define C 0\n"
3443                            "#endif";
3444     const char *ToFormat = ""
3445                            "void f() {\n"
3446                            "#if 1\n"
3447                            "/* Preprocessor aligned. */\n"
3448                            "#  define A 0\n"
3449                            "/* Code. Separated by blank line. */\n"
3450                            "\n"
3451                            "#  define B 0\n"
3452                            "   /* Code. Not aligned with # */\n"
3453                            "#  define C 0\n"
3454                            "#endif";
3455     EXPECT_EQ(Expected, format(ToFormat, Style));
3456     EXPECT_EQ(Expected, format(Expected, Style));
3457   }
3458   // Keep comments aligned with un-indented directives.
3459   {
3460     const char *Expected = ""
3461                            "void f() {\n"
3462                            "// Preprocessor aligned.\n"
3463                            "#define A 0\n"
3464                            "  // Code. Separated by blank line.\n"
3465                            "\n"
3466                            "#define B 0\n"
3467                            "  // Code. Not aligned with #\n"
3468                            "#define C 0\n";
3469     const char *ToFormat = ""
3470                            "void f() {\n"
3471                            "// Preprocessor aligned.\n"
3472                            "#define A 0\n"
3473                            "// Code. Separated by blank line.\n"
3474                            "\n"
3475                            "#define B 0\n"
3476                            "   // Code. Not aligned with #\n"
3477                            "#define C 0\n";
3478     EXPECT_EQ(Expected, format(ToFormat, Style));
3479     EXPECT_EQ(Expected, format(Expected, Style));
3480   }
3481   // Test AfterHash with tabs.
3482   {
3483     FormatStyle Tabbed = Style;
3484     Tabbed.UseTab = FormatStyle::UT_Always;
3485     Tabbed.IndentWidth = 8;
3486     Tabbed.TabWidth = 8;
3487     verifyFormat("#ifdef _WIN32\n"
3488                  "#\tdefine A 0\n"
3489                  "#\tifdef VAR2\n"
3490                  "#\t\tdefine B 1\n"
3491                  "#\t\tinclude <someheader.h>\n"
3492                  "#\t\tdefine MACRO          \\\n"
3493                  "\t\t\tsome_very_long_func_aaaaaaaaaa();\n"
3494                  "#\tendif\n"
3495                  "#else\n"
3496                  "#\tdefine A 1\n"
3497                  "#endif",
3498                  Tabbed);
3499   }
3500 
3501   // Regression test: Multiline-macro inside include guards.
3502   verifyFormat("#ifndef HEADER_H\n"
3503                "#define HEADER_H\n"
3504                "#define A()        \\\n"
3505                "  int i;           \\\n"
3506                "  int j;\n"
3507                "#endif // HEADER_H",
3508                getLLVMStyleWithColumns(20));
3509 
3510   Style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash;
3511   // Basic before hash indent tests
3512   verifyFormat("#ifdef _WIN32\n"
3513                "  #define A 0\n"
3514                "  #ifdef VAR2\n"
3515                "    #define B 1\n"
3516                "    #include <someheader.h>\n"
3517                "    #define MACRO                      \\\n"
3518                "      some_very_long_func_aaaaaaaaaa();\n"
3519                "  #endif\n"
3520                "#else\n"
3521                "  #define A 1\n"
3522                "#endif",
3523                Style);
3524   verifyFormat("#if A\n"
3525                "  #define MACRO                        \\\n"
3526                "    void a(int x) {                    \\\n"
3527                "      b();                             \\\n"
3528                "      c();                             \\\n"
3529                "      d();                             \\\n"
3530                "      e();                             \\\n"
3531                "      f();                             \\\n"
3532                "    }\n"
3533                "#endif",
3534                Style);
3535   // Keep comments aligned with indented directives. These
3536   // tests cannot use verifyFormat because messUp manipulates leading
3537   // whitespace.
3538   {
3539     const char *Expected = "void f() {\n"
3540                            "// Aligned to preprocessor.\n"
3541                            "#if 1\n"
3542                            "  // Aligned to code.\n"
3543                            "  int a;\n"
3544                            "  #if 1\n"
3545                            "    // Aligned to preprocessor.\n"
3546                            "    #define A 0\n"
3547                            "  // Aligned to code.\n"
3548                            "  int b;\n"
3549                            "  #endif\n"
3550                            "#endif\n"
3551                            "}";
3552     const char *ToFormat = "void f() {\n"
3553                            "// Aligned to preprocessor.\n"
3554                            "#if 1\n"
3555                            "// Aligned to code.\n"
3556                            "int a;\n"
3557                            "#if 1\n"
3558                            "// Aligned to preprocessor.\n"
3559                            "#define A 0\n"
3560                            "// Aligned to code.\n"
3561                            "int b;\n"
3562                            "#endif\n"
3563                            "#endif\n"
3564                            "}";
3565     EXPECT_EQ(Expected, format(ToFormat, Style));
3566     EXPECT_EQ(Expected, format(Expected, Style));
3567   }
3568   {
3569     const char *Expected = "void f() {\n"
3570                            "/* Aligned to preprocessor. */\n"
3571                            "#if 1\n"
3572                            "  /* Aligned to code. */\n"
3573                            "  int a;\n"
3574                            "  #if 1\n"
3575                            "    /* Aligned to preprocessor. */\n"
3576                            "    #define A 0\n"
3577                            "  /* Aligned to code. */\n"
3578                            "  int b;\n"
3579                            "  #endif\n"
3580                            "#endif\n"
3581                            "}";
3582     const char *ToFormat = "void f() {\n"
3583                            "/* Aligned to preprocessor. */\n"
3584                            "#if 1\n"
3585                            "/* Aligned to code. */\n"
3586                            "int a;\n"
3587                            "#if 1\n"
3588                            "/* Aligned to preprocessor. */\n"
3589                            "#define A 0\n"
3590                            "/* Aligned to code. */\n"
3591                            "int b;\n"
3592                            "#endif\n"
3593                            "#endif\n"
3594                            "}";
3595     EXPECT_EQ(Expected, format(ToFormat, Style));
3596     EXPECT_EQ(Expected, format(Expected, Style));
3597   }
3598 
3599   // Test single comment before preprocessor
3600   verifyFormat("// Comment\n"
3601                "\n"
3602                "#if 1\n"
3603                "#endif",
3604                Style);
3605 }
3606 
3607 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
3608   verifyFormat("{\n  { a #c; }\n}");
3609 }
3610 
3611 TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
3612   EXPECT_EQ("#define A \\\n  {       \\\n    {\nint i;",
3613             format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
3614   EXPECT_EQ("#define A \\\n  }       \\\n  }\nint i;",
3615             format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
3616 }
3617 
3618 TEST_F(FormatTest, EscapedNewlines) {
3619   FormatStyle Narrow = getLLVMStyleWithColumns(11);
3620   EXPECT_EQ("#define A \\\n  int i;  \\\n  int j;",
3621             format("#define A \\\nint i;\\\n  int j;", Narrow));
3622   EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
3623   EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
3624   EXPECT_EQ("/* \\  \\  \\\n */", format("\\\n/* \\  \\  \\\n */"));
3625   EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
3626 
3627   FormatStyle AlignLeft = getLLVMStyle();
3628   AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
3629   EXPECT_EQ("#define MACRO(x) \\\n"
3630             "private:         \\\n"
3631             "  int x(int a);\n",
3632             format("#define MACRO(x) \\\n"
3633                    "private:         \\\n"
3634                    "  int x(int a);\n",
3635                    AlignLeft));
3636 
3637   // CRLF line endings
3638   EXPECT_EQ("#define A \\\r\n  int i;  \\\r\n  int j;",
3639             format("#define A \\\r\nint i;\\\r\n  int j;", Narrow));
3640   EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;"));
3641   EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
3642   EXPECT_EQ("/* \\  \\  \\\r\n */", format("\\\r\n/* \\  \\  \\\r\n */"));
3643   EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>"));
3644   EXPECT_EQ("#define MACRO(x) \\\r\n"
3645             "private:         \\\r\n"
3646             "  int x(int a);\r\n",
3647             format("#define MACRO(x) \\\r\n"
3648                    "private:         \\\r\n"
3649                    "  int x(int a);\r\n",
3650                    AlignLeft));
3651 
3652   FormatStyle DontAlign = getLLVMStyle();
3653   DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
3654   DontAlign.MaxEmptyLinesToKeep = 3;
3655   // FIXME: can't use verifyFormat here because the newline before
3656   // "public:" is not inserted the first time it's reformatted
3657   EXPECT_EQ("#define A \\\n"
3658             "  class Foo { \\\n"
3659             "    void bar(); \\\n"
3660             "\\\n"
3661             "\\\n"
3662             "\\\n"
3663             "  public: \\\n"
3664             "    void baz(); \\\n"
3665             "  };",
3666             format("#define A \\\n"
3667                    "  class Foo { \\\n"
3668                    "    void bar(); \\\n"
3669                    "\\\n"
3670                    "\\\n"
3671                    "\\\n"
3672                    "  public: \\\n"
3673                    "    void baz(); \\\n"
3674                    "  };",
3675                    DontAlign));
3676 }
3677 
3678 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
3679   verifyFormat("#define A \\\n"
3680                "  int v(  \\\n"
3681                "      a); \\\n"
3682                "  int i;",
3683                getLLVMStyleWithColumns(11));
3684 }
3685 
3686 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
3687   EXPECT_EQ(
3688       "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3689       "                      \\\n"
3690       "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3691       "\n"
3692       "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3693       "    aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
3694       format("  #define   ALooooooooooooooooooooooooooooooooooooooongMacro("
3695              "\\\n"
3696              "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3697              "  \n"
3698              "   AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3699              "  aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
3700 }
3701 
3702 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
3703   EXPECT_EQ("int\n"
3704             "#define A\n"
3705             "    a;",
3706             format("int\n#define A\na;"));
3707   verifyFormat("functionCallTo(\n"
3708                "    someOtherFunction(\n"
3709                "        withSomeParameters, whichInSequence,\n"
3710                "        areLongerThanALine(andAnotherCall,\n"
3711                "#define A B\n"
3712                "                           withMoreParamters,\n"
3713                "                           whichStronglyInfluenceTheLayout),\n"
3714                "        andMoreParameters),\n"
3715                "    trailing);",
3716                getLLVMStyleWithColumns(69));
3717   verifyFormat("Foo::Foo()\n"
3718                "#ifdef BAR\n"
3719                "    : baz(0)\n"
3720                "#endif\n"
3721                "{\n"
3722                "}");
3723   verifyFormat("void f() {\n"
3724                "  if (true)\n"
3725                "#ifdef A\n"
3726                "    f(42);\n"
3727                "  x();\n"
3728                "#else\n"
3729                "    g();\n"
3730                "  x();\n"
3731                "#endif\n"
3732                "}");
3733   verifyFormat("void f(param1, param2,\n"
3734                "       param3,\n"
3735                "#ifdef A\n"
3736                "       param4(param5,\n"
3737                "#ifdef A1\n"
3738                "              param6,\n"
3739                "#ifdef A2\n"
3740                "              param7),\n"
3741                "#else\n"
3742                "              param8),\n"
3743                "       param9,\n"
3744                "#endif\n"
3745                "       param10,\n"
3746                "#endif\n"
3747                "       param11)\n"
3748                "#else\n"
3749                "       param12)\n"
3750                "#endif\n"
3751                "{\n"
3752                "  x();\n"
3753                "}",
3754                getLLVMStyleWithColumns(28));
3755   verifyFormat("#if 1\n"
3756                "int i;");
3757   verifyFormat("#if 1\n"
3758                "#endif\n"
3759                "#if 1\n"
3760                "#else\n"
3761                "#endif\n");
3762   verifyFormat("DEBUG({\n"
3763                "  return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3764                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
3765                "});\n"
3766                "#if a\n"
3767                "#else\n"
3768                "#endif");
3769 
3770   verifyIncompleteFormat("void f(\n"
3771                          "#if A\n"
3772                          ");\n"
3773                          "#else\n"
3774                          "#endif");
3775 }
3776 
3777 TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
3778   verifyFormat("#endif\n"
3779                "#if B");
3780 }
3781 
3782 TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
3783   FormatStyle SingleLine = getLLVMStyle();
3784   SingleLine.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse;
3785   verifyFormat("#if 0\n"
3786                "#elif 1\n"
3787                "#endif\n"
3788                "void foo() {\n"
3789                "  if (test) foo2();\n"
3790                "}",
3791                SingleLine);
3792 }
3793 
3794 TEST_F(FormatTest, LayoutBlockInsideParens) {
3795   verifyFormat("functionCall({ int i; });");
3796   verifyFormat("functionCall({\n"
3797                "  int i;\n"
3798                "  int j;\n"
3799                "});");
3800   verifyFormat("functionCall(\n"
3801                "    {\n"
3802                "      int i;\n"
3803                "      int j;\n"
3804                "    },\n"
3805                "    aaaa, bbbb, cccc);");
3806   verifyFormat("functionA(functionB({\n"
3807                "            int i;\n"
3808                "            int j;\n"
3809                "          }),\n"
3810                "          aaaa, bbbb, cccc);");
3811   verifyFormat("functionCall(\n"
3812                "    {\n"
3813                "      int i;\n"
3814                "      int j;\n"
3815                "    },\n"
3816                "    aaaa, bbbb, // comment\n"
3817                "    cccc);");
3818   verifyFormat("functionA(functionB({\n"
3819                "            int i;\n"
3820                "            int j;\n"
3821                "          }),\n"
3822                "          aaaa, bbbb, // comment\n"
3823                "          cccc);");
3824   verifyFormat("functionCall(aaaa, bbbb, { int i; });");
3825   verifyFormat("functionCall(aaaa, bbbb, {\n"
3826                "  int i;\n"
3827                "  int j;\n"
3828                "});");
3829   verifyFormat(
3830       "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
3831       "    {\n"
3832       "      int i; // break\n"
3833       "    },\n"
3834       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
3835       "                                     ccccccccccccccccc));");
3836   verifyFormat("DEBUG({\n"
3837                "  if (a)\n"
3838                "    f();\n"
3839                "});");
3840 }
3841 
3842 TEST_F(FormatTest, LayoutBlockInsideStatement) {
3843   EXPECT_EQ("SOME_MACRO { int i; }\n"
3844             "int i;",
3845             format("  SOME_MACRO  {int i;}  int i;"));
3846 }
3847 
3848 TEST_F(FormatTest, LayoutNestedBlocks) {
3849   verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
3850                "  struct s {\n"
3851                "    int i;\n"
3852                "  };\n"
3853                "  s kBitsToOs[] = {{10}};\n"
3854                "  for (int i = 0; i < 10; ++i)\n"
3855                "    return;\n"
3856                "}");
3857   verifyFormat("call(parameter, {\n"
3858                "  something();\n"
3859                "  // Comment using all columns.\n"
3860                "  somethingelse();\n"
3861                "});",
3862                getLLVMStyleWithColumns(40));
3863   verifyFormat("DEBUG( //\n"
3864                "    { f(); }, a);");
3865   verifyFormat("DEBUG( //\n"
3866                "    {\n"
3867                "      f(); //\n"
3868                "    },\n"
3869                "    a);");
3870 
3871   EXPECT_EQ("call(parameter, {\n"
3872             "  something();\n"
3873             "  // Comment too\n"
3874             "  // looooooooooong.\n"
3875             "  somethingElse();\n"
3876             "});",
3877             format("call(parameter, {\n"
3878                    "  something();\n"
3879                    "  // Comment too looooooooooong.\n"
3880                    "  somethingElse();\n"
3881                    "});",
3882                    getLLVMStyleWithColumns(29)));
3883   EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int   i; });"));
3884   EXPECT_EQ("DEBUG({ // comment\n"
3885             "  int i;\n"
3886             "});",
3887             format("DEBUG({ // comment\n"
3888                    "int  i;\n"
3889                    "});"));
3890   EXPECT_EQ("DEBUG({\n"
3891             "  int i;\n"
3892             "\n"
3893             "  // comment\n"
3894             "  int j;\n"
3895             "});",
3896             format("DEBUG({\n"
3897                    "  int  i;\n"
3898                    "\n"
3899                    "  // comment\n"
3900                    "  int  j;\n"
3901                    "});"));
3902 
3903   verifyFormat("DEBUG({\n"
3904                "  if (a)\n"
3905                "    return;\n"
3906                "});");
3907   verifyGoogleFormat("DEBUG({\n"
3908                      "  if (a) return;\n"
3909                      "});");
3910   FormatStyle Style = getGoogleStyle();
3911   Style.ColumnLimit = 45;
3912   verifyFormat("Debug(\n"
3913                "    aaaaa,\n"
3914                "    {\n"
3915                "      if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3916                "    },\n"
3917                "    a);",
3918                Style);
3919 
3920   verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3921 
3922   verifyNoCrash("^{v^{a}}");
3923 }
3924 
3925 TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3926   EXPECT_EQ("#define MACRO()                     \\\n"
3927             "  Debug(aaa, /* force line break */ \\\n"
3928             "        {                           \\\n"
3929             "          int i;                    \\\n"
3930             "          int j;                    \\\n"
3931             "        })",
3932             format("#define   MACRO()   Debug(aaa,  /* force line break */ \\\n"
3933                    "          {  int   i;  int  j;   })",
3934                    getGoogleStyle()));
3935 
3936   EXPECT_EQ("#define A                                       \\\n"
3937             "  [] {                                          \\\n"
3938             "    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(        \\\n"
3939             "        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3940             "  }",
3941             format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3942                    "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3943                    getGoogleStyle()));
3944 }
3945 
3946 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3947   EXPECT_EQ("{}", format("{}"));
3948   verifyFormat("enum E {};");
3949   verifyFormat("enum E {}");
3950   FormatStyle Style = getLLVMStyle();
3951   Style.SpaceInEmptyBlock = true;
3952   EXPECT_EQ("void f() { }", format("void f() {}", Style));
3953   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty;
3954   EXPECT_EQ("while (true) { }", format("while (true) {}", Style));
3955 }
3956 
3957 TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3958   FormatStyle Style = getLLVMStyle();
3959   Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3960   Style.MacroBlockEnd = "^[A-Z_]+_END$";
3961   verifyFormat("FOO_BEGIN\n"
3962                "  FOO_ENTRY\n"
3963                "FOO_END",
3964                Style);
3965   verifyFormat("FOO_BEGIN\n"
3966                "  NESTED_FOO_BEGIN\n"
3967                "    NESTED_FOO_ENTRY\n"
3968                "  NESTED_FOO_END\n"
3969                "FOO_END",
3970                Style);
3971   verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3972                "  int x;\n"
3973                "  x = 1;\n"
3974                "FOO_END(Baz)",
3975                Style);
3976 }
3977 
3978 //===----------------------------------------------------------------------===//
3979 // Line break tests.
3980 //===----------------------------------------------------------------------===//
3981 
3982 TEST_F(FormatTest, PreventConfusingIndents) {
3983   verifyFormat(
3984       "void f() {\n"
3985       "  SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3986       "                         parameter, parameter, parameter)),\n"
3987       "                     SecondLongCall(parameter));\n"
3988       "}");
3989   verifyFormat(
3990       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3991       "    aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3992       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3993       "    aaaaaaaaaaaaaaaaaaaaaaaa);");
3994   verifyFormat(
3995       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3996       "    [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3997       "         [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3998       "         [aaaaaaaaaaaaaaaaaaaaaaaa]];");
3999   verifyFormat(
4000       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
4001       "    aaaaaaaaaaaaaaaaaaaaaaaa<\n"
4002       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
4003       "    aaaaaaaaaaaaaaaaaaaaaaaa>;");
4004   verifyFormat("int a = bbbb && ccc &&\n"
4005                "        fffff(\n"
4006                "#define A Just forcing a new line\n"
4007                "            ddd);");
4008 }
4009 
4010 TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
4011   verifyFormat(
4012       "bool aaaaaaa =\n"
4013       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
4014       "    bbbbbbbb();");
4015   verifyFormat(
4016       "bool aaaaaaa =\n"
4017       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
4018       "    bbbbbbbb();");
4019 
4020   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
4021                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
4022                "    ccccccccc == ddddddddddd;");
4023   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
4024                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
4025                "    ccccccccc == ddddddddddd;");
4026   verifyFormat(
4027       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
4028       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
4029       "    ccccccccc == ddddddddddd;");
4030 
4031   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
4032                "                 aaaaaa) &&\n"
4033                "         bbbbbb && cccccc;");
4034   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
4035                "                 aaaaaa) >>\n"
4036                "         bbbbbb;");
4037   verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
4038                "    SourceMgr.getSpellingColumnNumber(\n"
4039                "        TheLine.Last->FormatTok.Tok.getLocation()) -\n"
4040                "    1);");
4041 
4042   verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4043                "     bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
4044                "    cccccc) {\n}");
4045   verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4046                "               bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
4047                "              cccccc) {\n}");
4048   verifyFormat("if CONSTEXPR ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4049                "               bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
4050                "              cccccc) {\n}");
4051   verifyFormat("b = a &&\n"
4052                "    // Comment\n"
4053                "    b.c && d;");
4054 
4055   // If the LHS of a comparison is not a binary expression itself, the
4056   // additional linebreak confuses many people.
4057   verifyFormat(
4058       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4059       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
4060       "}");
4061   verifyFormat(
4062       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4063       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
4064       "}");
4065   verifyFormat(
4066       "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
4067       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
4068       "}");
4069   verifyFormat(
4070       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4071       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n"
4072       "}");
4073   // Even explicit parentheses stress the precedence enough to make the
4074   // additional break unnecessary.
4075   verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4076                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
4077                "}");
4078   // This cases is borderline, but with the indentation it is still readable.
4079   verifyFormat(
4080       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4081       "        aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4082       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
4083       "}",
4084       getLLVMStyleWithColumns(75));
4085 
4086   // If the LHS is a binary expression, we should still use the additional break
4087   // as otherwise the formatting hides the operator precedence.
4088   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4089                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4090                "    5) {\n"
4091                "}");
4092   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4093                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n"
4094                "    5) {\n"
4095                "}");
4096 
4097   FormatStyle OnePerLine = getLLVMStyle();
4098   OnePerLine.BinPackParameters = false;
4099   verifyFormat(
4100       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4101       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4102       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
4103       OnePerLine);
4104 
4105   verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
4106                "                .aaa(aaaaaaaaaaaaa) *\n"
4107                "            aaaaaaa +\n"
4108                "        aaaaaaa;",
4109                getLLVMStyleWithColumns(40));
4110 }
4111 
4112 TEST_F(FormatTest, ExpressionIndentation) {
4113   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4114                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4115                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4116                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4117                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4118                "                     bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
4119                "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4120                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
4121                "                 ccccccccccccccccccccccccccccccccccccccccc;");
4122   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4123                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4124                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4125                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4126   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4127                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4128                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4129                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4130   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4131                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4132                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4133                "        bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4134   verifyFormat("if () {\n"
4135                "} else if (aaaaa && bbbbb > // break\n"
4136                "                        ccccc) {\n"
4137                "}");
4138   verifyFormat("if () {\n"
4139                "} else if constexpr (aaaaa && bbbbb > // break\n"
4140                "                                  ccccc) {\n"
4141                "}");
4142   verifyFormat("if () {\n"
4143                "} else if CONSTEXPR (aaaaa && bbbbb > // break\n"
4144                "                                  ccccc) {\n"
4145                "}");
4146   verifyFormat("if () {\n"
4147                "} else if (aaaaa &&\n"
4148                "           bbbbb > // break\n"
4149                "               ccccc &&\n"
4150                "           ddddd) {\n"
4151                "}");
4152 
4153   // Presence of a trailing comment used to change indentation of b.
4154   verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
4155                "       b;\n"
4156                "return aaaaaaaaaaaaaaaaaaa +\n"
4157                "       b; //",
4158                getLLVMStyleWithColumns(30));
4159 }
4160 
4161 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
4162   // Not sure what the best system is here. Like this, the LHS can be found
4163   // immediately above an operator (everything with the same or a higher
4164   // indent). The RHS is aligned right of the operator and so compasses
4165   // everything until something with the same indent as the operator is found.
4166   // FIXME: Is this a good system?
4167   FormatStyle Style = getLLVMStyle();
4168   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4169   verifyFormat(
4170       "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4171       "                     + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4172       "                     + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4173       "                 == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4174       "                            * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4175       "                        + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4176       "             && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4177       "                        * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4178       "                    > ccccccccccccccccccccccccccccccccccccccccc;",
4179       Style);
4180   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4181                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4182                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4183                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4184                Style);
4185   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4186                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4187                "              * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4188                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4189                Style);
4190   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4191                "    == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4192                "               * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4193                "           + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4194                Style);
4195   verifyFormat("if () {\n"
4196                "} else if (aaaaa\n"
4197                "           && bbbbb // break\n"
4198                "                  > ccccc) {\n"
4199                "}",
4200                Style);
4201   verifyFormat("return (a)\n"
4202                "       // comment\n"
4203                "       + b;",
4204                Style);
4205   verifyFormat(
4206       "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4207       "                 * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4208       "             + cc;",
4209       Style);
4210 
4211   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4212                "    = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4213                Style);
4214 
4215   // Forced by comments.
4216   verifyFormat(
4217       "unsigned ContentSize =\n"
4218       "    sizeof(int16_t)   // DWARF ARange version number\n"
4219       "    + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
4220       "    + sizeof(int8_t)  // Pointer Size (in bytes)\n"
4221       "    + sizeof(int8_t); // Segment Size (in bytes)");
4222 
4223   verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
4224                "       == boost::fusion::at_c<1>(iiii).second;",
4225                Style);
4226 
4227   Style.ColumnLimit = 60;
4228   verifyFormat("zzzzzzzzzz\n"
4229                "    = bbbbbbbbbbbbbbbbb\n"
4230                "      >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
4231                Style);
4232 
4233   Style.ColumnLimit = 80;
4234   Style.IndentWidth = 4;
4235   Style.TabWidth = 4;
4236   Style.UseTab = FormatStyle::UT_Always;
4237   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4238   Style.AlignOperands = false;
4239   EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n"
4240             "\t&& (someOtherLongishConditionPart1\n"
4241             "\t\t|| someOtherEvenLongerNestedConditionPart2);",
4242             format("return someVeryVeryLongConditionThatBarelyFitsOnALine && "
4243                    "(someOtherLongishConditionPart1 || "
4244                    "someOtherEvenLongerNestedConditionPart2);",
4245                    Style));
4246 }
4247 
4248 TEST_F(FormatTest, EnforcedOperatorWraps) {
4249   // Here we'd like to wrap after the || operators, but a comment is forcing an
4250   // earlier wrap.
4251   verifyFormat("bool x = aaaaa //\n"
4252                "         || bbbbb\n"
4253                "         //\n"
4254                "         || cccc;");
4255 }
4256 
4257 TEST_F(FormatTest, NoOperandAlignment) {
4258   FormatStyle Style = getLLVMStyle();
4259   Style.AlignOperands = false;
4260   verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
4261                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4262                "                   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4263                Style);
4264   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4265   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4266                "            + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4267                "            + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4268                "        == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4269                "                * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4270                "            + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4271                "    && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4272                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4273                "        > ccccccccccccccccccccccccccccccccccccccccc;",
4274                Style);
4275 
4276   verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4277                "        * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4278                "    + cc;",
4279                Style);
4280   verifyFormat("int a = aa\n"
4281                "    + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4282                "        * cccccccccccccccccccccccccccccccccccc;\n",
4283                Style);
4284 
4285   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4286   verifyFormat("return (a > b\n"
4287                "    // comment1\n"
4288                "    // comment2\n"
4289                "    || c);",
4290                Style);
4291 }
4292 
4293 TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
4294   FormatStyle Style = getLLVMStyle();
4295   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4296   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4297                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4298                "    + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
4299                Style);
4300 }
4301 
4302 TEST_F(FormatTest, AllowBinPackingInsideArguments) {
4303   FormatStyle Style = getLLVMStyle();
4304   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4305   Style.BinPackArguments = false;
4306   Style.ColumnLimit = 40;
4307   verifyFormat("void test() {\n"
4308                "  someFunction(\n"
4309                "      this + argument + is + quite\n"
4310                "      + long + so + it + gets + wrapped\n"
4311                "      + but + remains + bin - packed);\n"
4312                "}",
4313                Style);
4314   verifyFormat("void test() {\n"
4315                "  someFunction(arg1,\n"
4316                "               this + argument + is\n"
4317                "                   + quite + long + so\n"
4318                "                   + it + gets + wrapped\n"
4319                "                   + but + remains + bin\n"
4320                "                   - packed,\n"
4321                "               arg3);\n"
4322                "}",
4323                Style);
4324   verifyFormat("void test() {\n"
4325                "  someFunction(\n"
4326                "      arg1,\n"
4327                "      this + argument + has\n"
4328                "          + anotherFunc(nested,\n"
4329                "                        calls + whose\n"
4330                "                            + arguments\n"
4331                "                            + are + also\n"
4332                "                            + wrapped,\n"
4333                "                        in + addition)\n"
4334                "          + to + being + bin - packed,\n"
4335                "      arg3);\n"
4336                "}",
4337                Style);
4338 
4339   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4340   verifyFormat("void test() {\n"
4341                "  someFunction(\n"
4342                "      arg1,\n"
4343                "      this + argument + has +\n"
4344                "          anotherFunc(nested,\n"
4345                "                      calls + whose +\n"
4346                "                          arguments +\n"
4347                "                          are + also +\n"
4348                "                          wrapped,\n"
4349                "                      in + addition) +\n"
4350                "          to + being + bin - packed,\n"
4351                "      arg3);\n"
4352                "}",
4353                Style);
4354 }
4355 
4356 TEST_F(FormatTest, ConstructorInitializers) {
4357   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
4358   verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
4359                getLLVMStyleWithColumns(45));
4360   verifyFormat("Constructor()\n"
4361                "    : Inttializer(FitsOnTheLine) {}",
4362                getLLVMStyleWithColumns(44));
4363   verifyFormat("Constructor()\n"
4364                "    : Inttializer(FitsOnTheLine) {}",
4365                getLLVMStyleWithColumns(43));
4366 
4367   verifyFormat("template <typename T>\n"
4368                "Constructor() : Initializer(FitsOnTheLine) {}",
4369                getLLVMStyleWithColumns(45));
4370 
4371   verifyFormat(
4372       "SomeClass::Constructor()\n"
4373       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
4374 
4375   verifyFormat(
4376       "SomeClass::Constructor()\n"
4377       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4378       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
4379   verifyFormat(
4380       "SomeClass::Constructor()\n"
4381       "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4382       "      aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
4383   verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4384                "            aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4385                "    : aaaaaaaaaa(aaaaaa) {}");
4386 
4387   verifyFormat("Constructor()\n"
4388                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4389                "      aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4390                "                               aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4391                "      aaaaaaaaaaaaaaaaaaaaaaa() {}");
4392 
4393   verifyFormat("Constructor()\n"
4394                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4395                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
4396 
4397   verifyFormat("Constructor(int Parameter = 0)\n"
4398                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
4399                "      aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
4400   verifyFormat("Constructor()\n"
4401                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
4402                "}",
4403                getLLVMStyleWithColumns(60));
4404   verifyFormat("Constructor()\n"
4405                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4406                "          aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
4407 
4408   // Here a line could be saved by splitting the second initializer onto two
4409   // lines, but that is not desirable.
4410   verifyFormat("Constructor()\n"
4411                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
4412                "      aaaaaaaaaaa(aaaaaaaaaaa),\n"
4413                "      aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
4414 
4415   FormatStyle OnePerLine = getLLVMStyle();
4416   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4417   OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
4418   verifyFormat("SomeClass::Constructor()\n"
4419                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4420                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4421                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4422                OnePerLine);
4423   verifyFormat("SomeClass::Constructor()\n"
4424                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
4425                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4426                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4427                OnePerLine);
4428   verifyFormat("MyClass::MyClass(int var)\n"
4429                "    : some_var_(var),            // 4 space indent\n"
4430                "      some_other_var_(var + 1) { // lined up\n"
4431                "}",
4432                OnePerLine);
4433   verifyFormat("Constructor()\n"
4434                "    : aaaaa(aaaaaa),\n"
4435                "      aaaaa(aaaaaa),\n"
4436                "      aaaaa(aaaaaa),\n"
4437                "      aaaaa(aaaaaa),\n"
4438                "      aaaaa(aaaaaa) {}",
4439                OnePerLine);
4440   verifyFormat("Constructor()\n"
4441                "    : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4442                "            aaaaaaaaaaaaaaaaaaaaaa) {}",
4443                OnePerLine);
4444   OnePerLine.BinPackParameters = false;
4445   verifyFormat(
4446       "Constructor()\n"
4447       "    : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4448       "          aaaaaaaaaaa().aaa(),\n"
4449       "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4450       OnePerLine);
4451   OnePerLine.ColumnLimit = 60;
4452   verifyFormat("Constructor()\n"
4453                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4454                "      bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
4455                OnePerLine);
4456 
4457   EXPECT_EQ("Constructor()\n"
4458             "    : // Comment forcing unwanted break.\n"
4459             "      aaaa(aaaa) {}",
4460             format("Constructor() :\n"
4461                    "    // Comment forcing unwanted break.\n"
4462                    "    aaaa(aaaa) {}"));
4463 }
4464 
4465 TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) {
4466   FormatStyle Style = getLLVMStyle();
4467   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4468   Style.ColumnLimit = 60;
4469   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4470   Style.AllowAllConstructorInitializersOnNextLine = true;
4471   Style.BinPackParameters = false;
4472 
4473   for (int i = 0; i < 4; ++i) {
4474     // Test all combinations of parameters that should not have an effect.
4475     Style.AllowAllParametersOfDeclarationOnNextLine = i & 1;
4476     Style.AllowAllArgumentsOnNextLine = i & 2;
4477 
4478     Style.AllowAllConstructorInitializersOnNextLine = true;
4479     Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4480     verifyFormat("Constructor()\n"
4481                  "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4482                  Style);
4483     verifyFormat("Constructor() : a(a), b(b) {}", Style);
4484 
4485     Style.AllowAllConstructorInitializersOnNextLine = false;
4486     verifyFormat("Constructor()\n"
4487                  "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4488                  "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4489                  Style);
4490     verifyFormat("Constructor() : a(a), b(b) {}", Style);
4491 
4492     Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
4493     Style.AllowAllConstructorInitializersOnNextLine = true;
4494     verifyFormat("Constructor()\n"
4495                  "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4496                  Style);
4497 
4498     Style.AllowAllConstructorInitializersOnNextLine = false;
4499     verifyFormat("Constructor()\n"
4500                  "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4501                  "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4502                  Style);
4503 
4504     Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4505     Style.AllowAllConstructorInitializersOnNextLine = true;
4506     verifyFormat("Constructor() :\n"
4507                  "    aaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4508                  Style);
4509 
4510     Style.AllowAllConstructorInitializersOnNextLine = false;
4511     verifyFormat("Constructor() :\n"
4512                  "    aaaaaaaaaaaaaaaaaa(a),\n"
4513                  "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4514                  Style);
4515   }
4516 
4517   // Test interactions between AllowAllParametersOfDeclarationOnNextLine and
4518   // AllowAllConstructorInitializersOnNextLine in all
4519   // BreakConstructorInitializers modes
4520   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4521   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4522   Style.AllowAllConstructorInitializersOnNextLine = false;
4523   verifyFormat("SomeClassWithALongName::Constructor(\n"
4524                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n"
4525                "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4526                "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4527                Style);
4528 
4529   Style.AllowAllConstructorInitializersOnNextLine = true;
4530   verifyFormat("SomeClassWithALongName::Constructor(\n"
4531                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4532                "    int bbbbbbbbbbbbb,\n"
4533                "    int cccccccccccccccc)\n"
4534                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4535                Style);
4536 
4537   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4538   Style.AllowAllConstructorInitializersOnNextLine = false;
4539   verifyFormat("SomeClassWithALongName::Constructor(\n"
4540                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4541                "    int bbbbbbbbbbbbb)\n"
4542                "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4543                "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4544                Style);
4545 
4546   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
4547 
4548   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4549   verifyFormat("SomeClassWithALongName::Constructor(\n"
4550                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n"
4551                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4552                "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4553                Style);
4554 
4555   Style.AllowAllConstructorInitializersOnNextLine = true;
4556   verifyFormat("SomeClassWithALongName::Constructor(\n"
4557                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4558                "    int bbbbbbbbbbbbb,\n"
4559                "    int cccccccccccccccc)\n"
4560                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4561                Style);
4562 
4563   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4564   Style.AllowAllConstructorInitializersOnNextLine = false;
4565   verifyFormat("SomeClassWithALongName::Constructor(\n"
4566                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4567                "    int bbbbbbbbbbbbb)\n"
4568                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4569                "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4570                Style);
4571 
4572   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4573   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4574   verifyFormat("SomeClassWithALongName::Constructor(\n"
4575                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb) :\n"
4576                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4577                "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4578                Style);
4579 
4580   Style.AllowAllConstructorInitializersOnNextLine = true;
4581   verifyFormat("SomeClassWithALongName::Constructor(\n"
4582                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4583                "    int bbbbbbbbbbbbb,\n"
4584                "    int cccccccccccccccc) :\n"
4585                "    aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4586                Style);
4587 
4588   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4589   Style.AllowAllConstructorInitializersOnNextLine = false;
4590   verifyFormat("SomeClassWithALongName::Constructor(\n"
4591                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4592                "    int bbbbbbbbbbbbb) :\n"
4593                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4594                "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4595                Style);
4596 }
4597 
4598 TEST_F(FormatTest, AllowAllArgumentsOnNextLine) {
4599   FormatStyle Style = getLLVMStyle();
4600   Style.ColumnLimit = 60;
4601   Style.BinPackArguments = false;
4602   for (int i = 0; i < 4; ++i) {
4603     // Test all combinations of parameters that should not have an effect.
4604     Style.AllowAllParametersOfDeclarationOnNextLine = i & 1;
4605     Style.AllowAllConstructorInitializersOnNextLine = i & 2;
4606 
4607     Style.AllowAllArgumentsOnNextLine = true;
4608     verifyFormat("void foo() {\n"
4609                  "  FunctionCallWithReallyLongName(\n"
4610                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb);\n"
4611                  "}",
4612                  Style);
4613     Style.AllowAllArgumentsOnNextLine = false;
4614     verifyFormat("void foo() {\n"
4615                  "  FunctionCallWithReallyLongName(\n"
4616                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4617                  "      bbbbbbbbbbbb);\n"
4618                  "}",
4619                  Style);
4620 
4621     Style.AllowAllArgumentsOnNextLine = true;
4622     verifyFormat("void foo() {\n"
4623                  "  auto VariableWithReallyLongName = {\n"
4624                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb};\n"
4625                  "}",
4626                  Style);
4627     Style.AllowAllArgumentsOnNextLine = false;
4628     verifyFormat("void foo() {\n"
4629                  "  auto VariableWithReallyLongName = {\n"
4630                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4631                  "      bbbbbbbbbbbb};\n"
4632                  "}",
4633                  Style);
4634   }
4635 
4636   // This parameter should not affect declarations.
4637   Style.BinPackParameters = false;
4638   Style.AllowAllArgumentsOnNextLine = false;
4639   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4640   verifyFormat("void FunctionCallWithReallyLongName(\n"
4641                "    int aaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbb);",
4642                Style);
4643   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4644   verifyFormat("void FunctionCallWithReallyLongName(\n"
4645                "    int aaaaaaaaaaaaaaaaaaaaaaa,\n"
4646                "    int bbbbbbbbbbbb);",
4647                Style);
4648 }
4649 
4650 TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
4651   FormatStyle Style = getLLVMStyle();
4652   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4653 
4654   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
4655   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
4656                getStyleWithColumns(Style, 45));
4657   verifyFormat("Constructor() :\n"
4658                "    Initializer(FitsOnTheLine) {}",
4659                getStyleWithColumns(Style, 44));
4660   verifyFormat("Constructor() :\n"
4661                "    Initializer(FitsOnTheLine) {}",
4662                getStyleWithColumns(Style, 43));
4663 
4664   verifyFormat("template <typename T>\n"
4665                "Constructor() : Initializer(FitsOnTheLine) {}",
4666                getStyleWithColumns(Style, 50));
4667   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4668   verifyFormat(
4669       "SomeClass::Constructor() :\n"
4670       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
4671       Style);
4672 
4673   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = false;
4674   verifyFormat(
4675       "SomeClass::Constructor() :\n"
4676       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
4677       Style);
4678 
4679   verifyFormat(
4680       "SomeClass::Constructor() :\n"
4681       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4682       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4683       Style);
4684   verifyFormat(
4685       "SomeClass::Constructor() :\n"
4686       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4687       "    aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
4688       Style);
4689   verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4690                "            aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4691                "    aaaaaaaaaa(aaaaaa) {}",
4692                Style);
4693 
4694   verifyFormat("Constructor() :\n"
4695                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4696                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4697                "                             aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4698                "    aaaaaaaaaaaaaaaaaaaaaaa() {}",
4699                Style);
4700 
4701   verifyFormat("Constructor() :\n"
4702                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4703                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4704                Style);
4705 
4706   verifyFormat("Constructor(int Parameter = 0) :\n"
4707                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
4708                "    aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
4709                Style);
4710   verifyFormat("Constructor() :\n"
4711                "    aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
4712                "}",
4713                getStyleWithColumns(Style, 60));
4714   verifyFormat("Constructor() :\n"
4715                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4716                "        aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
4717                Style);
4718 
4719   // Here a line could be saved by splitting the second initializer onto two
4720   // lines, but that is not desirable.
4721   verifyFormat("Constructor() :\n"
4722                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
4723                "    aaaaaaaaaaa(aaaaaaaaaaa),\n"
4724                "    aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4725                Style);
4726 
4727   FormatStyle OnePerLine = Style;
4728   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4729   OnePerLine.AllowAllConstructorInitializersOnNextLine = false;
4730   verifyFormat("SomeClass::Constructor() :\n"
4731                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4732                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4733                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4734                OnePerLine);
4735   verifyFormat("SomeClass::Constructor() :\n"
4736                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
4737                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4738                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4739                OnePerLine);
4740   verifyFormat("MyClass::MyClass(int var) :\n"
4741                "    some_var_(var),            // 4 space indent\n"
4742                "    some_other_var_(var + 1) { // lined up\n"
4743                "}",
4744                OnePerLine);
4745   verifyFormat("Constructor() :\n"
4746                "    aaaaa(aaaaaa),\n"
4747                "    aaaaa(aaaaaa),\n"
4748                "    aaaaa(aaaaaa),\n"
4749                "    aaaaa(aaaaaa),\n"
4750                "    aaaaa(aaaaaa) {}",
4751                OnePerLine);
4752   verifyFormat("Constructor() :\n"
4753                "    aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4754                "          aaaaaaaaaaaaaaaaaaaaaa) {}",
4755                OnePerLine);
4756   OnePerLine.BinPackParameters = false;
4757   verifyFormat("Constructor() :\n"
4758                "    aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4759                "        aaaaaaaaaaa().aaa(),\n"
4760                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4761                OnePerLine);
4762   OnePerLine.ColumnLimit = 60;
4763   verifyFormat("Constructor() :\n"
4764                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4765                "    bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
4766                OnePerLine);
4767 
4768   EXPECT_EQ("Constructor() :\n"
4769             "    // Comment forcing unwanted break.\n"
4770             "    aaaa(aaaa) {}",
4771             format("Constructor() :\n"
4772                    "    // Comment forcing unwanted break.\n"
4773                    "    aaaa(aaaa) {}",
4774                    Style));
4775 
4776   Style.ColumnLimit = 0;
4777   verifyFormat("SomeClass::Constructor() :\n"
4778                "    a(a) {}",
4779                Style);
4780   verifyFormat("SomeClass::Constructor() noexcept :\n"
4781                "    a(a) {}",
4782                Style);
4783   verifyFormat("SomeClass::Constructor() :\n"
4784                "    a(a), b(b), c(c) {}",
4785                Style);
4786   verifyFormat("SomeClass::Constructor() :\n"
4787                "    a(a) {\n"
4788                "  foo();\n"
4789                "  bar();\n"
4790                "}",
4791                Style);
4792 
4793   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
4794   verifyFormat("SomeClass::Constructor() :\n"
4795                "    a(a), b(b), c(c) {\n"
4796                "}",
4797                Style);
4798   verifyFormat("SomeClass::Constructor() :\n"
4799                "    a(a) {\n"
4800                "}",
4801                Style);
4802 
4803   Style.ColumnLimit = 80;
4804   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
4805   Style.ConstructorInitializerIndentWidth = 2;
4806   verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}", Style);
4807   verifyFormat("SomeClass::Constructor() :\n"
4808                "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4809                "  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
4810                Style);
4811 
4812   // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as
4813   // well
4814   Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
4815   verifyFormat(
4816       "class SomeClass\n"
4817       "  : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4818       "    public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
4819       Style);
4820   Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
4821   verifyFormat(
4822       "class SomeClass\n"
4823       "  : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4824       "  , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
4825       Style);
4826   Style.BreakInheritanceList = FormatStyle::BILS_AfterColon;
4827   verifyFormat(
4828       "class SomeClass :\n"
4829       "  public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4830       "  public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
4831       Style);
4832 }
4833 
4834 #ifndef EXPENSIVE_CHECKS
4835 // Expensive checks enables libstdc++ checking which includes validating the
4836 // state of ranges used in std::priority_queue - this blows out the
4837 // runtime/scalability of the function and makes this test unacceptably slow.
4838 TEST_F(FormatTest, MemoizationTests) {
4839   // This breaks if the memoization lookup does not take \c Indent and
4840   // \c LastSpace into account.
4841   verifyFormat(
4842       "extern CFRunLoopTimerRef\n"
4843       "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
4844       "                     CFTimeInterval interval, CFOptionFlags flags,\n"
4845       "                     CFIndex order, CFRunLoopTimerCallBack callout,\n"
4846       "                     CFRunLoopTimerContext *context) {}");
4847 
4848   // Deep nesting somewhat works around our memoization.
4849   verifyFormat(
4850       "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4851       "    aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4852       "        aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4853       "            aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4854       "                aaaaa())))))))))))))))))))))))))))))))))))))));",
4855       getLLVMStyleWithColumns(65));
4856   verifyFormat(
4857       "aaaaa(\n"
4858       "    aaaaa,\n"
4859       "    aaaaa(\n"
4860       "        aaaaa,\n"
4861       "        aaaaa(\n"
4862       "            aaaaa,\n"
4863       "            aaaaa(\n"
4864       "                aaaaa,\n"
4865       "                aaaaa(\n"
4866       "                    aaaaa,\n"
4867       "                    aaaaa(\n"
4868       "                        aaaaa,\n"
4869       "                        aaaaa(\n"
4870       "                            aaaaa,\n"
4871       "                            aaaaa(\n"
4872       "                                aaaaa,\n"
4873       "                                aaaaa(\n"
4874       "                                    aaaaa,\n"
4875       "                                    aaaaa(\n"
4876       "                                        aaaaa,\n"
4877       "                                        aaaaa(\n"
4878       "                                            aaaaa,\n"
4879       "                                            aaaaa(\n"
4880       "                                                aaaaa,\n"
4881       "                                                aaaaa))))))))))));",
4882       getLLVMStyleWithColumns(65));
4883   verifyFormat(
4884       "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"
4885       "                                  a),\n"
4886       "                                a),\n"
4887       "                              a),\n"
4888       "                            a),\n"
4889       "                          a),\n"
4890       "                        a),\n"
4891       "                      a),\n"
4892       "                    a),\n"
4893       "                  a),\n"
4894       "                a),\n"
4895       "              a),\n"
4896       "            a),\n"
4897       "          a),\n"
4898       "        a),\n"
4899       "      a),\n"
4900       "    a),\n"
4901       "  a)",
4902       getLLVMStyleWithColumns(65));
4903 
4904   // This test takes VERY long when memoization is broken.
4905   FormatStyle OnePerLine = getLLVMStyle();
4906   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4907   OnePerLine.BinPackParameters = false;
4908   std::string input = "Constructor()\n"
4909                       "    : aaaa(a,\n";
4910   for (unsigned i = 0, e = 80; i != e; ++i) {
4911     input += "           a,\n";
4912   }
4913   input += "           a) {}";
4914   verifyFormat(input, OnePerLine);
4915 }
4916 #endif
4917 
4918 TEST_F(FormatTest, BreaksAsHighAsPossible) {
4919   verifyFormat(
4920       "void f() {\n"
4921       "  if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
4922       "      (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
4923       "    f();\n"
4924       "}");
4925   verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
4926                "    Intervals[i - 1].getRange().getLast()) {\n}");
4927 }
4928 
4929 TEST_F(FormatTest, BreaksFunctionDeclarations) {
4930   // Principially, we break function declarations in a certain order:
4931   // 1) break amongst arguments.
4932   verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
4933                "                              Cccccccccccccc cccccccccccccc);");
4934   verifyFormat("template <class TemplateIt>\n"
4935                "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
4936                "                            TemplateIt *stop) {}");
4937 
4938   // 2) break after return type.
4939   verifyFormat(
4940       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4941       "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
4942       getGoogleStyle());
4943 
4944   // 3) break after (.
4945   verifyFormat(
4946       "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
4947       "    Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
4948       getGoogleStyle());
4949 
4950   // 4) break before after nested name specifiers.
4951   verifyFormat(
4952       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4953       "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
4954       "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
4955       getGoogleStyle());
4956 
4957   // However, there are exceptions, if a sufficient amount of lines can be
4958   // saved.
4959   // FIXME: The precise cut-offs wrt. the number of saved lines might need some
4960   // more adjusting.
4961   verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4962                "                                  Cccccccccccccc cccccccccc,\n"
4963                "                                  Cccccccccccccc cccccccccc,\n"
4964                "                                  Cccccccccccccc cccccccccc,\n"
4965                "                                  Cccccccccccccc cccccccccc);");
4966   verifyFormat(
4967       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4968       "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4969       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4970       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
4971       getGoogleStyle());
4972   verifyFormat(
4973       "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4974       "                                          Cccccccccccccc cccccccccc,\n"
4975       "                                          Cccccccccccccc cccccccccc,\n"
4976       "                                          Cccccccccccccc cccccccccc,\n"
4977       "                                          Cccccccccccccc cccccccccc,\n"
4978       "                                          Cccccccccccccc cccccccccc,\n"
4979       "                                          Cccccccccccccc cccccccccc);");
4980   verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4981                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4982                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4983                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4984                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
4985 
4986   // Break after multi-line parameters.
4987   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4988                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4989                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4990                "    bbbb bbbb);");
4991   verifyFormat("void SomeLoooooooooooongFunction(\n"
4992                "    std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
4993                "        aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4994                "    int bbbbbbbbbbbbb);");
4995 
4996   // Treat overloaded operators like other functions.
4997   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4998                "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
4999   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
5000                "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
5001   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
5002                "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
5003   verifyGoogleFormat(
5004       "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
5005       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
5006   verifyGoogleFormat(
5007       "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
5008       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
5009   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5010                "    int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
5011   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
5012                "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
5013   verifyGoogleFormat(
5014       "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
5015       "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5016       "    bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
5017   verifyGoogleFormat("template <typename T>\n"
5018                      "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5019                      "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
5020                      "    aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
5021 
5022   FormatStyle Style = getLLVMStyle();
5023   Style.PointerAlignment = FormatStyle::PAS_Left;
5024   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5025                "    aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
5026                Style);
5027   verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
5028                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5029                Style);
5030 }
5031 
5032 TEST_F(FormatTest, DontBreakBeforeQualifiedOperator) {
5033   // Regression test for https://bugs.llvm.org/show_bug.cgi?id=40516:
5034   // Prefer keeping `::` followed by `operator` together.
5035   EXPECT_EQ("const aaaa::bbbbbbb &\n"
5036             "ccccccccc::operator++() {\n"
5037             "  stuff();\n"
5038             "}",
5039             format("const aaaa::bbbbbbb\n"
5040                    "&ccccccccc::operator++() { stuff(); }",
5041                    getLLVMStyleWithColumns(40)));
5042 }
5043 
5044 TEST_F(FormatTest, TrailingReturnType) {
5045   verifyFormat("auto foo() -> int;\n");
5046   // correct trailing return type spacing
5047   verifyFormat("auto operator->() -> int;\n");
5048   verifyFormat("auto operator++(int) -> int;\n");
5049 
5050   verifyFormat("struct S {\n"
5051                "  auto bar() const -> int;\n"
5052                "};");
5053   verifyFormat("template <size_t Order, typename T>\n"
5054                "auto load_img(const std::string &filename)\n"
5055                "    -> alias::tensor<Order, T, mem::tag::cpu> {}");
5056   verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
5057                "    -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
5058   verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
5059   verifyFormat("template <typename T>\n"
5060                "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
5061                "    -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
5062 
5063   // Not trailing return types.
5064   verifyFormat("void f() { auto a = b->c(); }");
5065 }
5066 
5067 TEST_F(FormatTest, DeductionGuides) {
5068   verifyFormat("template <class T> A(const T &, const T &) -> A<T &>;");
5069   verifyFormat("template <class T> explicit A(T &, T &&) -> A<T>;");
5070   verifyFormat("template <class... Ts> S(Ts...) -> S<Ts...>;");
5071   verifyFormat(
5072       "template <class... T>\n"
5073       "array(T &&... t) -> array<std::common_type_t<T...>, sizeof...(T)>;");
5074   verifyFormat("template <class T> A() -> A<decltype(p->foo<3>())>;");
5075   verifyFormat("template <class T> A() -> A<decltype(foo<traits<1>>)>;");
5076   verifyFormat("template <class T> A() -> A<sizeof(p->foo<1>)>;");
5077   verifyFormat("template <class T> A() -> A<(3 < 2)>;");
5078   verifyFormat("template <class T> A() -> A<((3) < (2))>;");
5079   verifyFormat("template <class T> x() -> x<1>;");
5080   verifyFormat("template <class T> explicit x(T &) -> x<1>;");
5081 
5082   // Ensure not deduction guides.
5083   verifyFormat("c()->f<int>();");
5084   verifyFormat("x()->foo<1>;");
5085   verifyFormat("x = p->foo<3>();");
5086   verifyFormat("x()->x<1>();");
5087   verifyFormat("x()->x<1>;");
5088 }
5089 
5090 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
5091   // Avoid breaking before trailing 'const' or other trailing annotations, if
5092   // they are not function-like.
5093   FormatStyle Style = getGoogleStyle();
5094   Style.ColumnLimit = 47;
5095   verifyFormat("void someLongFunction(\n"
5096                "    int someLoooooooooooooongParameter) const {\n}",
5097                getLLVMStyleWithColumns(47));
5098   verifyFormat("LoooooongReturnType\n"
5099                "someLoooooooongFunction() const {}",
5100                getLLVMStyleWithColumns(47));
5101   verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
5102                "    const {}",
5103                Style);
5104   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
5105                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
5106   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
5107                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
5108   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
5109                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
5110   verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
5111                "                   aaaaaaaaaaa aaaaa) const override;");
5112   verifyGoogleFormat(
5113       "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5114       "    const override;");
5115 
5116   // Even if the first parameter has to be wrapped.
5117   verifyFormat("void someLongFunction(\n"
5118                "    int someLongParameter) const {}",
5119                getLLVMStyleWithColumns(46));
5120   verifyFormat("void someLongFunction(\n"
5121                "    int someLongParameter) const {}",
5122                Style);
5123   verifyFormat("void someLongFunction(\n"
5124                "    int someLongParameter) override {}",
5125                Style);
5126   verifyFormat("void someLongFunction(\n"
5127                "    int someLongParameter) OVERRIDE {}",
5128                Style);
5129   verifyFormat("void someLongFunction(\n"
5130                "    int someLongParameter) final {}",
5131                Style);
5132   verifyFormat("void someLongFunction(\n"
5133                "    int someLongParameter) FINAL {}",
5134                Style);
5135   verifyFormat("void someLongFunction(\n"
5136                "    int parameter) const override {}",
5137                Style);
5138 
5139   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
5140   verifyFormat("void someLongFunction(\n"
5141                "    int someLongParameter) const\n"
5142                "{\n"
5143                "}",
5144                Style);
5145 
5146   Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths;
5147   verifyFormat("void someLongFunction(\n"
5148                "    int someLongParameter) const\n"
5149                "  {\n"
5150                "  }",
5151                Style);
5152 
5153   // Unless these are unknown annotations.
5154   verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
5155                "                  aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5156                "    LONG_AND_UGLY_ANNOTATION;");
5157 
5158   // Breaking before function-like trailing annotations is fine to keep them
5159   // close to their arguments.
5160   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5161                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
5162   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
5163                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
5164   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
5165                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
5166   verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
5167                      "    AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
5168   verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
5169 
5170   verifyFormat(
5171       "void aaaaaaaaaaaaaaaaaa()\n"
5172       "    __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
5173       "                   aaaaaaaaaaaaaaaaaaaaaaaaa));");
5174   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5175                "    __attribute__((unused));");
5176   verifyGoogleFormat(
5177       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5178       "    GUARDED_BY(aaaaaaaaaaaa);");
5179   verifyGoogleFormat(
5180       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5181       "    GUARDED_BY(aaaaaaaaaaaa);");
5182   verifyGoogleFormat(
5183       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
5184       "    aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5185   verifyGoogleFormat(
5186       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
5187       "    aaaaaaaaaaaaaaaaaaaaaaaaa;");
5188 }
5189 
5190 TEST_F(FormatTest, FunctionAnnotations) {
5191   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
5192                "int OldFunction(const string &parameter) {}");
5193   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
5194                "string OldFunction(const string &parameter) {}");
5195   verifyFormat("template <typename T>\n"
5196                "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
5197                "string OldFunction(const string &parameter) {}");
5198 
5199   // Not function annotations.
5200   verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5201                "                << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
5202   verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
5203                "       ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
5204   verifyFormat("MACRO(abc).function() // wrap\n"
5205                "    << abc;");
5206   verifyFormat("MACRO(abc)->function() // wrap\n"
5207                "    << abc;");
5208   verifyFormat("MACRO(abc)::function() // wrap\n"
5209                "    << abc;");
5210 }
5211 
5212 TEST_F(FormatTest, BreaksDesireably) {
5213   verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
5214                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
5215                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
5216   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5217                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
5218                "}");
5219 
5220   verifyFormat(
5221       "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5222       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
5223 
5224   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5225                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5226                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
5227 
5228   verifyFormat(
5229       "aaaaaaaa(aaaaaaaaaaaaa,\n"
5230       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5231       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
5232       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5233       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
5234 
5235   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
5236                "    (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5237 
5238   verifyFormat(
5239       "void f() {\n"
5240       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
5241       "                                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5242       "}");
5243   verifyFormat(
5244       "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5245       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
5246   verifyFormat(
5247       "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5248       "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
5249   verifyFormat(
5250       "aaaaaa(aaa,\n"
5251       "       new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5252       "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5253       "       aaaa);");
5254   verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5255                "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5256                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5257 
5258   // Indent consistently independent of call expression and unary operator.
5259   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
5260                "    dddddddddddddddddddddddddddddd));");
5261   verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
5262                "    dddddddddddddddddddddddddddddd));");
5263   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
5264                "    dddddddddddddddddddddddddddddd));");
5265 
5266   // This test case breaks on an incorrect memoization, i.e. an optimization not
5267   // taking into account the StopAt value.
5268   verifyFormat(
5269       "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
5270       "       aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
5271       "       aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
5272       "       (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5273 
5274   verifyFormat("{\n  {\n    {\n"
5275                "      Annotation.SpaceRequiredBefore =\n"
5276                "          Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
5277                "          Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
5278                "    }\n  }\n}");
5279 
5280   // Break on an outer level if there was a break on an inner level.
5281   EXPECT_EQ("f(g(h(a, // comment\n"
5282             "      b, c),\n"
5283             "    d, e),\n"
5284             "  x, y);",
5285             format("f(g(h(a, // comment\n"
5286                    "    b, c), d, e), x, y);"));
5287 
5288   // Prefer breaking similar line breaks.
5289   verifyFormat(
5290       "const int kTrackingOptions = NSTrackingMouseMoved |\n"
5291       "                             NSTrackingMouseEnteredAndExited |\n"
5292       "                             NSTrackingActiveAlways;");
5293 }
5294 
5295 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
5296   FormatStyle NoBinPacking = getGoogleStyle();
5297   NoBinPacking.BinPackParameters = false;
5298   NoBinPacking.BinPackArguments = true;
5299   verifyFormat("void f() {\n"
5300                "  f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
5301                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5302                "}",
5303                NoBinPacking);
5304   verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
5305                "       int aaaaaaaaaaaaaaaaaaaa,\n"
5306                "       int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5307                NoBinPacking);
5308 
5309   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
5310   verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5311                "                        vector<int> bbbbbbbbbbbbbbb);",
5312                NoBinPacking);
5313   // FIXME: This behavior difference is probably not wanted. However, currently
5314   // we cannot distinguish BreakBeforeParameter being set because of the wrapped
5315   // template arguments from BreakBeforeParameter being set because of the
5316   // one-per-line formatting.
5317   verifyFormat(
5318       "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
5319       "                                             aaaaaaaaaa> aaaaaaaaaa);",
5320       NoBinPacking);
5321   verifyFormat(
5322       "void fffffffffff(\n"
5323       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
5324       "        aaaaaaaaaa);");
5325 }
5326 
5327 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
5328   FormatStyle NoBinPacking = getGoogleStyle();
5329   NoBinPacking.BinPackParameters = false;
5330   NoBinPacking.BinPackArguments = false;
5331   verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
5332                "  aaaaaaaaaaaaaaaaaaaa,\n"
5333                "  aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
5334                NoBinPacking);
5335   verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
5336                "        aaaaaaaaaaaaa,\n"
5337                "        aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
5338                NoBinPacking);
5339   verifyFormat(
5340       "aaaaaaaa(aaaaaaaaaaaaa,\n"
5341       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5342       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
5343       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5344       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
5345       NoBinPacking);
5346   verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
5347                "    .aaaaaaaaaaaaaaaaaa();",
5348                NoBinPacking);
5349   verifyFormat("void f() {\n"
5350                "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5351                "      aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
5352                "}",
5353                NoBinPacking);
5354 
5355   verifyFormat(
5356       "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5357       "             aaaaaaaaaaaa,\n"
5358       "             aaaaaaaaaaaa);",
5359       NoBinPacking);
5360   verifyFormat(
5361       "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
5362       "                               ddddddddddddddddddddddddddddd),\n"
5363       "             test);",
5364       NoBinPacking);
5365 
5366   verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
5367                "            aaaaaaaaaaaaaaaaaaaaaaa,\n"
5368                "            aaaaaaaaaaaaaaaaaaaaaaa>\n"
5369                "    aaaaaaaaaaaaaaaaaa;",
5370                NoBinPacking);
5371   verifyFormat("a(\"a\"\n"
5372                "  \"a\",\n"
5373                "  a);");
5374 
5375   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
5376   verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
5377                "                aaaaaaaaa,\n"
5378                "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5379                NoBinPacking);
5380   verifyFormat(
5381       "void f() {\n"
5382       "  aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
5383       "      .aaaaaaa();\n"
5384       "}",
5385       NoBinPacking);
5386   verifyFormat(
5387       "template <class SomeType, class SomeOtherType>\n"
5388       "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
5389       NoBinPacking);
5390 }
5391 
5392 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
5393   FormatStyle Style = getLLVMStyleWithColumns(15);
5394   Style.ExperimentalAutoDetectBinPacking = true;
5395   EXPECT_EQ("aaa(aaaa,\n"
5396             "    aaaa,\n"
5397             "    aaaa);\n"
5398             "aaa(aaaa,\n"
5399             "    aaaa,\n"
5400             "    aaaa);",
5401             format("aaa(aaaa,\n" // one-per-line
5402                    "  aaaa,\n"
5403                    "    aaaa  );\n"
5404                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
5405                    Style));
5406   EXPECT_EQ("aaa(aaaa, aaaa,\n"
5407             "    aaaa);\n"
5408             "aaa(aaaa, aaaa,\n"
5409             "    aaaa);",
5410             format("aaa(aaaa,  aaaa,\n" // bin-packed
5411                    "    aaaa  );\n"
5412                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
5413                    Style));
5414 }
5415 
5416 TEST_F(FormatTest, FormatsBuilderPattern) {
5417   verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
5418                "    .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
5419                "    .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
5420                "    .StartsWith(\".init\", ORDER_INIT)\n"
5421                "    .StartsWith(\".fini\", ORDER_FINI)\n"
5422                "    .StartsWith(\".hash\", ORDER_HASH)\n"
5423                "    .Default(ORDER_TEXT);\n");
5424 
5425   verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
5426                "       aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
5427   verifyFormat("aaaaaaa->aaaaaaa\n"
5428                "    ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5429                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5430                "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
5431   verifyFormat(
5432       "aaaaaaa->aaaaaaa\n"
5433       "    ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5434       "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
5435   verifyFormat(
5436       "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
5437       "    aaaaaaaaaaaaaa);");
5438   verifyFormat(
5439       "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
5440       "    aaaaaa->aaaaaaaaaaaa()\n"
5441       "        ->aaaaaaaaaaaaaaaa(\n"
5442       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5443       "        ->aaaaaaaaaaaaaaaaa();");
5444   verifyGoogleFormat(
5445       "void f() {\n"
5446       "  someo->Add((new util::filetools::Handler(dir))\n"
5447       "                 ->OnEvent1(NewPermanentCallback(\n"
5448       "                     this, &HandlerHolderClass::EventHandlerCBA))\n"
5449       "                 ->OnEvent2(NewPermanentCallback(\n"
5450       "                     this, &HandlerHolderClass::EventHandlerCBB))\n"
5451       "                 ->OnEvent3(NewPermanentCallback(\n"
5452       "                     this, &HandlerHolderClass::EventHandlerCBC))\n"
5453       "                 ->OnEvent5(NewPermanentCallback(\n"
5454       "                     this, &HandlerHolderClass::EventHandlerCBD))\n"
5455       "                 ->OnEvent6(NewPermanentCallback(\n"
5456       "                     this, &HandlerHolderClass::EventHandlerCBE)));\n"
5457       "}");
5458 
5459   verifyFormat(
5460       "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
5461   verifyFormat("aaaaaaaaaaaaaaa()\n"
5462                "    .aaaaaaaaaaaaaaa()\n"
5463                "    .aaaaaaaaaaaaaaa()\n"
5464                "    .aaaaaaaaaaaaaaa()\n"
5465                "    .aaaaaaaaaaaaaaa();");
5466   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
5467                "    .aaaaaaaaaaaaaaa()\n"
5468                "    .aaaaaaaaaaaaaaa()\n"
5469                "    .aaaaaaaaaaaaaaa();");
5470   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
5471                "    .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
5472                "    .aaaaaaaaaaaaaaa();");
5473   verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
5474                "    ->aaaaaaaaaaaaaae(0)\n"
5475                "    ->aaaaaaaaaaaaaaa();");
5476 
5477   // Don't linewrap after very short segments.
5478   verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5479                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5480                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5481   verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5482                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5483                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5484   verifyFormat("aaa()\n"
5485                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5486                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5487                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5488 
5489   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
5490                "    .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5491                "    .has<bbbbbbbbbbbbbbbbbbbbb>();");
5492   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
5493                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
5494                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
5495 
5496   // Prefer not to break after empty parentheses.
5497   verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
5498                "    First->LastNewlineOffset);");
5499 
5500   // Prefer not to create "hanging" indents.
5501   verifyFormat(
5502       "return !soooooooooooooome_map\n"
5503       "            .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5504       "            .second;");
5505   verifyFormat(
5506       "return aaaaaaaaaaaaaaaa\n"
5507       "    .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
5508       "    .aaaa(aaaaaaaaaaaaaa);");
5509   // No hanging indent here.
5510   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
5511                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5512   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
5513                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5514   verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
5515                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5516                getLLVMStyleWithColumns(60));
5517   verifyFormat("aaaaaaaaaaaaaaaaaa\n"
5518                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
5519                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5520                getLLVMStyleWithColumns(59));
5521   verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5522                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5523                "    .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5524 
5525   // Dont break if only closing statements before member call
5526   verifyFormat("test() {\n"
5527                "  ([]() -> {\n"
5528                "    int b = 32;\n"
5529                "    return 3;\n"
5530                "  }).foo();\n"
5531                "}");
5532   verifyFormat("test() {\n"
5533                "  (\n"
5534                "      []() -> {\n"
5535                "        int b = 32;\n"
5536                "        return 3;\n"
5537                "      },\n"
5538                "      foo, bar)\n"
5539                "      .foo();\n"
5540                "}");
5541   verifyFormat("test() {\n"
5542                "  ([]() -> {\n"
5543                "    int b = 32;\n"
5544                "    return 3;\n"
5545                "  })\n"
5546                "      .foo()\n"
5547                "      .bar();\n"
5548                "}");
5549   verifyFormat("test() {\n"
5550                "  ([]() -> {\n"
5551                "    int b = 32;\n"
5552                "    return 3;\n"
5553                "  })\n"
5554                "      .foo(\"aaaaaaaaaaaaaaaaa\"\n"
5555                "           \"bbbb\");\n"
5556                "}",
5557                getLLVMStyleWithColumns(30));
5558 }
5559 
5560 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
5561   verifyFormat(
5562       "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
5563       "    bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
5564   verifyFormat(
5565       "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
5566       "    bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
5567 
5568   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
5569                "    ccccccccccccccccccccccccc) {\n}");
5570   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
5571                "    ccccccccccccccccccccccccc) {\n}");
5572 
5573   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
5574                "    ccccccccccccccccccccccccc) {\n}");
5575   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
5576                "    ccccccccccccccccccccccccc) {\n}");
5577 
5578   verifyFormat(
5579       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
5580       "    ccccccccccccccccccccccccc) {\n}");
5581   verifyFormat(
5582       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
5583       "    ccccccccccccccccccccccccc) {\n}");
5584 
5585   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
5586                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
5587                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
5588                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
5589   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
5590                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
5591                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
5592                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
5593 
5594   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
5595                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
5596                "    aaaaaaaaaaaaaaa != aa) {\n}");
5597   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
5598                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
5599                "    aaaaaaaaaaaaaaa != aa) {\n}");
5600 }
5601 
5602 TEST_F(FormatTest, BreaksAfterAssignments) {
5603   verifyFormat(
5604       "unsigned Cost =\n"
5605       "    TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
5606       "                        SI->getPointerAddressSpaceee());\n");
5607   verifyFormat(
5608       "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
5609       "    Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
5610 
5611   verifyFormat(
5612       "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
5613       "    aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
5614   verifyFormat("unsigned OriginalStartColumn =\n"
5615                "    SourceMgr.getSpellingColumnNumber(\n"
5616                "        Current.FormatTok.getStartOfNonWhitespace()) -\n"
5617                "    1;");
5618 }
5619 
5620 TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
5621   FormatStyle Style = getLLVMStyle();
5622   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5623                "    bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
5624                Style);
5625 
5626   Style.PenaltyBreakAssignment = 20;
5627   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
5628                "                                 cccccccccccccccccccccccccc;",
5629                Style);
5630 }
5631 
5632 TEST_F(FormatTest, AlignsAfterAssignments) {
5633   verifyFormat(
5634       "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5635       "             aaaaaaaaaaaaaaaaaaaaaaaaa;");
5636   verifyFormat(
5637       "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5638       "          aaaaaaaaaaaaaaaaaaaaaaaaa;");
5639   verifyFormat(
5640       "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5641       "           aaaaaaaaaaaaaaaaaaaaaaaaa;");
5642   verifyFormat(
5643       "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5644       "              aaaaaaaaaaaaaaaaaaaaaaaaa);");
5645   verifyFormat(
5646       "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5647       "                                            aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5648       "                                            aaaaaaaaaaaaaaaaaaaaaaaa;");
5649 }
5650 
5651 TEST_F(FormatTest, AlignsAfterReturn) {
5652   verifyFormat(
5653       "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5654       "       aaaaaaaaaaaaaaaaaaaaaaaaa;");
5655   verifyFormat(
5656       "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5657       "        aaaaaaaaaaaaaaaaaaaaaaaaa);");
5658   verifyFormat(
5659       "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
5660       "       aaaaaaaaaaaaaaaaaaaaaa();");
5661   verifyFormat(
5662       "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
5663       "        aaaaaaaaaaaaaaaaaaaaaa());");
5664   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5665                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5666   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5667                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
5668                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5669   verifyFormat("return\n"
5670                "    // true if code is one of a or b.\n"
5671                "    code == a || code == b;");
5672 }
5673 
5674 TEST_F(FormatTest, AlignsAfterOpenBracket) {
5675   verifyFormat(
5676       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5677       "                                                aaaaaaaaa aaaaaaa) {}");
5678   verifyFormat(
5679       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5680       "                                               aaaaaaaaaaa aaaaaaaaa);");
5681   verifyFormat(
5682       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5683       "                                             aaaaaaaaaaaaaaaaaaaaa));");
5684   FormatStyle Style = getLLVMStyle();
5685   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5686   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5687                "    aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
5688                Style);
5689   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5690                "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
5691                Style);
5692   verifyFormat("SomeLongVariableName->someFunction(\n"
5693                "    foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
5694                Style);
5695   verifyFormat(
5696       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5697       "    aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5698       Style);
5699   verifyFormat(
5700       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5701       "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5702       Style);
5703   verifyFormat(
5704       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5705       "    aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
5706       Style);
5707 
5708   verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
5709                "    ccccccc(aaaaaaaaaaaaaaaaa,         //\n"
5710                "        b));",
5711                Style);
5712 
5713   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5714   Style.BinPackArguments = false;
5715   Style.BinPackParameters = false;
5716   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5717                "    aaaaaaaaaaa aaaaaaaa,\n"
5718                "    aaaaaaaaa aaaaaaa,\n"
5719                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5720                Style);
5721   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5722                "    aaaaaaaaaaa aaaaaaaaa,\n"
5723                "    aaaaaaaaaaa aaaaaaaaa,\n"
5724                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5725                Style);
5726   verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
5727                "    aaaaaaaaaaaaaaa,\n"
5728                "    aaaaaaaaaaaaaaaaaaaaa,\n"
5729                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
5730                Style);
5731   verifyFormat(
5732       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
5733       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5734       Style);
5735   verifyFormat(
5736       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
5737       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5738       Style);
5739   verifyFormat(
5740       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5741       "    aaaaaaaaaaaaaaaaaaaaa(\n"
5742       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
5743       "    aaaaaaaaaaaaaaaa);",
5744       Style);
5745   verifyFormat(
5746       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5747       "    aaaaaaaaaaaaaaaaaaaaa(\n"
5748       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
5749       "    aaaaaaaaaaaaaaaa);",
5750       Style);
5751 }
5752 
5753 TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
5754   FormatStyle Style = getLLVMStyleWithColumns(40);
5755   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5756                "          bbbbbbbbbbbbbbbbbbbbbb);",
5757                Style);
5758   Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
5759   Style.AlignOperands = false;
5760   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5761                "          bbbbbbbbbbbbbbbbbbbbbb);",
5762                Style);
5763   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5764   Style.AlignOperands = true;
5765   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5766                "          bbbbbbbbbbbbbbbbbbbbbb);",
5767                Style);
5768   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5769   Style.AlignOperands = false;
5770   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5771                "    bbbbbbbbbbbbbbbbbbbbbb);",
5772                Style);
5773 }
5774 
5775 TEST_F(FormatTest, BreaksConditionalExpressions) {
5776   verifyFormat(
5777       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5778       "                               ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5779       "                               : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5780   verifyFormat(
5781       "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
5782       "     aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5783       "                                : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5784   verifyFormat(
5785       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5786       "                                   : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5787   verifyFormat("aaaa(aaaaaaaaa, aaaaaaaaa,\n"
5788                "     aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5789                "             : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5790   verifyFormat(
5791       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
5792       "                                                    : aaaaaaaaaaaaa);");
5793   verifyFormat(
5794       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5795       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5796       "                                    : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5797       "                   aaaaaaaaaaaaa);");
5798   verifyFormat(
5799       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5800       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5801       "                   aaaaaaaaaaaaa);");
5802   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5803                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5804                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5805                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5806                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5807   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5808                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5809                "           ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5810                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5811                "           : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5812                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5813                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5814   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5815                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5816                "           ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5817                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5818                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5819   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5820                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5821                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5822   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
5823                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5824                "        ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5825                "        : aaaaaaaaaaaaaaaa;");
5826   verifyFormat(
5827       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5828       "    ? aaaaaaaaaaaaaaa\n"
5829       "    : aaaaaaaaaaaaaaa;");
5830   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
5831                "          aaaaaaaaa\n"
5832                "      ? b\n"
5833                "      : c);");
5834   verifyFormat("return aaaa == bbbb\n"
5835                "           // comment\n"
5836                "           ? aaaa\n"
5837                "           : bbbb;");
5838   verifyFormat("unsigned Indent =\n"
5839                "    format(TheLine.First,\n"
5840                "           IndentForLevel[TheLine.Level] >= 0\n"
5841                "               ? IndentForLevel[TheLine.Level]\n"
5842                "               : TheLine * 2,\n"
5843                "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
5844                getLLVMStyleWithColumns(60));
5845   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5846                "                  ? aaaaaaaaaaaaaaa\n"
5847                "                  : bbbbbbbbbbbbbbb //\n"
5848                "                        ? ccccccccccccccc\n"
5849                "                        : ddddddddddddddd;");
5850   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5851                "                  ? aaaaaaaaaaaaaaa\n"
5852                "                  : (bbbbbbbbbbbbbbb //\n"
5853                "                         ? ccccccccccccccc\n"
5854                "                         : ddddddddddddddd);");
5855   verifyFormat(
5856       "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5857       "                                      ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5858       "                                            aaaaaaaaaaaaaaaaaaaaa +\n"
5859       "                                            aaaaaaaaaaaaaaaaaaaaa\n"
5860       "                                      : aaaaaaaaaa;");
5861   verifyFormat(
5862       "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5863       "                                   : aaaaaaaaaaaaaaaaaaaaaa\n"
5864       "                      : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5865 
5866   FormatStyle NoBinPacking = getLLVMStyle();
5867   NoBinPacking.BinPackArguments = false;
5868   verifyFormat(
5869       "void f() {\n"
5870       "  g(aaa,\n"
5871       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5872       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5873       "        ? aaaaaaaaaaaaaaa\n"
5874       "        : aaaaaaaaaaaaaaa);\n"
5875       "}",
5876       NoBinPacking);
5877   verifyFormat(
5878       "void f() {\n"
5879       "  g(aaa,\n"
5880       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5881       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5882       "        ?: aaaaaaaaaaaaaaa);\n"
5883       "}",
5884       NoBinPacking);
5885 
5886   verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
5887                "             // comment.\n"
5888                "             ccccccccccccccccccccccccccccccccccccccc\n"
5889                "                 ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5890                "                 : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
5891 
5892   // Assignments in conditional expressions. Apparently not uncommon :-(.
5893   verifyFormat("return a != b\n"
5894                "           // comment\n"
5895                "           ? a = b\n"
5896                "           : a = b;");
5897   verifyFormat("return a != b\n"
5898                "           // comment\n"
5899                "           ? a = a != b\n"
5900                "                     // comment\n"
5901                "                     ? a = b\n"
5902                "                     : a\n"
5903                "           : a;\n");
5904   verifyFormat("return a != b\n"
5905                "           // comment\n"
5906                "           ? a\n"
5907                "           : a = a != b\n"
5908                "                     // comment\n"
5909                "                     ? a = b\n"
5910                "                     : a;");
5911 }
5912 
5913 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
5914   FormatStyle Style = getLLVMStyle();
5915   Style.BreakBeforeTernaryOperators = false;
5916   Style.ColumnLimit = 70;
5917   verifyFormat(
5918       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5919       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5920       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5921       Style);
5922   verifyFormat(
5923       "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
5924       "     aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5925       "                                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5926       Style);
5927   verifyFormat(
5928       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5929       "                                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5930       Style);
5931   verifyFormat("aaaa(aaaaaaaa, aaaaaaaaaa,\n"
5932                "     aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5933                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5934                Style);
5935   verifyFormat(
5936       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
5937       "                                                      aaaaaaaaaaaaa);",
5938       Style);
5939   verifyFormat(
5940       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5941       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5942       "                                      aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5943       "                   aaaaaaaaaaaaa);",
5944       Style);
5945   verifyFormat(
5946       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5947       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5948       "                   aaaaaaaaaaaaa);",
5949       Style);
5950   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5951                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5952                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5953                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5954                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5955                Style);
5956   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5957                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5958                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5959                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5960                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5961                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5962                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5963                Style);
5964   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5965                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
5966                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5967                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5968                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5969                Style);
5970   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5971                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5972                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5973                Style);
5974   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
5975                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5976                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5977                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5978                Style);
5979   verifyFormat(
5980       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5981       "    aaaaaaaaaaaaaaa :\n"
5982       "    aaaaaaaaaaaaaaa;",
5983       Style);
5984   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
5985                "          aaaaaaaaa ?\n"
5986                "      b :\n"
5987                "      c);",
5988                Style);
5989   verifyFormat("unsigned Indent =\n"
5990                "    format(TheLine.First,\n"
5991                "           IndentForLevel[TheLine.Level] >= 0 ?\n"
5992                "               IndentForLevel[TheLine.Level] :\n"
5993                "               TheLine * 2,\n"
5994                "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
5995                Style);
5996   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5997                "                  aaaaaaaaaaaaaaa :\n"
5998                "                  bbbbbbbbbbbbbbb ? //\n"
5999                "                      ccccccccccccccc :\n"
6000                "                      ddddddddddddddd;",
6001                Style);
6002   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
6003                "                  aaaaaaaaaaaaaaa :\n"
6004                "                  (bbbbbbbbbbbbbbb ? //\n"
6005                "                       ccccccccccccccc :\n"
6006                "                       ddddddddddddddd);",
6007                Style);
6008   verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6009                "            /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
6010                "            ccccccccccccccccccccccccccc;",
6011                Style);
6012   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6013                "           aaaaa :\n"
6014                "           bbbbbbbbbbbbbbb + cccccccccccccccc;",
6015                Style);
6016 }
6017 
6018 TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
6019   verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
6020                "     aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
6021   verifyFormat("bool a = true, b = false;");
6022 
6023   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6024                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
6025                "     bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
6026                "         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
6027   verifyFormat(
6028       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
6029       "         bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
6030       "     d = e && f;");
6031   verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
6032                "          c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
6033   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
6034                "          *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
6035   verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
6036                "          ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
6037 
6038   FormatStyle Style = getGoogleStyle();
6039   Style.PointerAlignment = FormatStyle::PAS_Left;
6040   Style.DerivePointerAlignment = false;
6041   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6042                "    *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
6043                "    *b = bbbbbbbbbbbbbbbbbbb;",
6044                Style);
6045   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
6046                "          *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
6047                Style);
6048   verifyFormat("vector<int*> a, b;", Style);
6049   verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
6050 }
6051 
6052 TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
6053   verifyFormat("arr[foo ? bar : baz];");
6054   verifyFormat("f()[foo ? bar : baz];");
6055   verifyFormat("(a + b)[foo ? bar : baz];");
6056   verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
6057 }
6058 
6059 TEST_F(FormatTest, AlignsStringLiterals) {
6060   verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
6061                "                                      \"short literal\");");
6062   verifyFormat(
6063       "looooooooooooooooooooooooongFunction(\n"
6064       "    \"short literal\"\n"
6065       "    \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
6066   verifyFormat("someFunction(\"Always break between multi-line\"\n"
6067                "             \" string literals\",\n"
6068                "             and, other, parameters);");
6069   EXPECT_EQ("fun + \"1243\" /* comment */\n"
6070             "      \"5678\";",
6071             format("fun + \"1243\" /* comment */\n"
6072                    "    \"5678\";",
6073                    getLLVMStyleWithColumns(28)));
6074   EXPECT_EQ(
6075       "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6076       "         \"aaaaaaaaaaaaaaaaaaaaa\"\n"
6077       "         \"aaaaaaaaaaaaaaaa\";",
6078       format("aaaaaa ="
6079              "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
6080              "aaaaaaaaaaaaaaaaaaaaa\" "
6081              "\"aaaaaaaaaaaaaaaa\";"));
6082   verifyFormat("a = a + \"a\"\n"
6083                "        \"a\"\n"
6084                "        \"a\";");
6085   verifyFormat("f(\"a\", \"b\"\n"
6086                "       \"c\");");
6087 
6088   verifyFormat(
6089       "#define LL_FORMAT \"ll\"\n"
6090       "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
6091       "       \"d, ddddddddd: %\" LL_FORMAT \"d\");");
6092 
6093   verifyFormat("#define A(X)          \\\n"
6094                "  \"aaaaa\" #X \"bbbbbb\" \\\n"
6095                "  \"ccccc\"",
6096                getLLVMStyleWithColumns(23));
6097   verifyFormat("#define A \"def\"\n"
6098                "f(\"abc\" A \"ghi\"\n"
6099                "  \"jkl\");");
6100 
6101   verifyFormat("f(L\"a\"\n"
6102                "  L\"b\");");
6103   verifyFormat("#define A(X)            \\\n"
6104                "  L\"aaaaa\" #X L\"bbbbbb\" \\\n"
6105                "  L\"ccccc\"",
6106                getLLVMStyleWithColumns(25));
6107 
6108   verifyFormat("f(@\"a\"\n"
6109                "  @\"b\");");
6110   verifyFormat("NSString s = @\"a\"\n"
6111                "             @\"b\"\n"
6112                "             @\"c\";");
6113   verifyFormat("NSString s = @\"a\"\n"
6114                "              \"b\"\n"
6115                "              \"c\";");
6116 }
6117 
6118 TEST_F(FormatTest, ReturnTypeBreakingStyle) {
6119   FormatStyle Style = getLLVMStyle();
6120   // No declarations or definitions should be moved to own line.
6121   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
6122   verifyFormat("class A {\n"
6123                "  int f() { return 1; }\n"
6124                "  int g();\n"
6125                "};\n"
6126                "int f() { return 1; }\n"
6127                "int g();\n",
6128                Style);
6129 
6130   // All declarations and definitions should have the return type moved to its
6131   // own
6132   // line.
6133   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
6134   verifyFormat("class E {\n"
6135                "  int\n"
6136                "  f() {\n"
6137                "    return 1;\n"
6138                "  }\n"
6139                "  int\n"
6140                "  g();\n"
6141                "};\n"
6142                "int\n"
6143                "f() {\n"
6144                "  return 1;\n"
6145                "}\n"
6146                "int\n"
6147                "g();\n",
6148                Style);
6149 
6150   // Top-level definitions, and no kinds of declarations should have the
6151   // return type moved to its own line.
6152   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
6153   verifyFormat("class B {\n"
6154                "  int f() { return 1; }\n"
6155                "  int g();\n"
6156                "};\n"
6157                "int\n"
6158                "f() {\n"
6159                "  return 1;\n"
6160                "}\n"
6161                "int g();\n",
6162                Style);
6163 
6164   // Top-level definitions and declarations should have the return type moved
6165   // to its own line.
6166   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
6167   verifyFormat("class C {\n"
6168                "  int f() { return 1; }\n"
6169                "  int g();\n"
6170                "};\n"
6171                "int\n"
6172                "f() {\n"
6173                "  return 1;\n"
6174                "}\n"
6175                "int\n"
6176                "g();\n",
6177                Style);
6178 
6179   // All definitions should have the return type moved to its own line, but no
6180   // kinds of declarations.
6181   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
6182   verifyFormat("class D {\n"
6183                "  int\n"
6184                "  f() {\n"
6185                "    return 1;\n"
6186                "  }\n"
6187                "  int g();\n"
6188                "};\n"
6189                "int\n"
6190                "f() {\n"
6191                "  return 1;\n"
6192                "}\n"
6193                "int g();\n",
6194                Style);
6195   verifyFormat("const char *\n"
6196                "f(void) {\n" // Break here.
6197                "  return \"\";\n"
6198                "}\n"
6199                "const char *bar(void);\n", // No break here.
6200                Style);
6201   verifyFormat("template <class T>\n"
6202                "T *\n"
6203                "f(T &c) {\n" // Break here.
6204                "  return NULL;\n"
6205                "}\n"
6206                "template <class T> T *f(T &c);\n", // No break here.
6207                Style);
6208   verifyFormat("class C {\n"
6209                "  int\n"
6210                "  operator+() {\n"
6211                "    return 1;\n"
6212                "  }\n"
6213                "  int\n"
6214                "  operator()() {\n"
6215                "    return 1;\n"
6216                "  }\n"
6217                "};\n",
6218                Style);
6219   verifyFormat("void\n"
6220                "A::operator()() {}\n"
6221                "void\n"
6222                "A::operator>>() {}\n"
6223                "void\n"
6224                "A::operator+() {}\n"
6225                "void\n"
6226                "A::operator*() {}\n"
6227                "void\n"
6228                "A::operator->() {}\n"
6229                "void\n"
6230                "A::operator void *() {}\n"
6231                "void\n"
6232                "A::operator void &() {}\n"
6233                "void\n"
6234                "A::operator void &&() {}\n"
6235                "void\n"
6236                "A::operator char *() {}\n"
6237                "void\n"
6238                "A::operator[]() {}\n"
6239                "void\n"
6240                "A::operator!() {}\n",
6241                Style);
6242   verifyFormat("constexpr auto\n"
6243                "operator()() const -> reference {}\n"
6244                "constexpr auto\n"
6245                "operator>>() const -> reference {}\n"
6246                "constexpr auto\n"
6247                "operator+() const -> reference {}\n"
6248                "constexpr auto\n"
6249                "operator*() const -> reference {}\n"
6250                "constexpr auto\n"
6251                "operator->() const -> reference {}\n"
6252                "constexpr auto\n"
6253                "operator++() const -> reference {}\n"
6254                "constexpr auto\n"
6255                "operator void *() const -> reference {}\n"
6256                "constexpr auto\n"
6257                "operator void &() const -> reference {}\n"
6258                "constexpr auto\n"
6259                "operator void &&() const -> reference {}\n"
6260                "constexpr auto\n"
6261                "operator char *() const -> reference {}\n"
6262                "constexpr auto\n"
6263                "operator!() const -> reference {}\n"
6264                "constexpr auto\n"
6265                "operator[]() const -> reference {}\n",
6266                Style);
6267   verifyFormat("void *operator new(std::size_t s);", // No break here.
6268                Style);
6269   verifyFormat("void *\n"
6270                "operator new(std::size_t s) {}",
6271                Style);
6272   verifyFormat("void *\n"
6273                "operator delete[](void *ptr) {}",
6274                Style);
6275   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
6276   verifyFormat("const char *\n"
6277                "f(void)\n" // Break here.
6278                "{\n"
6279                "  return \"\";\n"
6280                "}\n"
6281                "const char *bar(void);\n", // No break here.
6282                Style);
6283   verifyFormat("template <class T>\n"
6284                "T *\n"     // Problem here: no line break
6285                "f(T &c)\n" // Break here.
6286                "{\n"
6287                "  return NULL;\n"
6288                "}\n"
6289                "template <class T> T *f(T &c);\n", // No break here.
6290                Style);
6291   verifyFormat("int\n"
6292                "foo(A<bool> a)\n"
6293                "{\n"
6294                "  return a;\n"
6295                "}\n",
6296                Style);
6297   verifyFormat("int\n"
6298                "foo(A<8> a)\n"
6299                "{\n"
6300                "  return a;\n"
6301                "}\n",
6302                Style);
6303   verifyFormat("int\n"
6304                "foo(A<B<bool>, 8> a)\n"
6305                "{\n"
6306                "  return a;\n"
6307                "}\n",
6308                Style);
6309   verifyFormat("int\n"
6310                "foo(A<B<8>, bool> a)\n"
6311                "{\n"
6312                "  return a;\n"
6313                "}\n",
6314                Style);
6315   verifyFormat("int\n"
6316                "foo(A<B<bool>, bool> a)\n"
6317                "{\n"
6318                "  return a;\n"
6319                "}\n",
6320                Style);
6321   verifyFormat("int\n"
6322                "foo(A<B<8>, 8> a)\n"
6323                "{\n"
6324                "  return a;\n"
6325                "}\n",
6326                Style);
6327 
6328   Style = getGNUStyle();
6329 
6330   // Test for comments at the end of function declarations.
6331   verifyFormat("void\n"
6332                "foo (int a, /*abc*/ int b) // def\n"
6333                "{\n"
6334                "}\n",
6335                Style);
6336 
6337   verifyFormat("void\n"
6338                "foo (int a, /* abc */ int b) /* def */\n"
6339                "{\n"
6340                "}\n",
6341                Style);
6342 
6343   // Definitions that should not break after return type
6344   verifyFormat("void foo (int a, int b); // def\n", Style);
6345   verifyFormat("void foo (int a, int b); /* def */\n", Style);
6346   verifyFormat("void foo (int a, int b);\n", Style);
6347 }
6348 
6349 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
6350   FormatStyle NoBreak = getLLVMStyle();
6351   NoBreak.AlwaysBreakBeforeMultilineStrings = false;
6352   FormatStyle Break = getLLVMStyle();
6353   Break.AlwaysBreakBeforeMultilineStrings = true;
6354   verifyFormat("aaaa = \"bbbb\"\n"
6355                "       \"cccc\";",
6356                NoBreak);
6357   verifyFormat("aaaa =\n"
6358                "    \"bbbb\"\n"
6359                "    \"cccc\";",
6360                Break);
6361   verifyFormat("aaaa(\"bbbb\"\n"
6362                "     \"cccc\");",
6363                NoBreak);
6364   verifyFormat("aaaa(\n"
6365                "    \"bbbb\"\n"
6366                "    \"cccc\");",
6367                Break);
6368   verifyFormat("aaaa(qqq, \"bbbb\"\n"
6369                "          \"cccc\");",
6370                NoBreak);
6371   verifyFormat("aaaa(qqq,\n"
6372                "     \"bbbb\"\n"
6373                "     \"cccc\");",
6374                Break);
6375   verifyFormat("aaaa(qqq,\n"
6376                "     L\"bbbb\"\n"
6377                "     L\"cccc\");",
6378                Break);
6379   verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
6380                "                      \"bbbb\"));",
6381                Break);
6382   verifyFormat("string s = someFunction(\n"
6383                "    \"abc\"\n"
6384                "    \"abc\");",
6385                Break);
6386 
6387   // As we break before unary operators, breaking right after them is bad.
6388   verifyFormat("string foo = abc ? \"x\"\n"
6389                "                   \"blah blah blah blah blah blah\"\n"
6390                "                 : \"y\";",
6391                Break);
6392 
6393   // Don't break if there is no column gain.
6394   verifyFormat("f(\"aaaa\"\n"
6395                "  \"bbbb\");",
6396                Break);
6397 
6398   // Treat literals with escaped newlines like multi-line string literals.
6399   EXPECT_EQ("x = \"a\\\n"
6400             "b\\\n"
6401             "c\";",
6402             format("x = \"a\\\n"
6403                    "b\\\n"
6404                    "c\";",
6405                    NoBreak));
6406   EXPECT_EQ("xxxx =\n"
6407             "    \"a\\\n"
6408             "b\\\n"
6409             "c\";",
6410             format("xxxx = \"a\\\n"
6411                    "b\\\n"
6412                    "c\";",
6413                    Break));
6414 
6415   EXPECT_EQ("NSString *const kString =\n"
6416             "    @\"aaaa\"\n"
6417             "    @\"bbbb\";",
6418             format("NSString *const kString = @\"aaaa\"\n"
6419                    "@\"bbbb\";",
6420                    Break));
6421 
6422   Break.ColumnLimit = 0;
6423   verifyFormat("const char *hello = \"hello llvm\";", Break);
6424 }
6425 
6426 TEST_F(FormatTest, AlignsPipes) {
6427   verifyFormat(
6428       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6429       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6430       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6431   verifyFormat(
6432       "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
6433       "                     << aaaaaaaaaaaaaaaaaaaa;");
6434   verifyFormat(
6435       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6436       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6437   verifyFormat(
6438       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
6439       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6440   verifyFormat(
6441       "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
6442       "                \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
6443       "             << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
6444   verifyFormat(
6445       "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6446       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6447       "         << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6448   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6449                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6450                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6451                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
6452   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
6453                "             << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
6454   verifyFormat(
6455       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6456       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6457   verifyFormat(
6458       "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
6459       "                                       aaaaaaaaaaaaaaaaaaaaaaaaaa);");
6460 
6461   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
6462                "             << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
6463   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6464                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6465                "                    aaaaaaaaaaaaaaaaaaaaa)\n"
6466                "             << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
6467   verifyFormat("LOG_IF(aaa == //\n"
6468                "       bbb)\n"
6469                "    << a << b;");
6470 
6471   // But sometimes, breaking before the first "<<" is desirable.
6472   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
6473                "    << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
6474   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
6475                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6476                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6477   verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
6478                "    << BEF << IsTemplate << Description << E->getType();");
6479   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
6480                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6481                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6482   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
6483                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6484                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6485                "    << aaa;");
6486 
6487   verifyFormat(
6488       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6489       "                    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6490 
6491   // Incomplete string literal.
6492   EXPECT_EQ("llvm::errs() << \"\n"
6493             "             << a;",
6494             format("llvm::errs() << \"\n<<a;"));
6495 
6496   verifyFormat("void f() {\n"
6497                "  CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
6498                "      << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
6499                "}");
6500 
6501   // Handle 'endl'.
6502   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
6503                "             << bbbbbbbbbbbbbbbbbbbbbb << endl;");
6504   verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
6505 
6506   // Handle '\n'.
6507   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
6508                "             << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
6509   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
6510                "             << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
6511   verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
6512                "             << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
6513   verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
6514 }
6515 
6516 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
6517   verifyFormat("return out << \"somepacket = {\\n\"\n"
6518                "           << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
6519                "           << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
6520                "           << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
6521                "           << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
6522                "           << \"}\";");
6523 
6524   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
6525                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
6526                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
6527   verifyFormat(
6528       "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
6529       "             << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
6530       "             << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
6531       "             << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
6532       "             << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
6533   verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
6534                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
6535   verifyFormat(
6536       "void f() {\n"
6537       "  llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
6538       "               << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
6539       "}");
6540 
6541   // Breaking before the first "<<" is generally not desirable.
6542   verifyFormat(
6543       "llvm::errs()\n"
6544       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6545       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6546       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6547       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
6548       getLLVMStyleWithColumns(70));
6549   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
6550                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6551                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
6552                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6553                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
6554                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
6555                getLLVMStyleWithColumns(70));
6556 
6557   verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
6558                "           \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
6559                "           \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
6560   verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
6561                "                  \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
6562                "                  \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
6563   verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
6564                "           (aaaa + aaaa);",
6565                getLLVMStyleWithColumns(40));
6566   verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
6567                "                  (aaaaaaa + aaaaa));",
6568                getLLVMStyleWithColumns(40));
6569   verifyFormat(
6570       "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
6571       "                  SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
6572       "                  bbbbbbbbbbbbbbbbbbbbbbb);");
6573 }
6574 
6575 TEST_F(FormatTest, UnderstandsEquals) {
6576   verifyFormat(
6577       "aaaaaaaaaaaaaaaaa =\n"
6578       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6579   verifyFormat(
6580       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6581       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
6582   verifyFormat(
6583       "if (a) {\n"
6584       "  f();\n"
6585       "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6586       "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
6587       "}");
6588 
6589   verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6590                "        100000000 + 10000000) {\n}");
6591 }
6592 
6593 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
6594   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
6595                "    .looooooooooooooooooooooooooooooooooooooongFunction();");
6596 
6597   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
6598                "    ->looooooooooooooooooooooooooooooooooooooongFunction();");
6599 
6600   verifyFormat(
6601       "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
6602       "                                                          Parameter2);");
6603 
6604   verifyFormat(
6605       "ShortObject->shortFunction(\n"
6606       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
6607       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
6608 
6609   verifyFormat("loooooooooooooongFunction(\n"
6610                "    LoooooooooooooongObject->looooooooooooooooongFunction());");
6611 
6612   verifyFormat(
6613       "function(LoooooooooooooooooooooooooooooooooooongObject\n"
6614       "             ->loooooooooooooooooooooooooooooooooooooooongFunction());");
6615 
6616   verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
6617                "    .WillRepeatedly(Return(SomeValue));");
6618   verifyFormat("void f() {\n"
6619                "  EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
6620                "      .Times(2)\n"
6621                "      .WillRepeatedly(Return(SomeValue));\n"
6622                "}");
6623   verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
6624                "    ccccccccccccccccccccccc);");
6625   verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6626                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6627                "          .aaaaa(aaaaa),\n"
6628                "      aaaaaaaaaaaaaaaaaaaaa);");
6629   verifyFormat("void f() {\n"
6630                "  aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6631                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
6632                "}");
6633   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6634                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6635                "    .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6636                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6637                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
6638   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6639                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6640                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6641                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
6642                "}");
6643 
6644   // Here, it is not necessary to wrap at "." or "->".
6645   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
6646                "    aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
6647   verifyFormat(
6648       "aaaaaaaaaaa->aaaaaaaaa(\n"
6649       "    aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6650       "    aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
6651 
6652   verifyFormat(
6653       "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6654       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
6655   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
6656                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
6657   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
6658                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
6659 
6660   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6661                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6662                "    .a();");
6663 
6664   FormatStyle NoBinPacking = getLLVMStyle();
6665   NoBinPacking.BinPackParameters = false;
6666   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
6667                "    .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
6668                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
6669                "                         aaaaaaaaaaaaaaaaaaa,\n"
6670                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6671                NoBinPacking);
6672 
6673   // If there is a subsequent call, change to hanging indentation.
6674   verifyFormat(
6675       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6676       "                         aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
6677       "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6678   verifyFormat(
6679       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6680       "    aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
6681   verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6682                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6683                "                 .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6684   verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6685                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6686                "               .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
6687 }
6688 
6689 TEST_F(FormatTest, WrapsTemplateDeclarations) {
6690   verifyFormat("template <typename T>\n"
6691                "virtual void loooooooooooongFunction(int Param1, int Param2);");
6692   verifyFormat("template <typename T>\n"
6693                "// T should be one of {A, B}.\n"
6694                "virtual void loooooooooooongFunction(int Param1, int Param2);");
6695   verifyFormat(
6696       "template <typename T>\n"
6697       "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
6698   verifyFormat("template <typename T>\n"
6699                "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
6700                "       int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
6701   verifyFormat(
6702       "template <typename T>\n"
6703       "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
6704       "                                      int Paaaaaaaaaaaaaaaaaaaaram2);");
6705   verifyFormat(
6706       "template <typename T>\n"
6707       "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
6708       "                    aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
6709       "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6710   verifyFormat("template <typename T>\n"
6711                "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6712                "    int aaaaaaaaaaaaaaaaaaaaaa);");
6713   verifyFormat(
6714       "template <typename T1, typename T2 = char, typename T3 = char,\n"
6715       "          typename T4 = char>\n"
6716       "void f();");
6717   verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
6718                "          template <typename> class cccccccccccccccccccccc,\n"
6719                "          typename ddddddddddddd>\n"
6720                "class C {};");
6721   verifyFormat(
6722       "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
6723       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6724 
6725   verifyFormat("void f() {\n"
6726                "  a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
6727                "      a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
6728                "}");
6729 
6730   verifyFormat("template <typename T> class C {};");
6731   verifyFormat("template <typename T> void f();");
6732   verifyFormat("template <typename T> void f() {}");
6733   verifyFormat(
6734       "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
6735       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6736       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
6737       "    new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
6738       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6739       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
6740       "        bbbbbbbbbbbbbbbbbbbbbbbb);",
6741       getLLVMStyleWithColumns(72));
6742   EXPECT_EQ("static_cast<A< //\n"
6743             "    B> *>(\n"
6744             "\n"
6745             ");",
6746             format("static_cast<A<//\n"
6747                    "    B>*>(\n"
6748                    "\n"
6749                    "    );"));
6750   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6751                "    const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
6752 
6753   FormatStyle AlwaysBreak = getLLVMStyle();
6754   AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
6755   verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
6756   verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
6757   verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
6758   verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6759                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
6760                "    ccccccccccccccccccccccccccccccccccccccccccccccc);");
6761   verifyFormat("template <template <typename> class Fooooooo,\n"
6762                "          template <typename> class Baaaaaaar>\n"
6763                "struct C {};",
6764                AlwaysBreak);
6765   verifyFormat("template <typename T> // T can be A, B or C.\n"
6766                "struct C {};",
6767                AlwaysBreak);
6768   verifyFormat("template <enum E> class A {\n"
6769                "public:\n"
6770                "  E *f();\n"
6771                "};");
6772 
6773   FormatStyle NeverBreak = getLLVMStyle();
6774   NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No;
6775   verifyFormat("template <typename T> class C {};", NeverBreak);
6776   verifyFormat("template <typename T> void f();", NeverBreak);
6777   verifyFormat("template <typename T> void f() {}", NeverBreak);
6778   verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa "
6779                "bbbbbbbbbbbbbbbbbbbb) {}",
6780                NeverBreak);
6781   verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6782                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
6783                "    ccccccccccccccccccccccccccccccccccccccccccccccc);",
6784                NeverBreak);
6785   verifyFormat("template <template <typename> class Fooooooo,\n"
6786                "          template <typename> class Baaaaaaar>\n"
6787                "struct C {};",
6788                NeverBreak);
6789   verifyFormat("template <typename T> // T can be A, B or C.\n"
6790                "struct C {};",
6791                NeverBreak);
6792   verifyFormat("template <enum E> class A {\n"
6793                "public:\n"
6794                "  E *f();\n"
6795                "};",
6796                NeverBreak);
6797   NeverBreak.PenaltyBreakTemplateDeclaration = 100;
6798   verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa "
6799                "bbbbbbbbbbbbbbbbbbbb) {}",
6800                NeverBreak);
6801 }
6802 
6803 TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) {
6804   FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
6805   Style.ColumnLimit = 60;
6806   EXPECT_EQ("// Baseline - no comments.\n"
6807             "template <\n"
6808             "    typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
6809             "void f() {}",
6810             format("// Baseline - no comments.\n"
6811                    "template <\n"
6812                    "    typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
6813                    "void f() {}",
6814                    Style));
6815 
6816   EXPECT_EQ("template <\n"
6817             "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  // trailing\n"
6818             "void f() {}",
6819             format("template <\n"
6820                    "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
6821                    "void f() {}",
6822                    Style));
6823 
6824   EXPECT_EQ(
6825       "template <\n"
6826       "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n"
6827       "void f() {}",
6828       format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  /* line */\n"
6829              "void f() {}",
6830              Style));
6831 
6832   EXPECT_EQ(
6833       "template <\n"
6834       "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  // trailing\n"
6835       "                                               // multiline\n"
6836       "void f() {}",
6837       format("template <\n"
6838              "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
6839              "                                              // multiline\n"
6840              "void f() {}",
6841              Style));
6842 
6843   EXPECT_EQ(
6844       "template <typename aaaaaaaaaa<\n"
6845       "    bbbbbbbbbbbb>::value>  // trailing loooong\n"
6846       "void f() {}",
6847       format(
6848           "template <\n"
6849           "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n"
6850           "void f() {}",
6851           Style));
6852 }
6853 
6854 TEST_F(FormatTest, WrapsTemplateParameters) {
6855   FormatStyle Style = getLLVMStyle();
6856   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
6857   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
6858   verifyFormat(
6859       "template <typename... a> struct q {};\n"
6860       "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
6861       "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
6862       "    y;",
6863       Style);
6864   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
6865   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
6866   verifyFormat(
6867       "template <typename... a> struct r {};\n"
6868       "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
6869       "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
6870       "    y;",
6871       Style);
6872   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
6873   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
6874   verifyFormat("template <typename... a> struct s {};\n"
6875                "extern s<\n"
6876                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
6877                "aaaaaaaaaaaaaaaaaaaaaa,\n"
6878                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
6879                "aaaaaaaaaaaaaaaaaaaaaa>\n"
6880                "    y;",
6881                Style);
6882   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
6883   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
6884   verifyFormat("template <typename... a> struct t {};\n"
6885                "extern t<\n"
6886                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
6887                "aaaaaaaaaaaaaaaaaaaaaa,\n"
6888                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
6889                "aaaaaaaaaaaaaaaaaaaaaa>\n"
6890                "    y;",
6891                Style);
6892 }
6893 
6894 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
6895   verifyFormat(
6896       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6897       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6898   verifyFormat(
6899       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6900       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6901       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
6902 
6903   // FIXME: Should we have the extra indent after the second break?
6904   verifyFormat(
6905       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6906       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6907       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6908 
6909   verifyFormat(
6910       "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
6911       "                    cccccccccccccccccccccccccccccccccccccccccccccc());");
6912 
6913   // Breaking at nested name specifiers is generally not desirable.
6914   verifyFormat(
6915       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6916       "    aaaaaaaaaaaaaaaaaaaaaaa);");
6917 
6918   verifyFormat("aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
6919                "                   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6920                "                       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6921                "                   aaaaaaaaaaaaaaaaaaaaa);",
6922                getLLVMStyleWithColumns(74));
6923 
6924   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6925                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6926                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6927 }
6928 
6929 TEST_F(FormatTest, UnderstandsTemplateParameters) {
6930   verifyFormat("A<int> a;");
6931   verifyFormat("A<A<A<int>>> a;");
6932   verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
6933   verifyFormat("bool x = a < 1 || 2 > a;");
6934   verifyFormat("bool x = 5 < f<int>();");
6935   verifyFormat("bool x = f<int>() > 5;");
6936   verifyFormat("bool x = 5 < a<int>::x;");
6937   verifyFormat("bool x = a < 4 ? a > 2 : false;");
6938   verifyFormat("bool x = f() ? a < 2 : a > 2;");
6939 
6940   verifyGoogleFormat("A<A<int>> a;");
6941   verifyGoogleFormat("A<A<A<int>>> a;");
6942   verifyGoogleFormat("A<A<A<A<int>>>> a;");
6943   verifyGoogleFormat("A<A<int> > a;");
6944   verifyGoogleFormat("A<A<A<int> > > a;");
6945   verifyGoogleFormat("A<A<A<A<int> > > > a;");
6946   verifyGoogleFormat("A<::A<int>> a;");
6947   verifyGoogleFormat("A<::A> a;");
6948   verifyGoogleFormat("A< ::A> a;");
6949   verifyGoogleFormat("A< ::A<int> > a;");
6950   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
6951   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
6952   EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
6953   EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
6954   EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
6955             format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
6956 
6957   verifyFormat("A<A<int>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
6958 
6959   // template closer followed by a token that starts with > or =
6960   verifyFormat("bool b = a<1> > 1;");
6961   verifyFormat("bool b = a<1> >= 1;");
6962   verifyFormat("int i = a<1> >> 1;");
6963   FormatStyle Style = getLLVMStyle();
6964   Style.SpaceBeforeAssignmentOperators = false;
6965   verifyFormat("bool b= a<1> == 1;", Style);
6966   verifyFormat("a<int> = 1;", Style);
6967   verifyFormat("a<int> >>= 1;", Style);
6968 
6969   verifyFormat("test >> a >> b;");
6970   verifyFormat("test << a >> b;");
6971 
6972   verifyFormat("f<int>();");
6973   verifyFormat("template <typename T> void f() {}");
6974   verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
6975   verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
6976                "sizeof(char)>::type>;");
6977   verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
6978   verifyFormat("f(a.operator()<A>());");
6979   verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6980                "      .template operator()<A>());",
6981                getLLVMStyleWithColumns(35));
6982 
6983   // Not template parameters.
6984   verifyFormat("return a < b && c > d;");
6985   verifyFormat("void f() {\n"
6986                "  while (a < b && c > d) {\n"
6987                "  }\n"
6988                "}");
6989   verifyFormat("template <typename... Types>\n"
6990                "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
6991 
6992   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6993                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
6994                getLLVMStyleWithColumns(60));
6995   verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
6996   verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
6997   verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
6998 }
6999 
7000 TEST_F(FormatTest, BitshiftOperatorWidth) {
7001   EXPECT_EQ("int a = 1 << 2; /* foo\n"
7002             "                   bar */",
7003             format("int    a=1<<2;  /* foo\n"
7004                    "                   bar */"));
7005 
7006   EXPECT_EQ("int b = 256 >> 1; /* foo\n"
7007             "                     bar */",
7008             format("int  b  =256>>1 ;  /* foo\n"
7009                    "                      bar */"));
7010 }
7011 
7012 TEST_F(FormatTest, UnderstandsBinaryOperators) {
7013   verifyFormat("COMPARE(a, ==, b);");
7014   verifyFormat("auto s = sizeof...(Ts) - 1;");
7015 }
7016 
7017 TEST_F(FormatTest, UnderstandsPointersToMembers) {
7018   verifyFormat("int A::*x;");
7019   verifyFormat("int (S::*func)(void *);");
7020   verifyFormat("void f() { int (S::*func)(void *); }");
7021   verifyFormat("typedef bool *(Class::*Member)() const;");
7022   verifyFormat("void f() {\n"
7023                "  (a->*f)();\n"
7024                "  a->*x;\n"
7025                "  (a.*f)();\n"
7026                "  ((*a).*f)();\n"
7027                "  a.*x;\n"
7028                "}");
7029   verifyFormat("void f() {\n"
7030                "  (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
7031                "      aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
7032                "}");
7033   verifyFormat(
7034       "(aaaaaaaaaa->*bbbbbbb)(\n"
7035       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
7036   FormatStyle Style = getLLVMStyle();
7037   Style.PointerAlignment = FormatStyle::PAS_Left;
7038   verifyFormat("typedef bool* (Class::*Member)() const;", Style);
7039 }
7040 
7041 TEST_F(FormatTest, UnderstandsUnaryOperators) {
7042   verifyFormat("int a = -2;");
7043   verifyFormat("f(-1, -2, -3);");
7044   verifyFormat("a[-1] = 5;");
7045   verifyFormat("int a = 5 + -2;");
7046   verifyFormat("if (i == -1) {\n}");
7047   verifyFormat("if (i != -1) {\n}");
7048   verifyFormat("if (i > -1) {\n}");
7049   verifyFormat("if (i < -1) {\n}");
7050   verifyFormat("++(a->f());");
7051   verifyFormat("--(a->f());");
7052   verifyFormat("(a->f())++;");
7053   verifyFormat("a[42]++;");
7054   verifyFormat("if (!(a->f())) {\n}");
7055   verifyFormat("if (!+i) {\n}");
7056   verifyFormat("~&a;");
7057 
7058   verifyFormat("a-- > b;");
7059   verifyFormat("b ? -a : c;");
7060   verifyFormat("n * sizeof char16;");
7061   verifyFormat("n * alignof char16;", getGoogleStyle());
7062   verifyFormat("sizeof(char);");
7063   verifyFormat("alignof(char);", getGoogleStyle());
7064 
7065   verifyFormat("return -1;");
7066   verifyFormat("throw -1;");
7067   verifyFormat("switch (a) {\n"
7068                "case -1:\n"
7069                "  break;\n"
7070                "}");
7071   verifyFormat("#define X -1");
7072   verifyFormat("#define X -kConstant");
7073 
7074   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
7075   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
7076 
7077   verifyFormat("int a = /* confusing comment */ -1;");
7078   // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
7079   verifyFormat("int a = i /* confusing comment */++;");
7080 
7081   verifyFormat("co_yield -1;");
7082   verifyFormat("co_return -1;");
7083 }
7084 
7085 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
7086   verifyFormat("if (!aaaaaaaaaa( // break\n"
7087                "        aaaaa)) {\n"
7088                "}");
7089   verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
7090                "    aaaaa));");
7091   verifyFormat("*aaa = aaaaaaa( // break\n"
7092                "    bbbbbb);");
7093 }
7094 
7095 TEST_F(FormatTest, UnderstandsOverloadedOperators) {
7096   verifyFormat("bool operator<();");
7097   verifyFormat("bool operator>();");
7098   verifyFormat("bool operator=();");
7099   verifyFormat("bool operator==();");
7100   verifyFormat("bool operator!=();");
7101   verifyFormat("int operator+();");
7102   verifyFormat("int operator++();");
7103   verifyFormat("int operator++(int) volatile noexcept;");
7104   verifyFormat("bool operator,();");
7105   verifyFormat("bool operator();");
7106   verifyFormat("bool operator()();");
7107   verifyFormat("bool operator[]();");
7108   verifyFormat("operator bool();");
7109   verifyFormat("operator int();");
7110   verifyFormat("operator void *();");
7111   verifyFormat("operator SomeType<int>();");
7112   verifyFormat("operator SomeType<int, int>();");
7113   verifyFormat("operator SomeType<SomeType<int>>();");
7114   verifyFormat("void *operator new(std::size_t size);");
7115   verifyFormat("void *operator new[](std::size_t size);");
7116   verifyFormat("void operator delete(void *ptr);");
7117   verifyFormat("void operator delete[](void *ptr);");
7118   verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
7119                "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
7120   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
7121                "    aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
7122 
7123   verifyFormat(
7124       "ostream &operator<<(ostream &OutputStream,\n"
7125       "                    SomeReallyLongType WithSomeReallyLongValue);");
7126   verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
7127                "               const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
7128                "  return left.group < right.group;\n"
7129                "}");
7130   verifyFormat("SomeType &operator=(const SomeType &S);");
7131   verifyFormat("f.template operator()<int>();");
7132 
7133   verifyGoogleFormat("operator void*();");
7134   verifyGoogleFormat("operator SomeType<SomeType<int>>();");
7135   verifyGoogleFormat("operator ::A();");
7136 
7137   verifyFormat("using A::operator+;");
7138   verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
7139                "int i;");
7140 }
7141 
7142 TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
7143   verifyFormat("Deleted &operator=(const Deleted &) & = default;");
7144   verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
7145   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
7146   verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
7147   verifyFormat("Deleted &operator=(const Deleted &) &;");
7148   verifyFormat("Deleted &operator=(const Deleted &) &&;");
7149   verifyFormat("SomeType MemberFunction(const Deleted &) &;");
7150   verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
7151   verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
7152   verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
7153   verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
7154   verifyFormat("void Fn(T const &) const &;");
7155   verifyFormat("void Fn(T const volatile &&) const volatile &&;");
7156   verifyFormat("template <typename T>\n"
7157                "void F(T) && = delete;",
7158                getGoogleStyle());
7159 
7160   FormatStyle AlignLeft = getLLVMStyle();
7161   AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
7162   verifyFormat("void A::b() && {}", AlignLeft);
7163   verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
7164   verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
7165                AlignLeft);
7166   verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
7167   verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
7168   verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
7169   verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
7170   verifyFormat("auto Function(T) & -> void {}", AlignLeft);
7171   verifyFormat("auto Function(T) & -> void;", AlignLeft);
7172   verifyFormat("void Fn(T const&) const&;", AlignLeft);
7173   verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
7174 
7175   FormatStyle Spaces = getLLVMStyle();
7176   Spaces.SpacesInCStyleCastParentheses = true;
7177   verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
7178   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
7179   verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
7180   verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
7181 
7182   Spaces.SpacesInCStyleCastParentheses = false;
7183   Spaces.SpacesInParentheses = true;
7184   verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
7185   verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;",
7186                Spaces);
7187   verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
7188   verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
7189 
7190   FormatStyle BreakTemplate = getLLVMStyle();
7191   BreakTemplate.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
7192 
7193   verifyFormat("struct f {\n"
7194                "  template <class T>\n"
7195                "  int &foo(const std::string &str) &noexcept {}\n"
7196                "};",
7197                BreakTemplate);
7198 
7199   verifyFormat("struct f {\n"
7200                "  template <class T>\n"
7201                "  int &foo(const std::string &str) &&noexcept {}\n"
7202                "};",
7203                BreakTemplate);
7204 
7205   verifyFormat("struct f {\n"
7206                "  template <class T>\n"
7207                "  int &foo(const std::string &str) const &noexcept {}\n"
7208                "};",
7209                BreakTemplate);
7210 
7211   verifyFormat("struct f {\n"
7212                "  template <class T>\n"
7213                "  int &foo(const std::string &str) const &noexcept {}\n"
7214                "};",
7215                BreakTemplate);
7216 
7217   verifyFormat("struct f {\n"
7218                "  template <class T>\n"
7219                "  auto foo(const std::string &str) &&noexcept -> int & {}\n"
7220                "};",
7221                BreakTemplate);
7222 
7223   FormatStyle AlignLeftBreakTemplate = getLLVMStyle();
7224   AlignLeftBreakTemplate.AlwaysBreakTemplateDeclarations =
7225       FormatStyle::BTDS_Yes;
7226   AlignLeftBreakTemplate.PointerAlignment = FormatStyle::PAS_Left;
7227 
7228   verifyFormat("struct f {\n"
7229                "  template <class T>\n"
7230                "  int& foo(const std::string& str) & noexcept {}\n"
7231                "};",
7232                AlignLeftBreakTemplate);
7233 
7234   verifyFormat("struct f {\n"
7235                "  template <class T>\n"
7236                "  int& foo(const std::string& str) && noexcept {}\n"
7237                "};",
7238                AlignLeftBreakTemplate);
7239 
7240   verifyFormat("struct f {\n"
7241                "  template <class T>\n"
7242                "  int& foo(const std::string& str) const& noexcept {}\n"
7243                "};",
7244                AlignLeftBreakTemplate);
7245 
7246   verifyFormat("struct f {\n"
7247                "  template <class T>\n"
7248                "  int& foo(const std::string& str) const&& noexcept {}\n"
7249                "};",
7250                AlignLeftBreakTemplate);
7251 
7252   verifyFormat("struct f {\n"
7253                "  template <class T>\n"
7254                "  auto foo(const std::string& str) && noexcept -> int& {}\n"
7255                "};",
7256                AlignLeftBreakTemplate);
7257 
7258   // The `&` in `Type&` should not be confused with a trailing `&` of
7259   // DEPRECATED(reason) member function.
7260   verifyFormat("struct f {\n"
7261                "  template <class T>\n"
7262                "  DEPRECATED(reason)\n"
7263                "  Type &foo(arguments) {}\n"
7264                "};",
7265                BreakTemplate);
7266 
7267   verifyFormat("struct f {\n"
7268                "  template <class T>\n"
7269                "  DEPRECATED(reason)\n"
7270                "  Type& foo(arguments) {}\n"
7271                "};",
7272                AlignLeftBreakTemplate);
7273 
7274   verifyFormat("void (*foopt)(int) = &func;");
7275 }
7276 
7277 TEST_F(FormatTest, UnderstandsNewAndDelete) {
7278   verifyFormat("void f() {\n"
7279                "  A *a = new A;\n"
7280                "  A *a = new (placement) A;\n"
7281                "  delete a;\n"
7282                "  delete (A *)a;\n"
7283                "}");
7284   verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
7285                "    typename aaaaaaaaaaaaaaaaaaaaaaaa();");
7286   verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7287                "    new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
7288                "        typename aaaaaaaaaaaaaaaaaaaaaaaa();");
7289   verifyFormat("delete[] h->p;");
7290 }
7291 
7292 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
7293   verifyFormat("int *f(int *a) {}");
7294   verifyFormat("int main(int argc, char **argv) {}");
7295   verifyFormat("Test::Test(int b) : a(b * b) {}");
7296   verifyIndependentOfContext("f(a, *a);");
7297   verifyFormat("void g() { f(*a); }");
7298   verifyIndependentOfContext("int a = b * 10;");
7299   verifyIndependentOfContext("int a = 10 * b;");
7300   verifyIndependentOfContext("int a = b * c;");
7301   verifyIndependentOfContext("int a += b * c;");
7302   verifyIndependentOfContext("int a -= b * c;");
7303   verifyIndependentOfContext("int a *= b * c;");
7304   verifyIndependentOfContext("int a /= b * c;");
7305   verifyIndependentOfContext("int a = *b;");
7306   verifyIndependentOfContext("int a = *b * c;");
7307   verifyIndependentOfContext("int a = b * *c;");
7308   verifyIndependentOfContext("int a = b * (10);");
7309   verifyIndependentOfContext("S << b * (10);");
7310   verifyIndependentOfContext("return 10 * b;");
7311   verifyIndependentOfContext("return *b * *c;");
7312   verifyIndependentOfContext("return a & ~b;");
7313   verifyIndependentOfContext("f(b ? *c : *d);");
7314   verifyIndependentOfContext("int a = b ? *c : *d;");
7315   verifyIndependentOfContext("*b = a;");
7316   verifyIndependentOfContext("a * ~b;");
7317   verifyIndependentOfContext("a * !b;");
7318   verifyIndependentOfContext("a * +b;");
7319   verifyIndependentOfContext("a * -b;");
7320   verifyIndependentOfContext("a * ++b;");
7321   verifyIndependentOfContext("a * --b;");
7322   verifyIndependentOfContext("a[4] * b;");
7323   verifyIndependentOfContext("a[a * a] = 1;");
7324   verifyIndependentOfContext("f() * b;");
7325   verifyIndependentOfContext("a * [self dostuff];");
7326   verifyIndependentOfContext("int x = a * (a + b);");
7327   verifyIndependentOfContext("(a *)(a + b);");
7328   verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
7329   verifyIndependentOfContext("int *pa = (int *)&a;");
7330   verifyIndependentOfContext("return sizeof(int **);");
7331   verifyIndependentOfContext("return sizeof(int ******);");
7332   verifyIndependentOfContext("return (int **&)a;");
7333   verifyIndependentOfContext("f((*PointerToArray)[10]);");
7334   verifyFormat("void f(Type (*parameter)[10]) {}");
7335   verifyFormat("void f(Type (&parameter)[10]) {}");
7336   verifyGoogleFormat("return sizeof(int**);");
7337   verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
7338   verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
7339   verifyFormat("auto a = [](int **&, int ***) {};");
7340   verifyFormat("auto PointerBinding = [](const char *S) {};");
7341   verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
7342   verifyFormat("[](const decltype(*a) &value) {}");
7343   verifyFormat("decltype(a * b) F();");
7344   verifyFormat("#define MACRO() [](A *a) { return 1; }");
7345   verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
7346   verifyIndependentOfContext("typedef void (*f)(int *a);");
7347   verifyIndependentOfContext("int i{a * b};");
7348   verifyIndependentOfContext("aaa && aaa->f();");
7349   verifyIndependentOfContext("int x = ~*p;");
7350   verifyFormat("Constructor() : a(a), area(width * height) {}");
7351   verifyFormat("Constructor() : a(a), area(a, width * height) {}");
7352   verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
7353   verifyFormat("void f() { f(a, c * d); }");
7354   verifyFormat("void f() { f(new a(), c * d); }");
7355   verifyFormat("void f(const MyOverride &override);");
7356   verifyFormat("void f(const MyFinal &final);");
7357   verifyIndependentOfContext("bool a = f() && override.f();");
7358   verifyIndependentOfContext("bool a = f() && final.f();");
7359 
7360   verifyIndependentOfContext("InvalidRegions[*R] = 0;");
7361 
7362   verifyIndependentOfContext("A<int *> a;");
7363   verifyIndependentOfContext("A<int **> a;");
7364   verifyIndependentOfContext("A<int *, int *> a;");
7365   verifyIndependentOfContext("A<int *[]> a;");
7366   verifyIndependentOfContext(
7367       "const char *const p = reinterpret_cast<const char *const>(q);");
7368   verifyIndependentOfContext("A<int **, int **> a;");
7369   verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
7370   verifyFormat("for (char **a = b; *a; ++a) {\n}");
7371   verifyFormat("for (; a && b;) {\n}");
7372   verifyFormat("bool foo = true && [] { return false; }();");
7373 
7374   verifyFormat(
7375       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7376       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7377 
7378   verifyGoogleFormat("int const* a = &b;");
7379   verifyGoogleFormat("**outparam = 1;");
7380   verifyGoogleFormat("*outparam = a * b;");
7381   verifyGoogleFormat("int main(int argc, char** argv) {}");
7382   verifyGoogleFormat("A<int*> a;");
7383   verifyGoogleFormat("A<int**> a;");
7384   verifyGoogleFormat("A<int*, int*> a;");
7385   verifyGoogleFormat("A<int**, int**> a;");
7386   verifyGoogleFormat("f(b ? *c : *d);");
7387   verifyGoogleFormat("int a = b ? *c : *d;");
7388   verifyGoogleFormat("Type* t = **x;");
7389   verifyGoogleFormat("Type* t = *++*x;");
7390   verifyGoogleFormat("*++*x;");
7391   verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
7392   verifyGoogleFormat("Type* t = x++ * y;");
7393   verifyGoogleFormat(
7394       "const char* const p = reinterpret_cast<const char* const>(q);");
7395   verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
7396   verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
7397   verifyGoogleFormat("template <typename T>\n"
7398                      "void f(int i = 0, SomeType** temps = NULL);");
7399 
7400   FormatStyle Left = getLLVMStyle();
7401   Left.PointerAlignment = FormatStyle::PAS_Left;
7402   verifyFormat("x = *a(x) = *a(y);", Left);
7403   verifyFormat("for (;; *a = b) {\n}", Left);
7404   verifyFormat("return *this += 1;", Left);
7405   verifyFormat("throw *x;", Left);
7406   verifyFormat("delete *x;", Left);
7407   verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
7408   verifyFormat("[](const decltype(*a)* ptr) {}", Left);
7409   verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
7410   verifyFormat("auto x(A&&, B&&, C&&) -> D;", Left);
7411   verifyFormat("auto x = [](A&&, B&&, C&&) -> D {};", Left);
7412   verifyFormat("template <class T> X(T&&, T&&, T&&) -> X<T>;", Left);
7413 
7414   verifyIndependentOfContext("a = *(x + y);");
7415   verifyIndependentOfContext("a = &(x + y);");
7416   verifyIndependentOfContext("*(x + y).call();");
7417   verifyIndependentOfContext("&(x + y)->call();");
7418   verifyFormat("void f() { &(*I).first; }");
7419 
7420   verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
7421   verifyFormat(
7422       "int *MyValues = {\n"
7423       "    *A, // Operator detection might be confused by the '{'\n"
7424       "    *BB // Operator detection might be confused by previous comment\n"
7425       "};");
7426 
7427   verifyIndependentOfContext("if (int *a = &b)");
7428   verifyIndependentOfContext("if (int &a = *b)");
7429   verifyIndependentOfContext("if (a & b[i])");
7430   verifyIndependentOfContext("if constexpr (a & b[i])");
7431   verifyIndependentOfContext("if CONSTEXPR (a & b[i])");
7432   verifyIndependentOfContext("if (a * (b * c))");
7433   verifyIndependentOfContext("if constexpr (a * (b * c))");
7434   verifyIndependentOfContext("if CONSTEXPR (a * (b * c))");
7435   verifyIndependentOfContext("if (a::b::c::d & b[i])");
7436   verifyIndependentOfContext("if (*b[i])");
7437   verifyIndependentOfContext("if (int *a = (&b))");
7438   verifyIndependentOfContext("while (int *a = &b)");
7439   verifyIndependentOfContext("while (a * (b * c))");
7440   verifyIndependentOfContext("size = sizeof *a;");
7441   verifyIndependentOfContext("if (a && (b = c))");
7442   verifyFormat("void f() {\n"
7443                "  for (const int &v : Values) {\n"
7444                "  }\n"
7445                "}");
7446   verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
7447   verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
7448   verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
7449 
7450   verifyFormat("#define A (!a * b)");
7451   verifyFormat("#define MACRO     \\\n"
7452                "  int *i = a * b; \\\n"
7453                "  void f(a *b);",
7454                getLLVMStyleWithColumns(19));
7455 
7456   verifyIndependentOfContext("A = new SomeType *[Length];");
7457   verifyIndependentOfContext("A = new SomeType *[Length]();");
7458   verifyIndependentOfContext("T **t = new T *;");
7459   verifyIndependentOfContext("T **t = new T *();");
7460   verifyGoogleFormat("A = new SomeType*[Length]();");
7461   verifyGoogleFormat("A = new SomeType*[Length];");
7462   verifyGoogleFormat("T** t = new T*;");
7463   verifyGoogleFormat("T** t = new T*();");
7464 
7465   verifyFormat("STATIC_ASSERT((a & b) == 0);");
7466   verifyFormat("STATIC_ASSERT(0 == (a & b));");
7467   verifyFormat("template <bool a, bool b> "
7468                "typename t::if<x && y>::type f() {}");
7469   verifyFormat("template <int *y> f() {}");
7470   verifyFormat("vector<int *> v;");
7471   verifyFormat("vector<int *const> v;");
7472   verifyFormat("vector<int *const **const *> v;");
7473   verifyFormat("vector<int *volatile> v;");
7474   verifyFormat("vector<a * b> v;");
7475   verifyFormat("foo<b && false>();");
7476   verifyFormat("foo<b & 1>();");
7477   verifyFormat("decltype(*::std::declval<const T &>()) void F();");
7478   verifyFormat(
7479       "template <class T, class = typename std::enable_if<\n"
7480       "                       std::is_integral<T>::value &&\n"
7481       "                       (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
7482       "void F();",
7483       getLLVMStyleWithColumns(70));
7484   verifyFormat("template <class T,\n"
7485                "          class = typename std::enable_if<\n"
7486                "              std::is_integral<T>::value &&\n"
7487                "              (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
7488                "          class U>\n"
7489                "void F();",
7490                getLLVMStyleWithColumns(70));
7491   verifyFormat(
7492       "template <class T,\n"
7493       "          class = typename ::std::enable_if<\n"
7494       "              ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
7495       "void F();",
7496       getGoogleStyleWithColumns(68));
7497 
7498   verifyIndependentOfContext("MACRO(int *i);");
7499   verifyIndependentOfContext("MACRO(auto *a);");
7500   verifyIndependentOfContext("MACRO(const A *a);");
7501   verifyIndependentOfContext("MACRO(A *const a);");
7502   verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
7503   verifyFormat("void f() { f(float{1}, a * a); }");
7504   // FIXME: Is there a way to make this work?
7505   // verifyIndependentOfContext("MACRO(A *a);");
7506 
7507   verifyFormat("DatumHandle const *operator->() const { return input_; }");
7508   verifyFormat("return options != nullptr && operator==(*options);");
7509 
7510   EXPECT_EQ("#define OP(x)                                    \\\n"
7511             "  ostream &operator<<(ostream &s, const A &a) {  \\\n"
7512             "    return s << a.DebugString();                 \\\n"
7513             "  }",
7514             format("#define OP(x) \\\n"
7515                    "  ostream &operator<<(ostream &s, const A &a) { \\\n"
7516                    "    return s << a.DebugString(); \\\n"
7517                    "  }",
7518                    getLLVMStyleWithColumns(50)));
7519 
7520   // FIXME: We cannot handle this case yet; we might be able to figure out that
7521   // foo<x> d > v; doesn't make sense.
7522   verifyFormat("foo<a<b && c> d> v;");
7523 
7524   FormatStyle PointerMiddle = getLLVMStyle();
7525   PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
7526   verifyFormat("delete *x;", PointerMiddle);
7527   verifyFormat("int * x;", PointerMiddle);
7528   verifyFormat("int *[] x;", PointerMiddle);
7529   verifyFormat("template <int * y> f() {}", PointerMiddle);
7530   verifyFormat("int * f(int * a) {}", PointerMiddle);
7531   verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
7532   verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
7533   verifyFormat("A<int *> a;", PointerMiddle);
7534   verifyFormat("A<int **> a;", PointerMiddle);
7535   verifyFormat("A<int *, int *> a;", PointerMiddle);
7536   verifyFormat("A<int *[]> a;", PointerMiddle);
7537   verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
7538   verifyFormat("A = new SomeType *[Length];", PointerMiddle);
7539   verifyFormat("T ** t = new T *;", PointerMiddle);
7540 
7541   // Member function reference qualifiers aren't binary operators.
7542   verifyFormat("string // break\n"
7543                "operator()() & {}");
7544   verifyFormat("string // break\n"
7545                "operator()() && {}");
7546   verifyGoogleFormat("template <typename T>\n"
7547                      "auto x() & -> int {}");
7548 }
7549 
7550 TEST_F(FormatTest, UnderstandsAttributes) {
7551   verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
7552   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
7553                "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
7554   FormatStyle AfterType = getLLVMStyle();
7555   AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
7556   verifyFormat("__attribute__((nodebug)) void\n"
7557                "foo() {}\n",
7558                AfterType);
7559 }
7560 
7561 TEST_F(FormatTest, UnderstandsSquareAttributes) {
7562   verifyFormat("SomeType s [[unused]] (InitValue);");
7563   verifyFormat("SomeType s [[gnu::unused]] (InitValue);");
7564   verifyFormat("SomeType s [[using gnu: unused]] (InitValue);");
7565   verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}");
7566   verifyFormat("void f() [[deprecated(\"so sorry\")]];");
7567   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7568                "    [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);");
7569 
7570   // Make sure we do not mistake attributes for array subscripts.
7571   verifyFormat("int a() {}\n"
7572                "[[unused]] int b() {}\n");
7573   verifyFormat("NSArray *arr;\n"
7574                "arr[[Foo() bar]];");
7575 
7576   // On the other hand, we still need to correctly find array subscripts.
7577   verifyFormat("int a = std::vector<int>{1, 2, 3}[0];");
7578 
7579   // Make sure that we do not mistake Objective-C method inside array literals
7580   // as attributes, even if those method names are also keywords.
7581   verifyFormat("@[ [foo bar] ];");
7582   verifyFormat("@[ [NSArray class] ];");
7583   verifyFormat("@[ [foo enum] ];");
7584 
7585   // Make sure we do not parse attributes as lambda introducers.
7586   FormatStyle MultiLineFunctions = getLLVMStyle();
7587   MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
7588   verifyFormat("[[unused]] int b() {\n"
7589                "  return 42;\n"
7590                "}\n",
7591                MultiLineFunctions);
7592 }
7593 
7594 TEST_F(FormatTest, UnderstandsEllipsis) {
7595   verifyFormat("int printf(const char *fmt, ...);");
7596   verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
7597   verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
7598 
7599   FormatStyle PointersLeft = getLLVMStyle();
7600   PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
7601   verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
7602 }
7603 
7604 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
7605   EXPECT_EQ("int *a;\n"
7606             "int *a;\n"
7607             "int *a;",
7608             format("int *a;\n"
7609                    "int* a;\n"
7610                    "int *a;",
7611                    getGoogleStyle()));
7612   EXPECT_EQ("int* a;\n"
7613             "int* a;\n"
7614             "int* a;",
7615             format("int* a;\n"
7616                    "int* a;\n"
7617                    "int *a;",
7618                    getGoogleStyle()));
7619   EXPECT_EQ("int *a;\n"
7620             "int *a;\n"
7621             "int *a;",
7622             format("int *a;\n"
7623                    "int * a;\n"
7624                    "int *  a;",
7625                    getGoogleStyle()));
7626   EXPECT_EQ("auto x = [] {\n"
7627             "  int *a;\n"
7628             "  int *a;\n"
7629             "  int *a;\n"
7630             "};",
7631             format("auto x=[]{int *a;\n"
7632                    "int * a;\n"
7633                    "int *  a;};",
7634                    getGoogleStyle()));
7635 }
7636 
7637 TEST_F(FormatTest, UnderstandsRvalueReferences) {
7638   verifyFormat("int f(int &&a) {}");
7639   verifyFormat("int f(int a, char &&b) {}");
7640   verifyFormat("void f() { int &&a = b; }");
7641   verifyGoogleFormat("int f(int a, char&& b) {}");
7642   verifyGoogleFormat("void f() { int&& a = b; }");
7643 
7644   verifyIndependentOfContext("A<int &&> a;");
7645   verifyIndependentOfContext("A<int &&, int &&> a;");
7646   verifyGoogleFormat("A<int&&> a;");
7647   verifyGoogleFormat("A<int&&, int&&> a;");
7648 
7649   // Not rvalue references:
7650   verifyFormat("template <bool B, bool C> class A {\n"
7651                "  static_assert(B && C, \"Something is wrong\");\n"
7652                "};");
7653   verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
7654   verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
7655   verifyFormat("#define A(a, b) (a && b)");
7656 }
7657 
7658 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
7659   verifyFormat("void f() {\n"
7660                "  x[aaaaaaaaa -\n"
7661                "    b] = 23;\n"
7662                "}",
7663                getLLVMStyleWithColumns(15));
7664 }
7665 
7666 TEST_F(FormatTest, FormatsCasts) {
7667   verifyFormat("Type *A = static_cast<Type *>(P);");
7668   verifyFormat("Type *A = (Type *)P;");
7669   verifyFormat("Type *A = (vector<Type *, int *>)P;");
7670   verifyFormat("int a = (int)(2.0f);");
7671   verifyFormat("int a = (int)2.0f;");
7672   verifyFormat("x[(int32)y];");
7673   verifyFormat("x = (int32)y;");
7674   verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
7675   verifyFormat("int a = (int)*b;");
7676   verifyFormat("int a = (int)2.0f;");
7677   verifyFormat("int a = (int)~0;");
7678   verifyFormat("int a = (int)++a;");
7679   verifyFormat("int a = (int)sizeof(int);");
7680   verifyFormat("int a = (int)+2;");
7681   verifyFormat("my_int a = (my_int)2.0f;");
7682   verifyFormat("my_int a = (my_int)sizeof(int);");
7683   verifyFormat("return (my_int)aaa;");
7684   verifyFormat("#define x ((int)-1)");
7685   verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
7686   verifyFormat("#define p(q) ((int *)&q)");
7687   verifyFormat("fn(a)(b) + 1;");
7688 
7689   verifyFormat("void f() { my_int a = (my_int)*b; }");
7690   verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
7691   verifyFormat("my_int a = (my_int)~0;");
7692   verifyFormat("my_int a = (my_int)++a;");
7693   verifyFormat("my_int a = (my_int)-2;");
7694   verifyFormat("my_int a = (my_int)1;");
7695   verifyFormat("my_int a = (my_int *)1;");
7696   verifyFormat("my_int a = (const my_int)-1;");
7697   verifyFormat("my_int a = (const my_int *)-1;");
7698   verifyFormat("my_int a = (my_int)(my_int)-1;");
7699   verifyFormat("my_int a = (ns::my_int)-2;");
7700   verifyFormat("case (my_int)ONE:");
7701   verifyFormat("auto x = (X)this;");
7702   // Casts in Obj-C style calls used to not be recognized as such.
7703   verifyFormat("int a = [(type*)[((type*)val) arg] arg];", getGoogleStyle());
7704 
7705   // FIXME: single value wrapped with paren will be treated as cast.
7706   verifyFormat("void f(int i = (kValue)*kMask) {}");
7707 
7708   verifyFormat("{ (void)F; }");
7709 
7710   // Don't break after a cast's
7711   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7712                "    (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
7713                "                                   bbbbbbbbbbbbbbbbbbbbbb);");
7714 
7715   // These are not casts.
7716   verifyFormat("void f(int *) {}");
7717   verifyFormat("f(foo)->b;");
7718   verifyFormat("f(foo).b;");
7719   verifyFormat("f(foo)(b);");
7720   verifyFormat("f(foo)[b];");
7721   verifyFormat("[](foo) { return 4; }(bar);");
7722   verifyFormat("(*funptr)(foo)[4];");
7723   verifyFormat("funptrs[4](foo)[4];");
7724   verifyFormat("void f(int *);");
7725   verifyFormat("void f(int *) = 0;");
7726   verifyFormat("void f(SmallVector<int>) {}");
7727   verifyFormat("void f(SmallVector<int>);");
7728   verifyFormat("void f(SmallVector<int>) = 0;");
7729   verifyFormat("void f(int i = (kA * kB) & kMask) {}");
7730   verifyFormat("int a = sizeof(int) * b;");
7731   verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
7732   verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
7733   verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
7734   verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
7735 
7736   // These are not casts, but at some point were confused with casts.
7737   verifyFormat("virtual void foo(int *) override;");
7738   verifyFormat("virtual void foo(char &) const;");
7739   verifyFormat("virtual void foo(int *a, char *) const;");
7740   verifyFormat("int a = sizeof(int *) + b;");
7741   verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
7742   verifyFormat("bool b = f(g<int>) && c;");
7743   verifyFormat("typedef void (*f)(int i) func;");
7744   verifyFormat("void operator++(int) noexcept;");
7745   verifyFormat("void operator++(int &) noexcept;");
7746   verifyFormat("void operator delete(void *, std::size_t, const std::nothrow_t "
7747                "&) noexcept;");
7748   verifyFormat(
7749       "void operator delete(std::size_t, const std::nothrow_t &) noexcept;");
7750   verifyFormat("void operator delete(const std::nothrow_t &) noexcept;");
7751   verifyFormat("void operator delete(std::nothrow_t &) noexcept;");
7752   verifyFormat("void operator delete(nothrow_t &) noexcept;");
7753   verifyFormat("void operator delete(foo &) noexcept;");
7754   verifyFormat("void operator delete(foo) noexcept;");
7755   verifyFormat("void operator delete(int) noexcept;");
7756   verifyFormat("void operator delete(int &) noexcept;");
7757   verifyFormat("void operator delete(int &) volatile noexcept;");
7758   verifyFormat("void operator delete(int &) const");
7759   verifyFormat("void operator delete(int &) = default");
7760   verifyFormat("void operator delete(int &) = delete");
7761   verifyFormat("void operator delete(int &) [[noreturn]]");
7762   verifyFormat("void operator delete(int &) throw();");
7763   verifyFormat("void operator delete(int &) throw(int);");
7764   verifyFormat("auto operator delete(int &) -> int;");
7765   verifyFormat("auto operator delete(int &) override");
7766   verifyFormat("auto operator delete(int &) final");
7767 
7768   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
7769                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
7770   // FIXME: The indentation here is not ideal.
7771   verifyFormat(
7772       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7773       "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
7774       "        [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
7775 }
7776 
7777 TEST_F(FormatTest, FormatsFunctionTypes) {
7778   verifyFormat("A<bool()> a;");
7779   verifyFormat("A<SomeType()> a;");
7780   verifyFormat("A<void (*)(int, std::string)> a;");
7781   verifyFormat("A<void *(int)>;");
7782   verifyFormat("void *(*a)(int *, SomeType *);");
7783   verifyFormat("int (*func)(void *);");
7784   verifyFormat("void f() { int (*func)(void *); }");
7785   verifyFormat("template <class CallbackClass>\n"
7786                "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
7787 
7788   verifyGoogleFormat("A<void*(int*, SomeType*)>;");
7789   verifyGoogleFormat("void* (*a)(int);");
7790   verifyGoogleFormat(
7791       "template <class CallbackClass>\n"
7792       "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
7793 
7794   // Other constructs can look somewhat like function types:
7795   verifyFormat("A<sizeof(*x)> a;");
7796   verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
7797   verifyFormat("some_var = function(*some_pointer_var)[0];");
7798   verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
7799   verifyFormat("int x = f(&h)();");
7800   verifyFormat("returnsFunction(&param1, &param2)(param);");
7801   verifyFormat("std::function<\n"
7802                "    LooooooooooongTemplatedType<\n"
7803                "        SomeType>*(\n"
7804                "        LooooooooooooooooongType type)>\n"
7805                "    function;",
7806                getGoogleStyleWithColumns(40));
7807 }
7808 
7809 TEST_F(FormatTest, FormatsPointersToArrayTypes) {
7810   verifyFormat("A (*foo_)[6];");
7811   verifyFormat("vector<int> (*foo_)[6];");
7812 }
7813 
7814 TEST_F(FormatTest, BreaksLongVariableDeclarations) {
7815   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7816                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
7817   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
7818                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
7819   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7820                "    *LoooooooooooooooooooooooooooooooooooooooongVariable;");
7821 
7822   // Different ways of ()-initializiation.
7823   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7824                "    LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
7825   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7826                "    LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
7827   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7828                "    LoooooooooooooooooooooooooooooooooooooooongVariable({});");
7829   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7830                "    LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
7831 
7832   // Lambdas should not confuse the variable declaration heuristic.
7833   verifyFormat("LooooooooooooooooongType\n"
7834                "    variable(nullptr, [](A *a) {});",
7835                getLLVMStyleWithColumns(40));
7836 }
7837 
7838 TEST_F(FormatTest, BreaksLongDeclarations) {
7839   verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
7840                "    AnotherNameForTheLongType;");
7841   verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
7842                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7843   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7844                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
7845   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
7846                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
7847   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7848                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7849   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
7850                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7851   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
7852                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7853   verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
7854                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7855   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7856                "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
7857   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7858                "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
7859   FormatStyle Indented = getLLVMStyle();
7860   Indented.IndentWrappedFunctionNames = true;
7861   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7862                "    LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
7863                Indented);
7864   verifyFormat(
7865       "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7866       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
7867       Indented);
7868   verifyFormat(
7869       "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
7870       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
7871       Indented);
7872   verifyFormat(
7873       "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
7874       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
7875       Indented);
7876 
7877   // FIXME: Without the comment, this breaks after "(".
7878   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType  // break\n"
7879                "    (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
7880                getGoogleStyle());
7881 
7882   verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
7883                "                  int LoooooooooooooooooooongParam2) {}");
7884   verifyFormat(
7885       "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
7886       "                                   SourceLocation L, IdentifierIn *II,\n"
7887       "                                   Type *T) {}");
7888   verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
7889                "ReallyReaaallyLongFunctionName(\n"
7890                "    const std::string &SomeParameter,\n"
7891                "    const SomeType<string, SomeOtherTemplateParameter>\n"
7892                "        &ReallyReallyLongParameterName,\n"
7893                "    const SomeType<string, SomeOtherTemplateParameter>\n"
7894                "        &AnotherLongParameterName) {}");
7895   verifyFormat("template <typename A>\n"
7896                "SomeLoooooooooooooooooooooongType<\n"
7897                "    typename some_namespace::SomeOtherType<A>::Type>\n"
7898                "Function() {}");
7899 
7900   verifyGoogleFormat(
7901       "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
7902       "    aaaaaaaaaaaaaaaaaaaaaaa;");
7903   verifyGoogleFormat(
7904       "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
7905       "                                   SourceLocation L) {}");
7906   verifyGoogleFormat(
7907       "some_namespace::LongReturnType\n"
7908       "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
7909       "    int first_long_parameter, int second_parameter) {}");
7910 
7911   verifyGoogleFormat("template <typename T>\n"
7912                      "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
7913                      "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
7914   verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7915                      "                   int aaaaaaaaaaaaaaaaaaaaaaa);");
7916 
7917   verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
7918                "    const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7919                "        *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7920   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7921                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
7922                "        aaaaaaaaaaaaaaaaaaaaaaaa);");
7923   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7924                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
7925                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
7926                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7927 
7928   verifyFormat("template <typename T> // Templates on own line.\n"
7929                "static int            // Some comment.\n"
7930                "MyFunction(int a);",
7931                getLLVMStyle());
7932 }
7933 
7934 TEST_F(FormatTest, FormatsArrays) {
7935   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
7936                "                         [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
7937   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
7938                "                         [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
7939   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
7940                "    aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
7941   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7942                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
7943   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7944                "    [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
7945   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7946                "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
7947                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
7948   verifyFormat(
7949       "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
7950       "             << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
7951       "                                  [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
7952   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
7953                "    .aaaaaaaaaaaaaaaaaaaaaa();");
7954 
7955   verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
7956                      "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
7957   verifyFormat(
7958       "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
7959       "                                  .aaaaaaa[0]\n"
7960       "                                  .aaaaaaaaaaaaaaaaaaaaaa();");
7961   verifyFormat("a[::b::c];");
7962 
7963   verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
7964 
7965   FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
7966   verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
7967 }
7968 
7969 TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
7970   verifyFormat("(a)->b();");
7971   verifyFormat("--a;");
7972 }
7973 
7974 TEST_F(FormatTest, HandlesIncludeDirectives) {
7975   verifyFormat("#include <string>\n"
7976                "#include <a/b/c.h>\n"
7977                "#include \"a/b/string\"\n"
7978                "#include \"string.h\"\n"
7979                "#include \"string.h\"\n"
7980                "#include <a-a>\n"
7981                "#include < path with space >\n"
7982                "#include_next <test.h>"
7983                "#include \"abc.h\" // this is included for ABC\n"
7984                "#include \"some long include\" // with a comment\n"
7985                "#include \"some very long include path\"\n"
7986                "#include <some/very/long/include/path>\n",
7987                getLLVMStyleWithColumns(35));
7988   EXPECT_EQ("#include \"a.h\"", format("#include  \"a.h\""));
7989   EXPECT_EQ("#include <a>", format("#include<a>"));
7990 
7991   verifyFormat("#import <string>");
7992   verifyFormat("#import <a/b/c.h>");
7993   verifyFormat("#import \"a/b/string\"");
7994   verifyFormat("#import \"string.h\"");
7995   verifyFormat("#import \"string.h\"");
7996   verifyFormat("#if __has_include(<strstream>)\n"
7997                "#include <strstream>\n"
7998                "#endif");
7999 
8000   verifyFormat("#define MY_IMPORT <a/b>");
8001 
8002   verifyFormat("#if __has_include(<a/b>)");
8003   verifyFormat("#if __has_include_next(<a/b>)");
8004   verifyFormat("#define F __has_include(<a/b>)");
8005   verifyFormat("#define F __has_include_next(<a/b>)");
8006 
8007   // Protocol buffer definition or missing "#".
8008   verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
8009                getLLVMStyleWithColumns(30));
8010 
8011   FormatStyle Style = getLLVMStyle();
8012   Style.AlwaysBreakBeforeMultilineStrings = true;
8013   Style.ColumnLimit = 0;
8014   verifyFormat("#import \"abc.h\"", Style);
8015 
8016   // But 'import' might also be a regular C++ namespace.
8017   verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8018                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
8019 }
8020 
8021 //===----------------------------------------------------------------------===//
8022 // Error recovery tests.
8023 //===----------------------------------------------------------------------===//
8024 
8025 TEST_F(FormatTest, IncompleteParameterLists) {
8026   FormatStyle NoBinPacking = getLLVMStyle();
8027   NoBinPacking.BinPackParameters = false;
8028   verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
8029                "                        double *min_x,\n"
8030                "                        double *max_x,\n"
8031                "                        double *min_y,\n"
8032                "                        double *max_y,\n"
8033                "                        double *min_z,\n"
8034                "                        double *max_z, ) {}",
8035                NoBinPacking);
8036 }
8037 
8038 TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
8039   verifyFormat("void f() { return; }\n42");
8040   verifyFormat("void f() {\n"
8041                "  if (0)\n"
8042                "    return;\n"
8043                "}\n"
8044                "42");
8045   verifyFormat("void f() { return }\n42");
8046   verifyFormat("void f() {\n"
8047                "  if (0)\n"
8048                "    return\n"
8049                "}\n"
8050                "42");
8051 }
8052 
8053 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
8054   EXPECT_EQ("void f() { return }", format("void  f ( )  {  return  }"));
8055   EXPECT_EQ("void f() {\n"
8056             "  if (a)\n"
8057             "    return\n"
8058             "}",
8059             format("void  f  (  )  {  if  ( a )  return  }"));
8060   EXPECT_EQ("namespace N {\n"
8061             "void f()\n"
8062             "}",
8063             format("namespace  N  {  void f()  }"));
8064   EXPECT_EQ("namespace N {\n"
8065             "void f() {}\n"
8066             "void g()\n"
8067             "} // namespace N",
8068             format("namespace N  { void f( ) { } void g( ) }"));
8069 }
8070 
8071 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
8072   verifyFormat("int aaaaaaaa =\n"
8073                "    // Overlylongcomment\n"
8074                "    b;",
8075                getLLVMStyleWithColumns(20));
8076   verifyFormat("function(\n"
8077                "    ShortArgument,\n"
8078                "    LoooooooooooongArgument);\n",
8079                getLLVMStyleWithColumns(20));
8080 }
8081 
8082 TEST_F(FormatTest, IncorrectAccessSpecifier) {
8083   verifyFormat("public:");
8084   verifyFormat("class A {\n"
8085                "public\n"
8086                "  void f() {}\n"
8087                "};");
8088   verifyFormat("public\n"
8089                "int qwerty;");
8090   verifyFormat("public\n"
8091                "B {}");
8092   verifyFormat("public\n"
8093                "{}");
8094   verifyFormat("public\n"
8095                "B { int x; }");
8096 }
8097 
8098 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
8099   verifyFormat("{");
8100   verifyFormat("#})");
8101   verifyNoCrash("(/**/[:!] ?[).");
8102 }
8103 
8104 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) {
8105   // Found by oss-fuzz:
8106   // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212
8107   FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
8108   Style.ColumnLimit = 60;
8109   verifyNoCrash(
8110       "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20"
8111       "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20"
8112       "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a",
8113       Style);
8114 }
8115 
8116 TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
8117   verifyFormat("do {\n}");
8118   verifyFormat("do {\n}\n"
8119                "f();");
8120   verifyFormat("do {\n}\n"
8121                "wheeee(fun);");
8122   verifyFormat("do {\n"
8123                "  f();\n"
8124                "}");
8125 }
8126 
8127 TEST_F(FormatTest, IncorrectCodeMissingParens) {
8128   verifyFormat("if {\n  foo;\n  foo();\n}");
8129   verifyFormat("switch {\n  foo;\n  foo();\n}");
8130   verifyIncompleteFormat("for {\n  foo;\n  foo();\n}");
8131   verifyFormat("while {\n  foo;\n  foo();\n}");
8132   verifyFormat("do {\n  foo;\n  foo();\n} while;");
8133 }
8134 
8135 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
8136   verifyIncompleteFormat("namespace {\n"
8137                          "class Foo { Foo (\n"
8138                          "};\n"
8139                          "} // namespace");
8140 }
8141 
8142 TEST_F(FormatTest, IncorrectCodeErrorDetection) {
8143   EXPECT_EQ("{\n  {}\n", format("{\n{\n}\n"));
8144   EXPECT_EQ("{\n  {}\n", format("{\n  {\n}\n"));
8145   EXPECT_EQ("{\n  {}\n", format("{\n  {\n  }\n"));
8146   EXPECT_EQ("{\n  {}\n}\n}\n", format("{\n  {\n    }\n  }\n}\n"));
8147 
8148   EXPECT_EQ("{\n"
8149             "  {\n"
8150             "    breakme(\n"
8151             "        qwe);\n"
8152             "  }\n",
8153             format("{\n"
8154                    "    {\n"
8155                    " breakme(qwe);\n"
8156                    "}\n",
8157                    getLLVMStyleWithColumns(10)));
8158 }
8159 
8160 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
8161   verifyFormat("int x = {\n"
8162                "    avariable,\n"
8163                "    b(alongervariable)};",
8164                getLLVMStyleWithColumns(25));
8165 }
8166 
8167 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
8168   verifyFormat("return (a)(b){1, 2, 3};");
8169 }
8170 
8171 TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
8172   verifyFormat("vector<int> x{1, 2, 3, 4};");
8173   verifyFormat("vector<int> x{\n"
8174                "    1,\n"
8175                "    2,\n"
8176                "    3,\n"
8177                "    4,\n"
8178                "};");
8179   verifyFormat("vector<T> x{{}, {}, {}, {}};");
8180   verifyFormat("f({1, 2});");
8181   verifyFormat("auto v = Foo{-1};");
8182   verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
8183   verifyFormat("Class::Class : member{1, 2, 3} {}");
8184   verifyFormat("new vector<int>{1, 2, 3};");
8185   verifyFormat("new int[3]{1, 2, 3};");
8186   verifyFormat("new int{1};");
8187   verifyFormat("return {arg1, arg2};");
8188   verifyFormat("return {arg1, SomeType{parameter}};");
8189   verifyFormat("int count = set<int>{f(), g(), h()}.size();");
8190   verifyFormat("new T{arg1, arg2};");
8191   verifyFormat("f(MyMap[{composite, key}]);");
8192   verifyFormat("class Class {\n"
8193                "  T member = {arg1, arg2};\n"
8194                "};");
8195   verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
8196   verifyFormat("const struct A a = {.a = 1, .b = 2};");
8197   verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
8198   verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
8199   verifyFormat("int a = std::is_integral<int>{} + 0;");
8200 
8201   verifyFormat("int foo(int i) { return fo1{}(i); }");
8202   verifyFormat("int foo(int i) { return fo1{}(i); }");
8203   verifyFormat("auto i = decltype(x){};");
8204   verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
8205   verifyFormat("Node n{1, Node{1000}, //\n"
8206                "       2};");
8207   verifyFormat("Aaaa aaaaaaa{\n"
8208                "    {\n"
8209                "        aaaa,\n"
8210                "    },\n"
8211                "};");
8212   verifyFormat("class C : public D {\n"
8213                "  SomeClass SC{2};\n"
8214                "};");
8215   verifyFormat("class C : public A {\n"
8216                "  class D : public B {\n"
8217                "    void f() { int i{2}; }\n"
8218                "  };\n"
8219                "};");
8220   verifyFormat("#define A {a, a},");
8221 
8222   // Avoid breaking between equal sign and opening brace
8223   FormatStyle AvoidBreakingFirstArgument = getLLVMStyle();
8224   AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200;
8225   verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n"
8226                "    {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n"
8227                "     {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n"
8228                "     {\"ccccccccccccccccccccc\", 2}};",
8229                AvoidBreakingFirstArgument);
8230 
8231   // Binpacking only if there is no trailing comma
8232   verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
8233                "                      cccccccccc, dddddddddd};",
8234                getLLVMStyleWithColumns(50));
8235   verifyFormat("const Aaaaaa aaaaa = {\n"
8236                "    aaaaaaaaaaa,\n"
8237                "    bbbbbbbbbbb,\n"
8238                "    ccccccccccc,\n"
8239                "    ddddddddddd,\n"
8240                "};",
8241                getLLVMStyleWithColumns(50));
8242 
8243   // Cases where distinguising braced lists and blocks is hard.
8244   verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
8245   verifyFormat("void f() {\n"
8246                "  return; // comment\n"
8247                "}\n"
8248                "SomeType t;");
8249   verifyFormat("void f() {\n"
8250                "  if (a) {\n"
8251                "    f();\n"
8252                "  }\n"
8253                "}\n"
8254                "SomeType t;");
8255 
8256   // In combination with BinPackArguments = false.
8257   FormatStyle NoBinPacking = getLLVMStyle();
8258   NoBinPacking.BinPackArguments = false;
8259   verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
8260                "                      bbbbb,\n"
8261                "                      ccccc,\n"
8262                "                      ddddd,\n"
8263                "                      eeeee,\n"
8264                "                      ffffff,\n"
8265                "                      ggggg,\n"
8266                "                      hhhhhh,\n"
8267                "                      iiiiii,\n"
8268                "                      jjjjjj,\n"
8269                "                      kkkkkk};",
8270                NoBinPacking);
8271   verifyFormat("const Aaaaaa aaaaa = {\n"
8272                "    aaaaa,\n"
8273                "    bbbbb,\n"
8274                "    ccccc,\n"
8275                "    ddddd,\n"
8276                "    eeeee,\n"
8277                "    ffffff,\n"
8278                "    ggggg,\n"
8279                "    hhhhhh,\n"
8280                "    iiiiii,\n"
8281                "    jjjjjj,\n"
8282                "    kkkkkk,\n"
8283                "};",
8284                NoBinPacking);
8285   verifyFormat(
8286       "const Aaaaaa aaaaa = {\n"
8287       "    aaaaa,  bbbbb,  ccccc,  ddddd,  eeeee,  ffffff, ggggg, hhhhhh,\n"
8288       "    iiiiii, jjjjjj, kkkkkk, aaaaa,  bbbbb,  ccccc,  ddddd, eeeee,\n"
8289       "    ffffff, ggggg,  hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
8290       "};",
8291       NoBinPacking);
8292 
8293   NoBinPacking.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8294   EXPECT_EQ("static uint8 CddDp83848Reg[] = {\n"
8295             "    CDDDP83848_BMCR_REGISTER,\n"
8296             "    CDDDP83848_BMSR_REGISTER,\n"
8297             "    CDDDP83848_RBR_REGISTER};",
8298             format("static uint8 CddDp83848Reg[] = {CDDDP83848_BMCR_REGISTER,\n"
8299                    "                                CDDDP83848_BMSR_REGISTER,\n"
8300                    "                                CDDDP83848_RBR_REGISTER};",
8301                    NoBinPacking));
8302 
8303   // FIXME: The alignment of these trailing comments might be bad. Then again,
8304   // this might be utterly useless in real code.
8305   verifyFormat("Constructor::Constructor()\n"
8306                "    : some_value{         //\n"
8307                "                 aaaaaaa, //\n"
8308                "                 bbbbbbb} {}");
8309 
8310   // In braced lists, the first comment is always assumed to belong to the
8311   // first element. Thus, it can be moved to the next or previous line as
8312   // appropriate.
8313   EXPECT_EQ("function({// First element:\n"
8314             "          1,\n"
8315             "          // Second element:\n"
8316             "          2});",
8317             format("function({\n"
8318                    "    // First element:\n"
8319                    "    1,\n"
8320                    "    // Second element:\n"
8321                    "    2});"));
8322   EXPECT_EQ("std::vector<int> MyNumbers{\n"
8323             "    // First element:\n"
8324             "    1,\n"
8325             "    // Second element:\n"
8326             "    2};",
8327             format("std::vector<int> MyNumbers{// First element:\n"
8328                    "                           1,\n"
8329                    "                           // Second element:\n"
8330                    "                           2};",
8331                    getLLVMStyleWithColumns(30)));
8332   // A trailing comma should still lead to an enforced line break and no
8333   // binpacking.
8334   EXPECT_EQ("vector<int> SomeVector = {\n"
8335             "    // aaa\n"
8336             "    1,\n"
8337             "    2,\n"
8338             "};",
8339             format("vector<int> SomeVector = { // aaa\n"
8340                    "    1, 2, };"));
8341 
8342   FormatStyle ExtraSpaces = getLLVMStyle();
8343   ExtraSpaces.Cpp11BracedListStyle = false;
8344   ExtraSpaces.ColumnLimit = 75;
8345   verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
8346   verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
8347   verifyFormat("f({ 1, 2 });", ExtraSpaces);
8348   verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
8349   verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
8350   verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
8351   verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
8352   verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
8353   verifyFormat("return { arg1, arg2 };", ExtraSpaces);
8354   verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
8355   verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
8356   verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
8357   verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
8358   verifyFormat("class Class {\n"
8359                "  T member = { arg1, arg2 };\n"
8360                "};",
8361                ExtraSpaces);
8362   verifyFormat(
8363       "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8364       "                                 aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
8365       "                  : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
8366       "                                 bbbbbbbbbbbbbbbbbbbb, bbbbb };",
8367       ExtraSpaces);
8368   verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
8369   verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
8370                ExtraSpaces);
8371   verifyFormat(
8372       "someFunction(OtherParam,\n"
8373       "             BracedList{ // comment 1 (Forcing interesting break)\n"
8374       "                         param1, param2,\n"
8375       "                         // comment 2\n"
8376       "                         param3, param4 });",
8377       ExtraSpaces);
8378   verifyFormat(
8379       "std::this_thread::sleep_for(\n"
8380       "    std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
8381       ExtraSpaces);
8382   verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
8383                "    aaaaaaa,\n"
8384                "    aaaaaaaaaa,\n"
8385                "    aaaaa,\n"
8386                "    aaaaaaaaaaaaaaa,\n"
8387                "    aaa,\n"
8388                "    aaaaaaaaaa,\n"
8389                "    a,\n"
8390                "    aaaaaaaaaaaaaaaaaaaaa,\n"
8391                "    aaaaaaaaaaaa,\n"
8392                "    aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
8393                "    aaaaaaa,\n"
8394                "    a};");
8395   verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
8396   verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
8397   verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
8398 
8399   // Avoid breaking between initializer/equal sign and opening brace
8400   ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200;
8401   verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n"
8402                "  { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
8403                "  { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
8404                "  { \"ccccccccccccccccccccc\", 2 }\n"
8405                "};",
8406                ExtraSpaces);
8407   verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n"
8408                "  { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
8409                "  { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
8410                "  { \"ccccccccccccccccccccc\", 2 }\n"
8411                "};",
8412                ExtraSpaces);
8413 
8414   FormatStyle SpaceBeforeBrace = getLLVMStyle();
8415   SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true;
8416   verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace);
8417   verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace);
8418 
8419   FormatStyle SpaceBetweenBraces = getLLVMStyle();
8420   SpaceBetweenBraces.SpacesInAngles = true;
8421   SpaceBetweenBraces.SpacesInParentheses = true;
8422   SpaceBetweenBraces.SpacesInSquareBrackets = true;
8423   verifyFormat("vector< int > x{ 1, 2, 3, 4 };", SpaceBetweenBraces);
8424   verifyFormat("f( {}, { {}, {} }, MyMap[ { k, v } ] );", SpaceBetweenBraces);
8425   verifyFormat("vector< int > x{ // comment 1\n"
8426                "                 1, 2, 3, 4 };",
8427                SpaceBetweenBraces);
8428   SpaceBetweenBraces.ColumnLimit = 20;
8429   EXPECT_EQ("vector< int > x{\n"
8430             "    1, 2, 3, 4 };",
8431             format("vector<int>x{1,2,3,4};", SpaceBetweenBraces));
8432   SpaceBetweenBraces.ColumnLimit = 24;
8433   EXPECT_EQ("vector< int > x{ 1, 2,\n"
8434             "                 3, 4 };",
8435             format("vector<int>x{1,2,3,4};", SpaceBetweenBraces));
8436   EXPECT_EQ("vector< int > x{\n"
8437             "    1,\n"
8438             "    2,\n"
8439             "    3,\n"
8440             "    4,\n"
8441             "};",
8442             format("vector<int>x{1,2,3,4,};", SpaceBetweenBraces));
8443   verifyFormat("vector< int > x{};", SpaceBetweenBraces);
8444   SpaceBetweenBraces.SpaceInEmptyParentheses = true;
8445   verifyFormat("vector< int > x{ };", SpaceBetweenBraces);
8446 }
8447 
8448 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
8449   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8450                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8451                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8452                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8453                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8454                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
8455   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
8456                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8457                "                 1, 22, 333, 4444, 55555, //\n"
8458                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8459                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
8460   verifyFormat(
8461       "vector<int> x = {1,       22, 333, 4444, 55555, 666666, 7777777,\n"
8462       "                 1,       22, 333, 4444, 55555, 666666, 7777777,\n"
8463       "                 1,       22, 333, 4444, 55555, 666666, // comment\n"
8464       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
8465       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
8466       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
8467       "                 7777777};");
8468   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
8469                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
8470                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
8471   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
8472                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
8473                "    // Separating comment.\n"
8474                "    X86::R8, X86::R9, X86::R10, X86::R11, 0};");
8475   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
8476                "    // Leading comment\n"
8477                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
8478                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
8479   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
8480                "                 1, 1, 1, 1};",
8481                getLLVMStyleWithColumns(39));
8482   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
8483                "                 1, 1, 1, 1};",
8484                getLLVMStyleWithColumns(38));
8485   verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
8486                "    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
8487                getLLVMStyleWithColumns(43));
8488   verifyFormat(
8489       "static unsigned SomeValues[10][3] = {\n"
8490       "    {1, 4, 0},  {4, 9, 0},  {4, 5, 9},  {8, 5, 4}, {1, 8, 4},\n"
8491       "    {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
8492   verifyFormat("static auto fields = new vector<string>{\n"
8493                "    \"aaaaaaaaaaaaa\",\n"
8494                "    \"aaaaaaaaaaaaa\",\n"
8495                "    \"aaaaaaaaaaaa\",\n"
8496                "    \"aaaaaaaaaaaaaa\",\n"
8497                "    \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
8498                "    \"aaaaaaaaaaaa\",\n"
8499                "    \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
8500                "};");
8501   verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
8502   verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
8503                "                 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
8504                "                 3, cccccccccccccccccccccc};",
8505                getLLVMStyleWithColumns(60));
8506 
8507   // Trailing commas.
8508   verifyFormat("vector<int> x = {\n"
8509                "    1, 1, 1, 1, 1, 1, 1, 1,\n"
8510                "};",
8511                getLLVMStyleWithColumns(39));
8512   verifyFormat("vector<int> x = {\n"
8513                "    1, 1, 1, 1, 1, 1, 1, 1, //\n"
8514                "};",
8515                getLLVMStyleWithColumns(39));
8516   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
8517                "                 1, 1, 1, 1,\n"
8518                "                 /**/ /**/};",
8519                getLLVMStyleWithColumns(39));
8520 
8521   // Trailing comment in the first line.
8522   verifyFormat("vector<int> iiiiiiiiiiiiiii = {                      //\n"
8523                "    1111111111, 2222222222, 33333333333, 4444444444, //\n"
8524                "    111111111,  222222222,  3333333333,  444444444,  //\n"
8525                "    11111111,   22222222,   333333333,   44444444};");
8526   // Trailing comment in the last line.
8527   verifyFormat("int aaaaa[] = {\n"
8528                "    1, 2, 3, // comment\n"
8529                "    4, 5, 6  // comment\n"
8530                "};");
8531 
8532   // With nested lists, we should either format one item per line or all nested
8533   // lists one on line.
8534   // FIXME: For some nested lists, we can do better.
8535   verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
8536                "        {aaaaaaaaaaaaaaaaaaa},\n"
8537                "        {aaaaaaaaaaaaaaaaaaaaa},\n"
8538                "        {aaaaaaaaaaaaaaaaa}};",
8539                getLLVMStyleWithColumns(60));
8540   verifyFormat(
8541       "SomeStruct my_struct_array = {\n"
8542       "    {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
8543       "     aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
8544       "    {aaa, aaa},\n"
8545       "    {aaa, aaa},\n"
8546       "    {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
8547       "    {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
8548       "     aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
8549 
8550   // No column layout should be used here.
8551   verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
8552                "                   bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
8553 
8554   verifyNoCrash("a<,");
8555 
8556   // No braced initializer here.
8557   verifyFormat("void f() {\n"
8558                "  struct Dummy {};\n"
8559                "  f(v);\n"
8560                "}");
8561 
8562   // Long lists should be formatted in columns even if they are nested.
8563   verifyFormat(
8564       "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8565       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8566       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8567       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8568       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8569       "                          1, 22, 333, 4444, 55555, 666666, 7777777});");
8570 
8571   // Allow "single-column" layout even if that violates the column limit. There
8572   // isn't going to be a better way.
8573   verifyFormat("std::vector<int> a = {\n"
8574                "    aaaaaaaa,\n"
8575                "    aaaaaaaa,\n"
8576                "    aaaaaaaa,\n"
8577                "    aaaaaaaa,\n"
8578                "    aaaaaaaaaa,\n"
8579                "    aaaaaaaa,\n"
8580                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
8581                getLLVMStyleWithColumns(30));
8582   verifyFormat("vector<int> aaaa = {\n"
8583                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8584                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8585                "    aaaaaa.aaaaaaa,\n"
8586                "    aaaaaa.aaaaaaa,\n"
8587                "    aaaaaa.aaaaaaa,\n"
8588                "    aaaaaa.aaaaaaa,\n"
8589                "};");
8590 
8591   // Don't create hanging lists.
8592   verifyFormat("someFunction(Param, {List1, List2,\n"
8593                "                     List3});",
8594                getLLVMStyleWithColumns(35));
8595   verifyFormat("someFunction(Param, Param,\n"
8596                "             {List1, List2,\n"
8597                "              List3});",
8598                getLLVMStyleWithColumns(35));
8599   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
8600                "                               aaaaaaaaaaaaaaaaaaaaaaa);");
8601 }
8602 
8603 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
8604   FormatStyle DoNotMerge = getLLVMStyle();
8605   DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
8606 
8607   verifyFormat("void f() { return 42; }");
8608   verifyFormat("void f() {\n"
8609                "  return 42;\n"
8610                "}",
8611                DoNotMerge);
8612   verifyFormat("void f() {\n"
8613                "  // Comment\n"
8614                "}");
8615   verifyFormat("{\n"
8616                "#error {\n"
8617                "  int a;\n"
8618                "}");
8619   verifyFormat("{\n"
8620                "  int a;\n"
8621                "#error {\n"
8622                "}");
8623   verifyFormat("void f() {} // comment");
8624   verifyFormat("void f() { int a; } // comment");
8625   verifyFormat("void f() {\n"
8626                "} // comment",
8627                DoNotMerge);
8628   verifyFormat("void f() {\n"
8629                "  int a;\n"
8630                "} // comment",
8631                DoNotMerge);
8632   verifyFormat("void f() {\n"
8633                "} // comment",
8634                getLLVMStyleWithColumns(15));
8635 
8636   verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
8637   verifyFormat("void f() {\n  return 42;\n}", getLLVMStyleWithColumns(22));
8638 
8639   verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
8640   verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
8641   verifyFormat("class C {\n"
8642                "  C()\n"
8643                "      : iiiiiiii(nullptr),\n"
8644                "        kkkkkkk(nullptr),\n"
8645                "        mmmmmmm(nullptr),\n"
8646                "        nnnnnnn(nullptr) {}\n"
8647                "};",
8648                getGoogleStyle());
8649 
8650   FormatStyle NoColumnLimit = getLLVMStyle();
8651   NoColumnLimit.ColumnLimit = 0;
8652   EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
8653   EXPECT_EQ("class C {\n"
8654             "  A() : b(0) {}\n"
8655             "};",
8656             format("class C{A():b(0){}};", NoColumnLimit));
8657   EXPECT_EQ("A()\n"
8658             "    : b(0) {\n"
8659             "}",
8660             format("A()\n:b(0)\n{\n}", NoColumnLimit));
8661 
8662   FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
8663   DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
8664       FormatStyle::SFS_None;
8665   EXPECT_EQ("A()\n"
8666             "    : b(0) {\n"
8667             "}",
8668             format("A():b(0){}", DoNotMergeNoColumnLimit));
8669   EXPECT_EQ("A()\n"
8670             "    : b(0) {\n"
8671             "}",
8672             format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
8673 
8674   verifyFormat("#define A          \\\n"
8675                "  void f() {       \\\n"
8676                "    int i;         \\\n"
8677                "  }",
8678                getLLVMStyleWithColumns(20));
8679   verifyFormat("#define A           \\\n"
8680                "  void f() { int i; }",
8681                getLLVMStyleWithColumns(21));
8682   verifyFormat("#define A            \\\n"
8683                "  void f() {         \\\n"
8684                "    int i;           \\\n"
8685                "  }                  \\\n"
8686                "  int j;",
8687                getLLVMStyleWithColumns(22));
8688   verifyFormat("#define A             \\\n"
8689                "  void f() { int i; } \\\n"
8690                "  int j;",
8691                getLLVMStyleWithColumns(23));
8692 }
8693 
8694 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
8695   FormatStyle MergeEmptyOnly = getLLVMStyle();
8696   MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
8697   verifyFormat("class C {\n"
8698                "  int f() {}\n"
8699                "};",
8700                MergeEmptyOnly);
8701   verifyFormat("class C {\n"
8702                "  int f() {\n"
8703                "    return 42;\n"
8704                "  }\n"
8705                "};",
8706                MergeEmptyOnly);
8707   verifyFormat("int f() {}", MergeEmptyOnly);
8708   verifyFormat("int f() {\n"
8709                "  return 42;\n"
8710                "}",
8711                MergeEmptyOnly);
8712 
8713   // Also verify behavior when BraceWrapping.AfterFunction = true
8714   MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
8715   MergeEmptyOnly.BraceWrapping.AfterFunction = true;
8716   verifyFormat("int f() {}", MergeEmptyOnly);
8717   verifyFormat("class C {\n"
8718                "  int f() {}\n"
8719                "};",
8720                MergeEmptyOnly);
8721 }
8722 
8723 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
8724   FormatStyle MergeInlineOnly = getLLVMStyle();
8725   MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
8726   verifyFormat("class C {\n"
8727                "  int f() { return 42; }\n"
8728                "};",
8729                MergeInlineOnly);
8730   verifyFormat("int f() {\n"
8731                "  return 42;\n"
8732                "}",
8733                MergeInlineOnly);
8734 
8735   // SFS_Inline implies SFS_Empty
8736   verifyFormat("class C {\n"
8737                "  int f() {}\n"
8738                "};",
8739                MergeInlineOnly);
8740   verifyFormat("int f() {}", MergeInlineOnly);
8741 
8742   // Also verify behavior when BraceWrapping.AfterFunction = true
8743   MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
8744   MergeInlineOnly.BraceWrapping.AfterFunction = true;
8745   verifyFormat("class C {\n"
8746                "  int f() { return 42; }\n"
8747                "};",
8748                MergeInlineOnly);
8749   verifyFormat("int f()\n"
8750                "{\n"
8751                "  return 42;\n"
8752                "}",
8753                MergeInlineOnly);
8754 
8755   // SFS_Inline implies SFS_Empty
8756   verifyFormat("int f() {}", MergeInlineOnly);
8757   verifyFormat("class C {\n"
8758                "  int f() {}\n"
8759                "};",
8760                MergeInlineOnly);
8761 }
8762 
8763 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
8764   FormatStyle MergeInlineOnly = getLLVMStyle();
8765   MergeInlineOnly.AllowShortFunctionsOnASingleLine =
8766       FormatStyle::SFS_InlineOnly;
8767   verifyFormat("class C {\n"
8768                "  int f() { return 42; }\n"
8769                "};",
8770                MergeInlineOnly);
8771   verifyFormat("int f() {\n"
8772                "  return 42;\n"
8773                "}",
8774                MergeInlineOnly);
8775 
8776   // SFS_InlineOnly does not imply SFS_Empty
8777   verifyFormat("class C {\n"
8778                "  int f() {}\n"
8779                "};",
8780                MergeInlineOnly);
8781   verifyFormat("int f() {\n"
8782                "}",
8783                MergeInlineOnly);
8784 
8785   // Also verify behavior when BraceWrapping.AfterFunction = true
8786   MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
8787   MergeInlineOnly.BraceWrapping.AfterFunction = true;
8788   verifyFormat("class C {\n"
8789                "  int f() { return 42; }\n"
8790                "};",
8791                MergeInlineOnly);
8792   verifyFormat("int f()\n"
8793                "{\n"
8794                "  return 42;\n"
8795                "}",
8796                MergeInlineOnly);
8797 
8798   // SFS_InlineOnly does not imply SFS_Empty
8799   verifyFormat("int f()\n"
8800                "{\n"
8801                "}",
8802                MergeInlineOnly);
8803   verifyFormat("class C {\n"
8804                "  int f() {}\n"
8805                "};",
8806                MergeInlineOnly);
8807 }
8808 
8809 TEST_F(FormatTest, SplitEmptyFunction) {
8810   FormatStyle Style = getLLVMStyle();
8811   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
8812   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8813   Style.BraceWrapping.AfterFunction = true;
8814   Style.BraceWrapping.SplitEmptyFunction = false;
8815   Style.ColumnLimit = 40;
8816 
8817   verifyFormat("int f()\n"
8818                "{}",
8819                Style);
8820   verifyFormat("int f()\n"
8821                "{\n"
8822                "  return 42;\n"
8823                "}",
8824                Style);
8825   verifyFormat("int f()\n"
8826                "{\n"
8827                "  // some comment\n"
8828                "}",
8829                Style);
8830 
8831   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
8832   verifyFormat("int f() {}", Style);
8833   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8834                "{}",
8835                Style);
8836   verifyFormat("int f()\n"
8837                "{\n"
8838                "  return 0;\n"
8839                "}",
8840                Style);
8841 
8842   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
8843   verifyFormat("class Foo {\n"
8844                "  int f() {}\n"
8845                "};\n",
8846                Style);
8847   verifyFormat("class Foo {\n"
8848                "  int f() { return 0; }\n"
8849                "};\n",
8850                Style);
8851   verifyFormat("class Foo {\n"
8852                "  int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8853                "  {}\n"
8854                "};\n",
8855                Style);
8856   verifyFormat("class Foo {\n"
8857                "  int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8858                "  {\n"
8859                "    return 0;\n"
8860                "  }\n"
8861                "};\n",
8862                Style);
8863 
8864   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
8865   verifyFormat("int f() {}", Style);
8866   verifyFormat("int f() { return 0; }", Style);
8867   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8868                "{}",
8869                Style);
8870   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8871                "{\n"
8872                "  return 0;\n"
8873                "}",
8874                Style);
8875 }
8876 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
8877   FormatStyle Style = getLLVMStyle();
8878   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
8879   verifyFormat("#ifdef A\n"
8880                "int f() {}\n"
8881                "#else\n"
8882                "int g() {}\n"
8883                "#endif",
8884                Style);
8885 }
8886 
8887 TEST_F(FormatTest, SplitEmptyClass) {
8888   FormatStyle Style = getLLVMStyle();
8889   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8890   Style.BraceWrapping.AfterClass = true;
8891   Style.BraceWrapping.SplitEmptyRecord = false;
8892 
8893   verifyFormat("class Foo\n"
8894                "{};",
8895                Style);
8896   verifyFormat("/* something */ class Foo\n"
8897                "{};",
8898                Style);
8899   verifyFormat("template <typename X> class Foo\n"
8900                "{};",
8901                Style);
8902   verifyFormat("class Foo\n"
8903                "{\n"
8904                "  Foo();\n"
8905                "};",
8906                Style);
8907   verifyFormat("typedef class Foo\n"
8908                "{\n"
8909                "} Foo_t;",
8910                Style);
8911 }
8912 
8913 TEST_F(FormatTest, SplitEmptyStruct) {
8914   FormatStyle Style = getLLVMStyle();
8915   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8916   Style.BraceWrapping.AfterStruct = true;
8917   Style.BraceWrapping.SplitEmptyRecord = false;
8918 
8919   verifyFormat("struct Foo\n"
8920                "{};",
8921                Style);
8922   verifyFormat("/* something */ struct Foo\n"
8923                "{};",
8924                Style);
8925   verifyFormat("template <typename X> struct Foo\n"
8926                "{};",
8927                Style);
8928   verifyFormat("struct Foo\n"
8929                "{\n"
8930                "  Foo();\n"
8931                "};",
8932                Style);
8933   verifyFormat("typedef struct Foo\n"
8934                "{\n"
8935                "} Foo_t;",
8936                Style);
8937   // typedef struct Bar {} Bar_t;
8938 }
8939 
8940 TEST_F(FormatTest, SplitEmptyUnion) {
8941   FormatStyle Style = getLLVMStyle();
8942   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8943   Style.BraceWrapping.AfterUnion = true;
8944   Style.BraceWrapping.SplitEmptyRecord = false;
8945 
8946   verifyFormat("union Foo\n"
8947                "{};",
8948                Style);
8949   verifyFormat("/* something */ union Foo\n"
8950                "{};",
8951                Style);
8952   verifyFormat("union Foo\n"
8953                "{\n"
8954                "  A,\n"
8955                "};",
8956                Style);
8957   verifyFormat("typedef union Foo\n"
8958                "{\n"
8959                "} Foo_t;",
8960                Style);
8961 }
8962 
8963 TEST_F(FormatTest, SplitEmptyNamespace) {
8964   FormatStyle Style = getLLVMStyle();
8965   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8966   Style.BraceWrapping.AfterNamespace = true;
8967   Style.BraceWrapping.SplitEmptyNamespace = false;
8968 
8969   verifyFormat("namespace Foo\n"
8970                "{};",
8971                Style);
8972   verifyFormat("/* something */ namespace Foo\n"
8973                "{};",
8974                Style);
8975   verifyFormat("inline namespace Foo\n"
8976                "{};",
8977                Style);
8978   verifyFormat("/* something */ inline namespace Foo\n"
8979                "{};",
8980                Style);
8981   verifyFormat("export namespace Foo\n"
8982                "{};",
8983                Style);
8984   verifyFormat("namespace Foo\n"
8985                "{\n"
8986                "void Bar();\n"
8987                "};",
8988                Style);
8989 }
8990 
8991 TEST_F(FormatTest, NeverMergeShortRecords) {
8992   FormatStyle Style = getLLVMStyle();
8993 
8994   verifyFormat("class Foo {\n"
8995                "  Foo();\n"
8996                "};",
8997                Style);
8998   verifyFormat("typedef class Foo {\n"
8999                "  Foo();\n"
9000                "} Foo_t;",
9001                Style);
9002   verifyFormat("struct Foo {\n"
9003                "  Foo();\n"
9004                "};",
9005                Style);
9006   verifyFormat("typedef struct Foo {\n"
9007                "  Foo();\n"
9008                "} Foo_t;",
9009                Style);
9010   verifyFormat("union Foo {\n"
9011                "  A,\n"
9012                "};",
9013                Style);
9014   verifyFormat("typedef union Foo {\n"
9015                "  A,\n"
9016                "} Foo_t;",
9017                Style);
9018   verifyFormat("namespace Foo {\n"
9019                "void Bar();\n"
9020                "};",
9021                Style);
9022 
9023   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9024   Style.BraceWrapping.AfterClass = true;
9025   Style.BraceWrapping.AfterStruct = true;
9026   Style.BraceWrapping.AfterUnion = true;
9027   Style.BraceWrapping.AfterNamespace = true;
9028   verifyFormat("class Foo\n"
9029                "{\n"
9030                "  Foo();\n"
9031                "};",
9032                Style);
9033   verifyFormat("typedef class Foo\n"
9034                "{\n"
9035                "  Foo();\n"
9036                "} Foo_t;",
9037                Style);
9038   verifyFormat("struct Foo\n"
9039                "{\n"
9040                "  Foo();\n"
9041                "};",
9042                Style);
9043   verifyFormat("typedef struct Foo\n"
9044                "{\n"
9045                "  Foo();\n"
9046                "} Foo_t;",
9047                Style);
9048   verifyFormat("union Foo\n"
9049                "{\n"
9050                "  A,\n"
9051                "};",
9052                Style);
9053   verifyFormat("typedef union Foo\n"
9054                "{\n"
9055                "  A,\n"
9056                "} Foo_t;",
9057                Style);
9058   verifyFormat("namespace Foo\n"
9059                "{\n"
9060                "void Bar();\n"
9061                "};",
9062                Style);
9063 }
9064 
9065 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
9066   // Elaborate type variable declarations.
9067   verifyFormat("struct foo a = {bar};\nint n;");
9068   verifyFormat("class foo a = {bar};\nint n;");
9069   verifyFormat("union foo a = {bar};\nint n;");
9070 
9071   // Elaborate types inside function definitions.
9072   verifyFormat("struct foo f() {}\nint n;");
9073   verifyFormat("class foo f() {}\nint n;");
9074   verifyFormat("union foo f() {}\nint n;");
9075 
9076   // Templates.
9077   verifyFormat("template <class X> void f() {}\nint n;");
9078   verifyFormat("template <struct X> void f() {}\nint n;");
9079   verifyFormat("template <union X> void f() {}\nint n;");
9080 
9081   // Actual definitions...
9082   verifyFormat("struct {\n} n;");
9083   verifyFormat(
9084       "template <template <class T, class Y>, class Z> class X {\n} n;");
9085   verifyFormat("union Z {\n  int n;\n} x;");
9086   verifyFormat("class MACRO Z {\n} n;");
9087   verifyFormat("class MACRO(X) Z {\n} n;");
9088   verifyFormat("class __attribute__(X) Z {\n} n;");
9089   verifyFormat("class __declspec(X) Z {\n} n;");
9090   verifyFormat("class A##B##C {\n} n;");
9091   verifyFormat("class alignas(16) Z {\n} n;");
9092   verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
9093   verifyFormat("class MACROA MACRO(X) Z {\n} n;");
9094 
9095   // Redefinition from nested context:
9096   verifyFormat("class A::B::C {\n} n;");
9097 
9098   // Template definitions.
9099   verifyFormat(
9100       "template <typename F>\n"
9101       "Matcher(const Matcher<F> &Other,\n"
9102       "        typename enable_if_c<is_base_of<F, T>::value &&\n"
9103       "                             !is_same<F, T>::value>::type * = 0)\n"
9104       "    : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
9105 
9106   // FIXME: This is still incorrectly handled at the formatter side.
9107   verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
9108   verifyFormat("int i = SomeFunction(a<b, a> b);");
9109 
9110   // FIXME:
9111   // This now gets parsed incorrectly as class definition.
9112   // verifyFormat("class A<int> f() {\n}\nint n;");
9113 
9114   // Elaborate types where incorrectly parsing the structural element would
9115   // break the indent.
9116   verifyFormat("if (true)\n"
9117                "  class X x;\n"
9118                "else\n"
9119                "  f();\n");
9120 
9121   // This is simply incomplete. Formatting is not important, but must not crash.
9122   verifyFormat("class A:");
9123 }
9124 
9125 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
9126   EXPECT_EQ("#error Leave     all         white!!!!! space* alone!\n",
9127             format("#error Leave     all         white!!!!! space* alone!\n"));
9128   EXPECT_EQ(
9129       "#warning Leave     all         white!!!!! space* alone!\n",
9130       format("#warning Leave     all         white!!!!! space* alone!\n"));
9131   EXPECT_EQ("#error 1", format("  #  error   1"));
9132   EXPECT_EQ("#warning 1", format("  #  warning 1"));
9133 }
9134 
9135 TEST_F(FormatTest, FormatHashIfExpressions) {
9136   verifyFormat("#if AAAA && BBBB");
9137   verifyFormat("#if (AAAA && BBBB)");
9138   verifyFormat("#elif (AAAA && BBBB)");
9139   // FIXME: Come up with a better indentation for #elif.
9140   verifyFormat(
9141       "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) &&  \\\n"
9142       "    defined(BBBBBBBB)\n"
9143       "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) &&  \\\n"
9144       "    defined(BBBBBBBB)\n"
9145       "#endif",
9146       getLLVMStyleWithColumns(65));
9147 }
9148 
9149 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
9150   FormatStyle AllowsMergedIf = getGoogleStyle();
9151   AllowsMergedIf.AllowShortIfStatementsOnASingleLine =
9152       FormatStyle::SIS_WithoutElse;
9153   verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
9154   verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
9155   verifyFormat("if (true)\n#error E\n  return 42;", AllowsMergedIf);
9156   EXPECT_EQ("if (true) return 42;",
9157             format("if (true)\nreturn 42;", AllowsMergedIf));
9158   FormatStyle ShortMergedIf = AllowsMergedIf;
9159   ShortMergedIf.ColumnLimit = 25;
9160   verifyFormat("#define A \\\n"
9161                "  if (true) return 42;",
9162                ShortMergedIf);
9163   verifyFormat("#define A \\\n"
9164                "  f();    \\\n"
9165                "  if (true)\n"
9166                "#define B",
9167                ShortMergedIf);
9168   verifyFormat("#define A \\\n"
9169                "  f();    \\\n"
9170                "  if (true)\n"
9171                "g();",
9172                ShortMergedIf);
9173   verifyFormat("{\n"
9174                "#ifdef A\n"
9175                "  // Comment\n"
9176                "  if (true) continue;\n"
9177                "#endif\n"
9178                "  // Comment\n"
9179                "  if (true) continue;\n"
9180                "}",
9181                ShortMergedIf);
9182   ShortMergedIf.ColumnLimit = 33;
9183   verifyFormat("#define A \\\n"
9184                "  if constexpr (true) return 42;",
9185                ShortMergedIf);
9186   verifyFormat("#define A \\\n"
9187                "  if CONSTEXPR (true) return 42;",
9188                ShortMergedIf);
9189   ShortMergedIf.ColumnLimit = 29;
9190   verifyFormat("#define A                   \\\n"
9191                "  if (aaaaaaaaaa) return 1; \\\n"
9192                "  return 2;",
9193                ShortMergedIf);
9194   ShortMergedIf.ColumnLimit = 28;
9195   verifyFormat("#define A         \\\n"
9196                "  if (aaaaaaaaaa) \\\n"
9197                "    return 1;     \\\n"
9198                "  return 2;",
9199                ShortMergedIf);
9200   verifyFormat("#define A                \\\n"
9201                "  if constexpr (aaaaaaa) \\\n"
9202                "    return 1;            \\\n"
9203                "  return 2;",
9204                ShortMergedIf);
9205   verifyFormat("#define A                \\\n"
9206                "  if CONSTEXPR (aaaaaaa) \\\n"
9207                "    return 1;            \\\n"
9208                "  return 2;",
9209                ShortMergedIf);
9210 }
9211 
9212 TEST_F(FormatTest, FormatStarDependingOnContext) {
9213   verifyFormat("void f(int *a);");
9214   verifyFormat("void f() { f(fint * b); }");
9215   verifyFormat("class A {\n  void f(int *a);\n};");
9216   verifyFormat("class A {\n  int *a;\n};");
9217   verifyFormat("namespace a {\n"
9218                "namespace b {\n"
9219                "class A {\n"
9220                "  void f() {}\n"
9221                "  int *a;\n"
9222                "};\n"
9223                "} // namespace b\n"
9224                "} // namespace a");
9225 }
9226 
9227 TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
9228   verifyFormat("while");
9229   verifyFormat("operator");
9230 }
9231 
9232 TEST_F(FormatTest, SkipsDeeplyNestedLines) {
9233   // This code would be painfully slow to format if we didn't skip it.
9234   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
9235                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
9236                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
9237                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
9238                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
9239                    "A(1, 1)\n"
9240                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
9241                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9242                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9243                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9244                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9245                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9246                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9247                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9248                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9249                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
9250   // Deeply nested part is untouched, rest is formatted.
9251   EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
9252             format(std::string("int    i;\n") + Code + "int    j;\n",
9253                    getLLVMStyle(), SC_ExpectIncomplete));
9254 }
9255 
9256 //===----------------------------------------------------------------------===//
9257 // Objective-C tests.
9258 //===----------------------------------------------------------------------===//
9259 
9260 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
9261   verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
9262   EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
9263             format("-(NSUInteger)indexOfObject:(id)anObject;"));
9264   EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
9265   EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
9266   EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
9267             format("-(NSInteger)Method3:(id)anObject;"));
9268   EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
9269             format("-(NSInteger)Method4:(id)anObject;"));
9270   EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
9271             format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
9272   EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
9273             format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
9274   EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
9275             "forAllCells:(BOOL)flag;",
9276             format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
9277                    "forAllCells:(BOOL)flag;"));
9278 
9279   // Very long objectiveC method declaration.
9280   verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
9281                "    (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
9282   verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
9283                "                    inRange:(NSRange)range\n"
9284                "                   outRange:(NSRange)out_range\n"
9285                "                  outRange1:(NSRange)out_range1\n"
9286                "                  outRange2:(NSRange)out_range2\n"
9287                "                  outRange3:(NSRange)out_range3\n"
9288                "                  outRange4:(NSRange)out_range4\n"
9289                "                  outRange5:(NSRange)out_range5\n"
9290                "                  outRange6:(NSRange)out_range6\n"
9291                "                  outRange7:(NSRange)out_range7\n"
9292                "                  outRange8:(NSRange)out_range8\n"
9293                "                  outRange9:(NSRange)out_range9;");
9294 
9295   // When the function name has to be wrapped.
9296   FormatStyle Style = getLLVMStyle();
9297   // ObjC ignores IndentWrappedFunctionNames when wrapping methods
9298   // and always indents instead.
9299   Style.IndentWrappedFunctionNames = false;
9300   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
9301                "    veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
9302                "               anotherName:(NSString)bbbbbbbbbbbbbb {\n"
9303                "}",
9304                Style);
9305   Style.IndentWrappedFunctionNames = true;
9306   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
9307                "    veryLooooooooooongName:(NSString)cccccccccccccc\n"
9308                "               anotherName:(NSString)dddddddddddddd {\n"
9309                "}",
9310                Style);
9311 
9312   verifyFormat("- (int)sum:(vector<int>)numbers;");
9313   verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
9314   // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
9315   // protocol lists (but not for template classes):
9316   // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
9317 
9318   verifyFormat("- (int (*)())foo:(int (*)())f;");
9319   verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
9320 
9321   // If there's no return type (very rare in practice!), LLVM and Google style
9322   // agree.
9323   verifyFormat("- foo;");
9324   verifyFormat("- foo:(int)f;");
9325   verifyGoogleFormat("- foo:(int)foo;");
9326 }
9327 
9328 TEST_F(FormatTest, BreaksStringLiterals) {
9329   EXPECT_EQ("\"some text \"\n"
9330             "\"other\";",
9331             format("\"some text other\";", getLLVMStyleWithColumns(12)));
9332   EXPECT_EQ("\"some text \"\n"
9333             "\"other\";",
9334             format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
9335   EXPECT_EQ(
9336       "#define A  \\\n"
9337       "  \"some \"  \\\n"
9338       "  \"text \"  \\\n"
9339       "  \"other\";",
9340       format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
9341   EXPECT_EQ(
9342       "#define A  \\\n"
9343       "  \"so \"    \\\n"
9344       "  \"text \"  \\\n"
9345       "  \"other\";",
9346       format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
9347 
9348   EXPECT_EQ("\"some text\"",
9349             format("\"some text\"", getLLVMStyleWithColumns(1)));
9350   EXPECT_EQ("\"some text\"",
9351             format("\"some text\"", getLLVMStyleWithColumns(11)));
9352   EXPECT_EQ("\"some \"\n"
9353             "\"text\"",
9354             format("\"some text\"", getLLVMStyleWithColumns(10)));
9355   EXPECT_EQ("\"some \"\n"
9356             "\"text\"",
9357             format("\"some text\"", getLLVMStyleWithColumns(7)));
9358   EXPECT_EQ("\"some\"\n"
9359             "\" tex\"\n"
9360             "\"t\"",
9361             format("\"some text\"", getLLVMStyleWithColumns(6)));
9362   EXPECT_EQ("\"some\"\n"
9363             "\" tex\"\n"
9364             "\" and\"",
9365             format("\"some tex and\"", getLLVMStyleWithColumns(6)));
9366   EXPECT_EQ("\"some\"\n"
9367             "\"/tex\"\n"
9368             "\"/and\"",
9369             format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
9370 
9371   EXPECT_EQ("variable =\n"
9372             "    \"long string \"\n"
9373             "    \"literal\";",
9374             format("variable = \"long string literal\";",
9375                    getLLVMStyleWithColumns(20)));
9376 
9377   EXPECT_EQ("variable = f(\n"
9378             "    \"long string \"\n"
9379             "    \"literal\",\n"
9380             "    short,\n"
9381             "    loooooooooooooooooooong);",
9382             format("variable = f(\"long string literal\", short, "
9383                    "loooooooooooooooooooong);",
9384                    getLLVMStyleWithColumns(20)));
9385 
9386   EXPECT_EQ(
9387       "f(g(\"long string \"\n"
9388       "    \"literal\"),\n"
9389       "  b);",
9390       format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
9391   EXPECT_EQ("f(g(\"long string \"\n"
9392             "    \"literal\",\n"
9393             "    a),\n"
9394             "  b);",
9395             format("f(g(\"long string literal\", a), b);",
9396                    getLLVMStyleWithColumns(20)));
9397   EXPECT_EQ(
9398       "f(\"one two\".split(\n"
9399       "    variable));",
9400       format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
9401   EXPECT_EQ("f(\"one two three four five six \"\n"
9402             "  \"seven\".split(\n"
9403             "      really_looooong_variable));",
9404             format("f(\"one two three four five six seven\"."
9405                    "split(really_looooong_variable));",
9406                    getLLVMStyleWithColumns(33)));
9407 
9408   EXPECT_EQ("f(\"some \"\n"
9409             "  \"text\",\n"
9410             "  other);",
9411             format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
9412 
9413   // Only break as a last resort.
9414   verifyFormat(
9415       "aaaaaaaaaaaaaaaaaaaa(\n"
9416       "    aaaaaaaaaaaaaaaaaaaa,\n"
9417       "    aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
9418 
9419   EXPECT_EQ("\"splitmea\"\n"
9420             "\"trandomp\"\n"
9421             "\"oint\"",
9422             format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
9423 
9424   EXPECT_EQ("\"split/\"\n"
9425             "\"pathat/\"\n"
9426             "\"slashes\"",
9427             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
9428 
9429   EXPECT_EQ("\"split/\"\n"
9430             "\"pathat/\"\n"
9431             "\"slashes\"",
9432             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
9433   EXPECT_EQ("\"split at \"\n"
9434             "\"spaces/at/\"\n"
9435             "\"slashes.at.any$\"\n"
9436             "\"non-alphanumeric%\"\n"
9437             "\"1111111111characte\"\n"
9438             "\"rs\"",
9439             format("\"split at "
9440                    "spaces/at/"
9441                    "slashes.at."
9442                    "any$non-"
9443                    "alphanumeric%"
9444                    "1111111111characte"
9445                    "rs\"",
9446                    getLLVMStyleWithColumns(20)));
9447 
9448   // Verify that splitting the strings understands
9449   // Style::AlwaysBreakBeforeMultilineStrings.
9450   EXPECT_EQ("aaaaaaaaaaaa(\n"
9451             "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
9452             "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
9453             format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
9454                    "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
9455                    "aaaaaaaaaaaaaaaaaaaaaa\");",
9456                    getGoogleStyle()));
9457   EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
9458             "       \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
9459             format("return \"aaaaaaaaaaaaaaaaaaaaaa "
9460                    "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
9461                    "aaaaaaaaaaaaaaaaaaaaaa\";",
9462                    getGoogleStyle()));
9463   EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
9464             "                \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
9465             format("llvm::outs() << "
9466                    "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
9467                    "aaaaaaaaaaaaaaaaaaa\";"));
9468   EXPECT_EQ("ffff(\n"
9469             "    {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
9470             "     \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
9471             format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
9472                    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
9473                    getGoogleStyle()));
9474 
9475   FormatStyle Style = getLLVMStyleWithColumns(12);
9476   Style.BreakStringLiterals = false;
9477   EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
9478 
9479   FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
9480   AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
9481   EXPECT_EQ("#define A \\\n"
9482             "  \"some \" \\\n"
9483             "  \"text \" \\\n"
9484             "  \"other\";",
9485             format("#define A \"some text other\";", AlignLeft));
9486 }
9487 
9488 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) {
9489   EXPECT_EQ("C a = \"some more \"\n"
9490             "      \"text\";",
9491             format("C a = \"some more text\";", getLLVMStyleWithColumns(18)));
9492 }
9493 
9494 TEST_F(FormatTest, FullyRemoveEmptyLines) {
9495   FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
9496   NoEmptyLines.MaxEmptyLinesToKeep = 0;
9497   EXPECT_EQ("int i = a(b());",
9498             format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
9499 }
9500 
9501 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
9502   EXPECT_EQ(
9503       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9504       "(\n"
9505       "    \"x\t\");",
9506       format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9507              "aaaaaaa("
9508              "\"x\t\");"));
9509 }
9510 
9511 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
9512   EXPECT_EQ(
9513       "u8\"utf8 string \"\n"
9514       "u8\"literal\";",
9515       format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
9516   EXPECT_EQ(
9517       "u\"utf16 string \"\n"
9518       "u\"literal\";",
9519       format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
9520   EXPECT_EQ(
9521       "U\"utf32 string \"\n"
9522       "U\"literal\";",
9523       format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
9524   EXPECT_EQ("L\"wide string \"\n"
9525             "L\"literal\";",
9526             format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
9527   EXPECT_EQ("@\"NSString \"\n"
9528             "@\"literal\";",
9529             format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
9530   verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
9531 
9532   // This input makes clang-format try to split the incomplete unicode escape
9533   // sequence, which used to lead to a crasher.
9534   verifyNoCrash(
9535       "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
9536       getLLVMStyleWithColumns(60));
9537 }
9538 
9539 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
9540   FormatStyle Style = getGoogleStyleWithColumns(15);
9541   EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
9542   EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
9543   EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
9544   EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
9545   EXPECT_EQ("u8R\"x(raw literal)x\";",
9546             format("u8R\"x(raw literal)x\";", Style));
9547 }
9548 
9549 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
9550   FormatStyle Style = getLLVMStyleWithColumns(20);
9551   EXPECT_EQ(
9552       "_T(\"aaaaaaaaaaaaaa\")\n"
9553       "_T(\"aaaaaaaaaaaaaa\")\n"
9554       "_T(\"aaaaaaaaaaaa\")",
9555       format("  _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
9556   EXPECT_EQ("f(x,\n"
9557             "  _T(\"aaaaaaaaaaaa\")\n"
9558             "  _T(\"aaa\"),\n"
9559             "  z);",
9560             format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
9561 
9562   // FIXME: Handle embedded spaces in one iteration.
9563   //  EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
9564   //            "_T(\"aaaaaaaaaaaaa\")\n"
9565   //            "_T(\"aaaaaaaaaaaaa\")\n"
9566   //            "_T(\"a\")",
9567   //            format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
9568   //                   getLLVMStyleWithColumns(20)));
9569   EXPECT_EQ(
9570       "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
9571       format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
9572   EXPECT_EQ("f(\n"
9573             "#if !TEST\n"
9574             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
9575             "#endif\n"
9576             ");",
9577             format("f(\n"
9578                    "#if !TEST\n"
9579                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
9580                    "#endif\n"
9581                    ");"));
9582   EXPECT_EQ("f(\n"
9583             "\n"
9584             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
9585             format("f(\n"
9586                    "\n"
9587                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
9588 }
9589 
9590 TEST_F(FormatTest, BreaksStringLiteralOperands) {
9591   // In a function call with two operands, the second can be broken with no line
9592   // break before it.
9593   EXPECT_EQ(
9594       "func(a, \"long long \"\n"
9595       "        \"long long\");",
9596       format("func(a, \"long long long long\");", getLLVMStyleWithColumns(24)));
9597   // In a function call with three operands, the second must be broken with a
9598   // line break before it.
9599   EXPECT_EQ("func(a,\n"
9600             "     \"long long long \"\n"
9601             "     \"long\",\n"
9602             "     c);",
9603             format("func(a, \"long long long long\", c);",
9604                    getLLVMStyleWithColumns(24)));
9605   // In a function call with three operands, the third must be broken with a
9606   // line break before it.
9607   EXPECT_EQ("func(a, b,\n"
9608             "     \"long long long \"\n"
9609             "     \"long\");",
9610             format("func(a, b, \"long long long long\");",
9611                    getLLVMStyleWithColumns(24)));
9612   // In a function call with three operands, both the second and the third must
9613   // be broken with a line break before them.
9614   EXPECT_EQ("func(a,\n"
9615             "     \"long long long \"\n"
9616             "     \"long\",\n"
9617             "     \"long long long \"\n"
9618             "     \"long\");",
9619             format("func(a, \"long long long long\", \"long long long long\");",
9620                    getLLVMStyleWithColumns(24)));
9621   // In a chain of << with two operands, the second can be broken with no line
9622   // break before it.
9623   EXPECT_EQ("a << \"line line \"\n"
9624             "     \"line\";",
9625             format("a << \"line line line\";", getLLVMStyleWithColumns(20)));
9626   // In a chain of << with three operands, the second can be broken with no line
9627   // break before it.
9628   EXPECT_EQ(
9629       "abcde << \"line \"\n"
9630       "         \"line line\"\n"
9631       "      << c;",
9632       format("abcde << \"line line line\" << c;", getLLVMStyleWithColumns(20)));
9633   // In a chain of << with three operands, the third must be broken with a line
9634   // break before it.
9635   EXPECT_EQ(
9636       "a << b\n"
9637       "  << \"line line \"\n"
9638       "     \"line\";",
9639       format("a << b << \"line line line\";", getLLVMStyleWithColumns(20)));
9640   // In a chain of << with three operands, the second can be broken with no line
9641   // break before it and the third must be broken with a line break before it.
9642   EXPECT_EQ("abcd << \"line line \"\n"
9643             "        \"line\"\n"
9644             "     << \"line line \"\n"
9645             "        \"line\";",
9646             format("abcd << \"line line line\" << \"line line line\";",
9647                    getLLVMStyleWithColumns(20)));
9648   // In a chain of binary operators with two operands, the second can be broken
9649   // with no line break before it.
9650   EXPECT_EQ(
9651       "abcd + \"line line \"\n"
9652       "       \"line line\";",
9653       format("abcd + \"line line line line\";", getLLVMStyleWithColumns(20)));
9654   // In a chain of binary operators with three operands, the second must be
9655   // broken with a line break before it.
9656   EXPECT_EQ("abcd +\n"
9657             "    \"line line \"\n"
9658             "    \"line line\" +\n"
9659             "    e;",
9660             format("abcd + \"line line line line\" + e;",
9661                    getLLVMStyleWithColumns(20)));
9662   // In a function call with two operands, with AlignAfterOpenBracket enabled,
9663   // the first must be broken with a line break before it.
9664   FormatStyle Style = getLLVMStyleWithColumns(25);
9665   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
9666   EXPECT_EQ("someFunction(\n"
9667             "    \"long long long \"\n"
9668             "    \"long\",\n"
9669             "    a);",
9670             format("someFunction(\"long long long long\", a);", Style));
9671 }
9672 
9673 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
9674   EXPECT_EQ(
9675       "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
9676       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
9677       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
9678       format("aaaaaaaaaaa  =  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
9679              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
9680              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
9681 }
9682 
9683 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
9684   EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
9685             format("f(g(R\"x(raw literal)x\",   a), b);", getGoogleStyle()));
9686   EXPECT_EQ("fffffffffff(g(R\"x(\n"
9687             "multiline raw string literal xxxxxxxxxxxxxx\n"
9688             ")x\",\n"
9689             "              a),\n"
9690             "            b);",
9691             format("fffffffffff(g(R\"x(\n"
9692                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9693                    ")x\", a), b);",
9694                    getGoogleStyleWithColumns(20)));
9695   EXPECT_EQ("fffffffffff(\n"
9696             "    g(R\"x(qqq\n"
9697             "multiline raw string literal xxxxxxxxxxxxxx\n"
9698             ")x\",\n"
9699             "      a),\n"
9700             "    b);",
9701             format("fffffffffff(g(R\"x(qqq\n"
9702                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9703                    ")x\", a), b);",
9704                    getGoogleStyleWithColumns(20)));
9705 
9706   EXPECT_EQ("fffffffffff(R\"x(\n"
9707             "multiline raw string literal xxxxxxxxxxxxxx\n"
9708             ")x\");",
9709             format("fffffffffff(R\"x(\n"
9710                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9711                    ")x\");",
9712                    getGoogleStyleWithColumns(20)));
9713   EXPECT_EQ("fffffffffff(R\"x(\n"
9714             "multiline raw string literal xxxxxxxxxxxxxx\n"
9715             ")x\" + bbbbbb);",
9716             format("fffffffffff(R\"x(\n"
9717                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9718                    ")x\" +   bbbbbb);",
9719                    getGoogleStyleWithColumns(20)));
9720   EXPECT_EQ("fffffffffff(\n"
9721             "    R\"x(\n"
9722             "multiline raw string literal xxxxxxxxxxxxxx\n"
9723             ")x\" +\n"
9724             "    bbbbbb);",
9725             format("fffffffffff(\n"
9726                    " R\"x(\n"
9727                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9728                    ")x\" + bbbbbb);",
9729                    getGoogleStyleWithColumns(20)));
9730   EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);",
9731             format("fffffffffff(\n"
9732                    " R\"(single line raw string)\" + bbbbbb);"));
9733 }
9734 
9735 TEST_F(FormatTest, SkipsUnknownStringLiterals) {
9736   verifyFormat("string a = \"unterminated;");
9737   EXPECT_EQ("function(\"unterminated,\n"
9738             "         OtherParameter);",
9739             format("function(  \"unterminated,\n"
9740                    "    OtherParameter);"));
9741 }
9742 
9743 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
9744   FormatStyle Style = getLLVMStyle();
9745   Style.Standard = FormatStyle::LS_Cpp03;
9746   EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
9747             format("#define x(_a) printf(\"foo\"_a);", Style));
9748 }
9749 
9750 TEST_F(FormatTest, CppLexVersion) {
9751   FormatStyle Style = getLLVMStyle();
9752   // Formatting of x * y differs if x is a type.
9753   verifyFormat("void foo() { MACRO(a * b); }", Style);
9754   verifyFormat("void foo() { MACRO(int *b); }", Style);
9755 
9756   // LLVM style uses latest lexer.
9757   verifyFormat("void foo() { MACRO(char8_t *b); }", Style);
9758   Style.Standard = FormatStyle::LS_Cpp17;
9759   // But in c++17, char8_t isn't a keyword.
9760   verifyFormat("void foo() { MACRO(char8_t * b); }", Style);
9761 }
9762 
9763 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
9764 
9765 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
9766   EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
9767             "             \"ddeeefff\");",
9768             format("someFunction(\"aaabbbcccdddeeefff\");",
9769                    getLLVMStyleWithColumns(25)));
9770   EXPECT_EQ("someFunction1234567890(\n"
9771             "    \"aaabbbcccdddeeefff\");",
9772             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
9773                    getLLVMStyleWithColumns(26)));
9774   EXPECT_EQ("someFunction1234567890(\n"
9775             "    \"aaabbbcccdddeeeff\"\n"
9776             "    \"f\");",
9777             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
9778                    getLLVMStyleWithColumns(25)));
9779   EXPECT_EQ("someFunction1234567890(\n"
9780             "    \"aaabbbcccdddeeeff\"\n"
9781             "    \"f\");",
9782             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
9783                    getLLVMStyleWithColumns(24)));
9784   EXPECT_EQ("someFunction(\n"
9785             "    \"aaabbbcc ddde \"\n"
9786             "    \"efff\");",
9787             format("someFunction(\"aaabbbcc ddde efff\");",
9788                    getLLVMStyleWithColumns(25)));
9789   EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
9790             "             \"ddeeefff\");",
9791             format("someFunction(\"aaabbbccc ddeeefff\");",
9792                    getLLVMStyleWithColumns(25)));
9793   EXPECT_EQ("someFunction1234567890(\n"
9794             "    \"aaabb \"\n"
9795             "    \"cccdddeeefff\");",
9796             format("someFunction1234567890(\"aaabb cccdddeeefff\");",
9797                    getLLVMStyleWithColumns(25)));
9798   EXPECT_EQ("#define A          \\\n"
9799             "  string s =       \\\n"
9800             "      \"123456789\"  \\\n"
9801             "      \"0\";         \\\n"
9802             "  int i;",
9803             format("#define A string s = \"1234567890\"; int i;",
9804                    getLLVMStyleWithColumns(20)));
9805   EXPECT_EQ("someFunction(\n"
9806             "    \"aaabbbcc \"\n"
9807             "    \"dddeeefff\");",
9808             format("someFunction(\"aaabbbcc dddeeefff\");",
9809                    getLLVMStyleWithColumns(25)));
9810 }
9811 
9812 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
9813   EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
9814   EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
9815   EXPECT_EQ("\"test\"\n"
9816             "\"\\n\"",
9817             format("\"test\\n\"", getLLVMStyleWithColumns(7)));
9818   EXPECT_EQ("\"tes\\\\\"\n"
9819             "\"n\"",
9820             format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
9821   EXPECT_EQ("\"\\\\\\\\\"\n"
9822             "\"\\n\"",
9823             format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
9824   EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
9825   EXPECT_EQ("\"\\uff01\"\n"
9826             "\"test\"",
9827             format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
9828   EXPECT_EQ("\"\\Uff01ff02\"",
9829             format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
9830   EXPECT_EQ("\"\\x000000000001\"\n"
9831             "\"next\"",
9832             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
9833   EXPECT_EQ("\"\\x000000000001next\"",
9834             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
9835   EXPECT_EQ("\"\\x000000000001\"",
9836             format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
9837   EXPECT_EQ("\"test\"\n"
9838             "\"\\000000\"\n"
9839             "\"000001\"",
9840             format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
9841   EXPECT_EQ("\"test\\000\"\n"
9842             "\"00000000\"\n"
9843             "\"1\"",
9844             format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
9845 }
9846 
9847 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
9848   verifyFormat("void f() {\n"
9849                "  return g() {}\n"
9850                "  void h() {}");
9851   verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
9852                "g();\n"
9853                "}");
9854 }
9855 
9856 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
9857   verifyFormat(
9858       "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
9859 }
9860 
9861 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
9862   verifyFormat("class X {\n"
9863                "  void f() {\n"
9864                "  }\n"
9865                "};",
9866                getLLVMStyleWithColumns(12));
9867 }
9868 
9869 TEST_F(FormatTest, ConfigurableIndentWidth) {
9870   FormatStyle EightIndent = getLLVMStyleWithColumns(18);
9871   EightIndent.IndentWidth = 8;
9872   EightIndent.ContinuationIndentWidth = 8;
9873   verifyFormat("void f() {\n"
9874                "        someFunction();\n"
9875                "        if (true) {\n"
9876                "                f();\n"
9877                "        }\n"
9878                "}",
9879                EightIndent);
9880   verifyFormat("class X {\n"
9881                "        void f() {\n"
9882                "        }\n"
9883                "};",
9884                EightIndent);
9885   verifyFormat("int x[] = {\n"
9886                "        call(),\n"
9887                "        call()};",
9888                EightIndent);
9889 }
9890 
9891 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
9892   verifyFormat("double\n"
9893                "f();",
9894                getLLVMStyleWithColumns(8));
9895 }
9896 
9897 TEST_F(FormatTest, ConfigurableUseOfTab) {
9898   FormatStyle Tab = getLLVMStyleWithColumns(42);
9899   Tab.IndentWidth = 8;
9900   Tab.UseTab = FormatStyle::UT_Always;
9901   Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
9902 
9903   EXPECT_EQ("if (aaaaaaaa && // q\n"
9904             "    bb)\t\t// w\n"
9905             "\t;",
9906             format("if (aaaaaaaa &&// q\n"
9907                    "bb)// w\n"
9908                    ";",
9909                    Tab));
9910   EXPECT_EQ("if (aaa && bbb) // w\n"
9911             "\t;",
9912             format("if(aaa&&bbb)// w\n"
9913                    ";",
9914                    Tab));
9915 
9916   verifyFormat("class X {\n"
9917                "\tvoid f() {\n"
9918                "\t\tsomeFunction(parameter1,\n"
9919                "\t\t\t     parameter2);\n"
9920                "\t}\n"
9921                "};",
9922                Tab);
9923   verifyFormat("#define A                        \\\n"
9924                "\tvoid f() {               \\\n"
9925                "\t\tsomeFunction(    \\\n"
9926                "\t\t    parameter1,  \\\n"
9927                "\t\t    parameter2); \\\n"
9928                "\t}",
9929                Tab);
9930   verifyFormat("int a;\t      // x\n"
9931                "int bbbbbbbb; // x\n",
9932                Tab);
9933 
9934   Tab.TabWidth = 4;
9935   Tab.IndentWidth = 8;
9936   verifyFormat("class TabWidth4Indent8 {\n"
9937                "\t\tvoid f() {\n"
9938                "\t\t\t\tsomeFunction(parameter1,\n"
9939                "\t\t\t\t\t\t\t parameter2);\n"
9940                "\t\t}\n"
9941                "};",
9942                Tab);
9943 
9944   Tab.TabWidth = 4;
9945   Tab.IndentWidth = 4;
9946   verifyFormat("class TabWidth4Indent4 {\n"
9947                "\tvoid f() {\n"
9948                "\t\tsomeFunction(parameter1,\n"
9949                "\t\t\t\t\t parameter2);\n"
9950                "\t}\n"
9951                "};",
9952                Tab);
9953 
9954   Tab.TabWidth = 8;
9955   Tab.IndentWidth = 4;
9956   verifyFormat("class TabWidth8Indent4 {\n"
9957                "    void f() {\n"
9958                "\tsomeFunction(parameter1,\n"
9959                "\t\t     parameter2);\n"
9960                "    }\n"
9961                "};",
9962                Tab);
9963 
9964   Tab.TabWidth = 8;
9965   Tab.IndentWidth = 8;
9966   EXPECT_EQ("/*\n"
9967             "\t      a\t\tcomment\n"
9968             "\t      in multiple lines\n"
9969             "       */",
9970             format("   /*\t \t \n"
9971                    " \t \t a\t\tcomment\t \t\n"
9972                    " \t \t in multiple lines\t\n"
9973                    " \t  */",
9974                    Tab));
9975 
9976   Tab.UseTab = FormatStyle::UT_ForIndentation;
9977   verifyFormat("{\n"
9978                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9979                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9980                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9981                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9982                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9983                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9984                "};",
9985                Tab);
9986   verifyFormat("enum AA {\n"
9987                "\ta1, // Force multiple lines\n"
9988                "\ta2,\n"
9989                "\ta3\n"
9990                "};",
9991                Tab);
9992   EXPECT_EQ("if (aaaaaaaa && // q\n"
9993             "    bb)         // w\n"
9994             "\t;",
9995             format("if (aaaaaaaa &&// q\n"
9996                    "bb)// w\n"
9997                    ";",
9998                    Tab));
9999   verifyFormat("class X {\n"
10000                "\tvoid f() {\n"
10001                "\t\tsomeFunction(parameter1,\n"
10002                "\t\t             parameter2);\n"
10003                "\t}\n"
10004                "};",
10005                Tab);
10006   verifyFormat("{\n"
10007                "\tQ(\n"
10008                "\t    {\n"
10009                "\t\t    int a;\n"
10010                "\t\t    someFunction(aaaaaaaa,\n"
10011                "\t\t                 bbbbbbb);\n"
10012                "\t    },\n"
10013                "\t    p);\n"
10014                "}",
10015                Tab);
10016   EXPECT_EQ("{\n"
10017             "\t/* aaaa\n"
10018             "\t   bbbb */\n"
10019             "}",
10020             format("{\n"
10021                    "/* aaaa\n"
10022                    "   bbbb */\n"
10023                    "}",
10024                    Tab));
10025   EXPECT_EQ("{\n"
10026             "\t/*\n"
10027             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10028             "\t  bbbbbbbbbbbbb\n"
10029             "\t*/\n"
10030             "}",
10031             format("{\n"
10032                    "/*\n"
10033                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10034                    "*/\n"
10035                    "}",
10036                    Tab));
10037   EXPECT_EQ("{\n"
10038             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10039             "\t// bbbbbbbbbbbbb\n"
10040             "}",
10041             format("{\n"
10042                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10043                    "}",
10044                    Tab));
10045   EXPECT_EQ("{\n"
10046             "\t/*\n"
10047             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10048             "\t  bbbbbbbbbbbbb\n"
10049             "\t*/\n"
10050             "}",
10051             format("{\n"
10052                    "\t/*\n"
10053                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10054                    "\t*/\n"
10055                    "}",
10056                    Tab));
10057   EXPECT_EQ("{\n"
10058             "\t/*\n"
10059             "\n"
10060             "\t*/\n"
10061             "}",
10062             format("{\n"
10063                    "\t/*\n"
10064                    "\n"
10065                    "\t*/\n"
10066                    "}",
10067                    Tab));
10068   EXPECT_EQ("{\n"
10069             "\t/*\n"
10070             " asdf\n"
10071             "\t*/\n"
10072             "}",
10073             format("{\n"
10074                    "\t/*\n"
10075                    " asdf\n"
10076                    "\t*/\n"
10077                    "}",
10078                    Tab));
10079 
10080   Tab.UseTab = FormatStyle::UT_Never;
10081   EXPECT_EQ("/*\n"
10082             "              a\t\tcomment\n"
10083             "              in multiple lines\n"
10084             "       */",
10085             format("   /*\t \t \n"
10086                    " \t \t a\t\tcomment\t \t\n"
10087                    " \t \t in multiple lines\t\n"
10088                    " \t  */",
10089                    Tab));
10090   EXPECT_EQ("/* some\n"
10091             "   comment */",
10092             format(" \t \t /* some\n"
10093                    " \t \t    comment */",
10094                    Tab));
10095   EXPECT_EQ("int a; /* some\n"
10096             "   comment */",
10097             format(" \t \t int a; /* some\n"
10098                    " \t \t    comment */",
10099                    Tab));
10100 
10101   EXPECT_EQ("int a; /* some\n"
10102             "comment */",
10103             format(" \t \t int\ta; /* some\n"
10104                    " \t \t    comment */",
10105                    Tab));
10106   EXPECT_EQ("f(\"\t\t\"); /* some\n"
10107             "    comment */",
10108             format(" \t \t f(\"\t\t\"); /* some\n"
10109                    " \t \t    comment */",
10110                    Tab));
10111   EXPECT_EQ("{\n"
10112             "  /*\n"
10113             "   * Comment\n"
10114             "   */\n"
10115             "  int i;\n"
10116             "}",
10117             format("{\n"
10118                    "\t/*\n"
10119                    "\t * Comment\n"
10120                    "\t */\n"
10121                    "\t int i;\n"
10122                    "}"));
10123 
10124   Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
10125   Tab.TabWidth = 8;
10126   Tab.IndentWidth = 8;
10127   EXPECT_EQ("if (aaaaaaaa && // q\n"
10128             "    bb)         // w\n"
10129             "\t;",
10130             format("if (aaaaaaaa &&// q\n"
10131                    "bb)// w\n"
10132                    ";",
10133                    Tab));
10134   EXPECT_EQ("if (aaa && bbb) // w\n"
10135             "\t;",
10136             format("if(aaa&&bbb)// w\n"
10137                    ";",
10138                    Tab));
10139   verifyFormat("class X {\n"
10140                "\tvoid f() {\n"
10141                "\t\tsomeFunction(parameter1,\n"
10142                "\t\t\t     parameter2);\n"
10143                "\t}\n"
10144                "};",
10145                Tab);
10146   verifyFormat("#define A                        \\\n"
10147                "\tvoid f() {               \\\n"
10148                "\t\tsomeFunction(    \\\n"
10149                "\t\t    parameter1,  \\\n"
10150                "\t\t    parameter2); \\\n"
10151                "\t}",
10152                Tab);
10153   Tab.TabWidth = 4;
10154   Tab.IndentWidth = 8;
10155   verifyFormat("class TabWidth4Indent8 {\n"
10156                "\t\tvoid f() {\n"
10157                "\t\t\t\tsomeFunction(parameter1,\n"
10158                "\t\t\t\t\t\t\t parameter2);\n"
10159                "\t\t}\n"
10160                "};",
10161                Tab);
10162   Tab.TabWidth = 4;
10163   Tab.IndentWidth = 4;
10164   verifyFormat("class TabWidth4Indent4 {\n"
10165                "\tvoid f() {\n"
10166                "\t\tsomeFunction(parameter1,\n"
10167                "\t\t\t\t\t parameter2);\n"
10168                "\t}\n"
10169                "};",
10170                Tab);
10171   Tab.TabWidth = 8;
10172   Tab.IndentWidth = 4;
10173   verifyFormat("class TabWidth8Indent4 {\n"
10174                "    void f() {\n"
10175                "\tsomeFunction(parameter1,\n"
10176                "\t\t     parameter2);\n"
10177                "    }\n"
10178                "};",
10179                Tab);
10180   Tab.TabWidth = 8;
10181   Tab.IndentWidth = 8;
10182   EXPECT_EQ("/*\n"
10183             "\t      a\t\tcomment\n"
10184             "\t      in multiple lines\n"
10185             "       */",
10186             format("   /*\t \t \n"
10187                    " \t \t a\t\tcomment\t \t\n"
10188                    " \t \t in multiple lines\t\n"
10189                    " \t  */",
10190                    Tab));
10191   verifyFormat("{\n"
10192                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10193                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10194                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10195                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10196                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10197                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10198                "};",
10199                Tab);
10200   verifyFormat("enum AA {\n"
10201                "\ta1, // Force multiple lines\n"
10202                "\ta2,\n"
10203                "\ta3\n"
10204                "};",
10205                Tab);
10206   EXPECT_EQ("if (aaaaaaaa && // q\n"
10207             "    bb)         // w\n"
10208             "\t;",
10209             format("if (aaaaaaaa &&// q\n"
10210                    "bb)// w\n"
10211                    ";",
10212                    Tab));
10213   verifyFormat("class X {\n"
10214                "\tvoid f() {\n"
10215                "\t\tsomeFunction(parameter1,\n"
10216                "\t\t\t     parameter2);\n"
10217                "\t}\n"
10218                "};",
10219                Tab);
10220   verifyFormat("{\n"
10221                "\tQ(\n"
10222                "\t    {\n"
10223                "\t\t    int a;\n"
10224                "\t\t    someFunction(aaaaaaaa,\n"
10225                "\t\t\t\t bbbbbbb);\n"
10226                "\t    },\n"
10227                "\t    p);\n"
10228                "}",
10229                Tab);
10230   EXPECT_EQ("{\n"
10231             "\t/* aaaa\n"
10232             "\t   bbbb */\n"
10233             "}",
10234             format("{\n"
10235                    "/* aaaa\n"
10236                    "   bbbb */\n"
10237                    "}",
10238                    Tab));
10239   EXPECT_EQ("{\n"
10240             "\t/*\n"
10241             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10242             "\t  bbbbbbbbbbbbb\n"
10243             "\t*/\n"
10244             "}",
10245             format("{\n"
10246                    "/*\n"
10247                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10248                    "*/\n"
10249                    "}",
10250                    Tab));
10251   EXPECT_EQ("{\n"
10252             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10253             "\t// bbbbbbbbbbbbb\n"
10254             "}",
10255             format("{\n"
10256                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10257                    "}",
10258                    Tab));
10259   EXPECT_EQ("{\n"
10260             "\t/*\n"
10261             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10262             "\t  bbbbbbbbbbbbb\n"
10263             "\t*/\n"
10264             "}",
10265             format("{\n"
10266                    "\t/*\n"
10267                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10268                    "\t*/\n"
10269                    "}",
10270                    Tab));
10271   EXPECT_EQ("{\n"
10272             "\t/*\n"
10273             "\n"
10274             "\t*/\n"
10275             "}",
10276             format("{\n"
10277                    "\t/*\n"
10278                    "\n"
10279                    "\t*/\n"
10280                    "}",
10281                    Tab));
10282   EXPECT_EQ("{\n"
10283             "\t/*\n"
10284             " asdf\n"
10285             "\t*/\n"
10286             "}",
10287             format("{\n"
10288                    "\t/*\n"
10289                    " asdf\n"
10290                    "\t*/\n"
10291                    "}",
10292                    Tab));
10293   EXPECT_EQ("/*\n"
10294             "\t      a\t\tcomment\n"
10295             "\t      in multiple lines\n"
10296             "       */",
10297             format("   /*\t \t \n"
10298                    " \t \t a\t\tcomment\t \t\n"
10299                    " \t \t in multiple lines\t\n"
10300                    " \t  */",
10301                    Tab));
10302   EXPECT_EQ("/* some\n"
10303             "   comment */",
10304             format(" \t \t /* some\n"
10305                    " \t \t    comment */",
10306                    Tab));
10307   EXPECT_EQ("int a; /* some\n"
10308             "   comment */",
10309             format(" \t \t int a; /* some\n"
10310                    " \t \t    comment */",
10311                    Tab));
10312   EXPECT_EQ("int a; /* some\n"
10313             "comment */",
10314             format(" \t \t int\ta; /* some\n"
10315                    " \t \t    comment */",
10316                    Tab));
10317   EXPECT_EQ("f(\"\t\t\"); /* some\n"
10318             "    comment */",
10319             format(" \t \t f(\"\t\t\"); /* some\n"
10320                    " \t \t    comment */",
10321                    Tab));
10322   EXPECT_EQ("{\n"
10323             "  /*\n"
10324             "   * Comment\n"
10325             "   */\n"
10326             "  int i;\n"
10327             "}",
10328             format("{\n"
10329                    "\t/*\n"
10330                    "\t * Comment\n"
10331                    "\t */\n"
10332                    "\t int i;\n"
10333                    "}"));
10334   Tab.AlignConsecutiveAssignments = true;
10335   Tab.AlignConsecutiveDeclarations = true;
10336   Tab.TabWidth = 4;
10337   Tab.IndentWidth = 4;
10338   verifyFormat("class Assign {\n"
10339                "\tvoid f() {\n"
10340                "\t\tint         x      = 123;\n"
10341                "\t\tint         random = 4;\n"
10342                "\t\tstd::string alphabet =\n"
10343                "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
10344                "\t}\n"
10345                "};",
10346                Tab);
10347 }
10348 
10349 TEST_F(FormatTest, ZeroTabWidth) {
10350   FormatStyle Tab = getLLVMStyleWithColumns(42);
10351   Tab.IndentWidth = 8;
10352   Tab.UseTab = FormatStyle::UT_Never;
10353   Tab.TabWidth = 0;
10354   EXPECT_EQ("void a(){\n"
10355             "    // line starts with '\t'\n"
10356             "};",
10357             format("void a(){\n"
10358                    "\t// line starts with '\t'\n"
10359                    "};",
10360                    Tab));
10361 
10362   EXPECT_EQ("void a(){\n"
10363             "    // line starts with '\t'\n"
10364             "};",
10365             format("void a(){\n"
10366                    "\t\t// line starts with '\t'\n"
10367                    "};",
10368                    Tab));
10369 
10370   Tab.UseTab = FormatStyle::UT_ForIndentation;
10371   EXPECT_EQ("void a(){\n"
10372             "    // line starts with '\t'\n"
10373             "};",
10374             format("void a(){\n"
10375                    "\t// line starts with '\t'\n"
10376                    "};",
10377                    Tab));
10378 
10379   EXPECT_EQ("void a(){\n"
10380             "    // line starts with '\t'\n"
10381             "};",
10382             format("void a(){\n"
10383                    "\t\t// line starts with '\t'\n"
10384                    "};",
10385                    Tab));
10386 
10387   Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
10388   EXPECT_EQ("void a(){\n"
10389             "    // line starts with '\t'\n"
10390             "};",
10391             format("void a(){\n"
10392                    "\t// line starts with '\t'\n"
10393                    "};",
10394                    Tab));
10395 
10396   EXPECT_EQ("void a(){\n"
10397             "    // line starts with '\t'\n"
10398             "};",
10399             format("void a(){\n"
10400                    "\t\t// line starts with '\t'\n"
10401                    "};",
10402                    Tab));
10403 
10404   Tab.UseTab = FormatStyle::UT_Always;
10405   EXPECT_EQ("void a(){\n"
10406             "// line starts with '\t'\n"
10407             "};",
10408             format("void a(){\n"
10409                    "\t// line starts with '\t'\n"
10410                    "};",
10411                    Tab));
10412 
10413   EXPECT_EQ("void a(){\n"
10414             "// line starts with '\t'\n"
10415             "};",
10416             format("void a(){\n"
10417                    "\t\t// line starts with '\t'\n"
10418                    "};",
10419                    Tab));
10420 }
10421 
10422 TEST_F(FormatTest, CalculatesOriginalColumn) {
10423   EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
10424             "q\"; /* some\n"
10425             "       comment */",
10426             format("  \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
10427                    "q\"; /* some\n"
10428                    "       comment */",
10429                    getLLVMStyle()));
10430   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
10431             "/* some\n"
10432             "   comment */",
10433             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
10434                    " /* some\n"
10435                    "    comment */",
10436                    getLLVMStyle()));
10437   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
10438             "qqq\n"
10439             "/* some\n"
10440             "   comment */",
10441             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
10442                    "qqq\n"
10443                    " /* some\n"
10444                    "    comment */",
10445                    getLLVMStyle()));
10446   EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
10447             "wwww; /* some\n"
10448             "         comment */",
10449             format("  inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
10450                    "wwww; /* some\n"
10451                    "         comment */",
10452                    getLLVMStyle()));
10453 }
10454 
10455 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
10456   FormatStyle NoSpace = getLLVMStyle();
10457   NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
10458 
10459   verifyFormat("while(true)\n"
10460                "  continue;",
10461                NoSpace);
10462   verifyFormat("for(;;)\n"
10463                "  continue;",
10464                NoSpace);
10465   verifyFormat("if(true)\n"
10466                "  f();\n"
10467                "else if(true)\n"
10468                "  f();",
10469                NoSpace);
10470   verifyFormat("do {\n"
10471                "  do_something();\n"
10472                "} while(something());",
10473                NoSpace);
10474   verifyFormat("switch(x) {\n"
10475                "default:\n"
10476                "  break;\n"
10477                "}",
10478                NoSpace);
10479   verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
10480   verifyFormat("size_t x = sizeof(x);", NoSpace);
10481   verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
10482   verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
10483   verifyFormat("alignas(128) char a[128];", NoSpace);
10484   verifyFormat("size_t x = alignof(MyType);", NoSpace);
10485   verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
10486   verifyFormat("int f() throw(Deprecated);", NoSpace);
10487   verifyFormat("typedef void (*cb)(int);", NoSpace);
10488   verifyFormat("T A::operator()();", NoSpace);
10489   verifyFormat("X A::operator++(T);", NoSpace);
10490   verifyFormat("auto lambda = []() { return 0; };", NoSpace);
10491 
10492   FormatStyle Space = getLLVMStyle();
10493   Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
10494 
10495   verifyFormat("int f ();", Space);
10496   verifyFormat("void f (int a, T b) {\n"
10497                "  while (true)\n"
10498                "    continue;\n"
10499                "}",
10500                Space);
10501   verifyFormat("if (true)\n"
10502                "  f ();\n"
10503                "else if (true)\n"
10504                "  f ();",
10505                Space);
10506   verifyFormat("do {\n"
10507                "  do_something ();\n"
10508                "} while (something ());",
10509                Space);
10510   verifyFormat("switch (x) {\n"
10511                "default:\n"
10512                "  break;\n"
10513                "}",
10514                Space);
10515   verifyFormat("A::A () : a (1) {}", Space);
10516   verifyFormat("void f () __attribute__ ((asdf));", Space);
10517   verifyFormat("*(&a + 1);\n"
10518                "&((&a)[1]);\n"
10519                "a[(b + c) * d];\n"
10520                "(((a + 1) * 2) + 3) * 4;",
10521                Space);
10522   verifyFormat("#define A(x) x", Space);
10523   verifyFormat("#define A (x) x", Space);
10524   verifyFormat("#if defined(x)\n"
10525                "#endif",
10526                Space);
10527   verifyFormat("auto i = std::make_unique<int> (5);", Space);
10528   verifyFormat("size_t x = sizeof (x);", Space);
10529   verifyFormat("auto f (int x) -> decltype (x);", Space);
10530   verifyFormat("int f (T x) noexcept (x.create ());", Space);
10531   verifyFormat("alignas (128) char a[128];", Space);
10532   verifyFormat("size_t x = alignof (MyType);", Space);
10533   verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
10534   verifyFormat("int f () throw (Deprecated);", Space);
10535   verifyFormat("typedef void (*cb) (int);", Space);
10536   verifyFormat("T A::operator() ();", Space);
10537   verifyFormat("X A::operator++ (T);", Space);
10538   verifyFormat("auto lambda = [] () { return 0; };", Space);
10539   verifyFormat("int x = int (y);", Space);
10540 
10541   FormatStyle SomeSpace = getLLVMStyle();
10542   SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses;
10543 
10544   verifyFormat("[]() -> float {}", SomeSpace);
10545   verifyFormat("[] (auto foo) {}", SomeSpace);
10546   verifyFormat("[foo]() -> int {}", SomeSpace);
10547   verifyFormat("int f();", SomeSpace);
10548   verifyFormat("void f (int a, T b) {\n"
10549                "  while (true)\n"
10550                "    continue;\n"
10551                "}",
10552                SomeSpace);
10553   verifyFormat("if (true)\n"
10554                "  f();\n"
10555                "else if (true)\n"
10556                "  f();",
10557                SomeSpace);
10558   verifyFormat("do {\n"
10559                "  do_something();\n"
10560                "} while (something());",
10561                SomeSpace);
10562   verifyFormat("switch (x) {\n"
10563                "default:\n"
10564                "  break;\n"
10565                "}",
10566                SomeSpace);
10567   verifyFormat("A::A() : a (1) {}", SomeSpace);
10568   verifyFormat("void f() __attribute__ ((asdf));", SomeSpace);
10569   verifyFormat("*(&a + 1);\n"
10570                "&((&a)[1]);\n"
10571                "a[(b + c) * d];\n"
10572                "(((a + 1) * 2) + 3) * 4;",
10573                SomeSpace);
10574   verifyFormat("#define A(x) x", SomeSpace);
10575   verifyFormat("#define A (x) x", SomeSpace);
10576   verifyFormat("#if defined(x)\n"
10577                "#endif",
10578                SomeSpace);
10579   verifyFormat("auto i = std::make_unique<int> (5);", SomeSpace);
10580   verifyFormat("size_t x = sizeof (x);", SomeSpace);
10581   verifyFormat("auto f (int x) -> decltype (x);", SomeSpace);
10582   verifyFormat("int f (T x) noexcept (x.create());", SomeSpace);
10583   verifyFormat("alignas (128) char a[128];", SomeSpace);
10584   verifyFormat("size_t x = alignof (MyType);", SomeSpace);
10585   verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");",
10586                SomeSpace);
10587   verifyFormat("int f() throw (Deprecated);", SomeSpace);
10588   verifyFormat("typedef void (*cb) (int);", SomeSpace);
10589   verifyFormat("T A::operator()();", SomeSpace);
10590   verifyFormat("X A::operator++ (T);", SomeSpace);
10591   verifyFormat("int x = int (y);", SomeSpace);
10592   verifyFormat("auto lambda = []() { return 0; };", SomeSpace);
10593 }
10594 
10595 TEST_F(FormatTest, SpaceAfterLogicalNot) {
10596   FormatStyle Spaces = getLLVMStyle();
10597   Spaces.SpaceAfterLogicalNot = true;
10598 
10599   verifyFormat("bool x = ! y", Spaces);
10600   verifyFormat("if (! isFailure())", Spaces);
10601   verifyFormat("if (! (a && b))", Spaces);
10602   verifyFormat("\"Error!\"", Spaces);
10603   verifyFormat("! ! x", Spaces);
10604 }
10605 
10606 TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
10607   FormatStyle Spaces = getLLVMStyle();
10608 
10609   Spaces.SpacesInParentheses = true;
10610   verifyFormat("do_something( ::globalVar );", Spaces);
10611   verifyFormat("call( x, y, z );", Spaces);
10612   verifyFormat("call();", Spaces);
10613   verifyFormat("std::function<void( int, int )> callback;", Spaces);
10614   verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
10615                Spaces);
10616   verifyFormat("while ( (bool)1 )\n"
10617                "  continue;",
10618                Spaces);
10619   verifyFormat("for ( ;; )\n"
10620                "  continue;",
10621                Spaces);
10622   verifyFormat("if ( true )\n"
10623                "  f();\n"
10624                "else if ( true )\n"
10625                "  f();",
10626                Spaces);
10627   verifyFormat("do {\n"
10628                "  do_something( (int)i );\n"
10629                "} while ( something() );",
10630                Spaces);
10631   verifyFormat("switch ( x ) {\n"
10632                "default:\n"
10633                "  break;\n"
10634                "}",
10635                Spaces);
10636 
10637   Spaces.SpacesInParentheses = false;
10638   Spaces.SpacesInCStyleCastParentheses = true;
10639   verifyFormat("Type *A = ( Type * )P;", Spaces);
10640   verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
10641   verifyFormat("x = ( int32 )y;", Spaces);
10642   verifyFormat("int a = ( int )(2.0f);", Spaces);
10643   verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
10644   verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
10645   verifyFormat("#define x (( int )-1)", Spaces);
10646 
10647   // Run the first set of tests again with:
10648   Spaces.SpacesInParentheses = false;
10649   Spaces.SpaceInEmptyParentheses = true;
10650   Spaces.SpacesInCStyleCastParentheses = true;
10651   verifyFormat("call(x, y, z);", Spaces);
10652   verifyFormat("call( );", Spaces);
10653   verifyFormat("std::function<void(int, int)> callback;", Spaces);
10654   verifyFormat("while (( bool )1)\n"
10655                "  continue;",
10656                Spaces);
10657   verifyFormat("for (;;)\n"
10658                "  continue;",
10659                Spaces);
10660   verifyFormat("if (true)\n"
10661                "  f( );\n"
10662                "else if (true)\n"
10663                "  f( );",
10664                Spaces);
10665   verifyFormat("do {\n"
10666                "  do_something(( int )i);\n"
10667                "} while (something( ));",
10668                Spaces);
10669   verifyFormat("switch (x) {\n"
10670                "default:\n"
10671                "  break;\n"
10672                "}",
10673                Spaces);
10674 
10675   // Run the first set of tests again with:
10676   Spaces.SpaceAfterCStyleCast = true;
10677   verifyFormat("call(x, y, z);", Spaces);
10678   verifyFormat("call( );", Spaces);
10679   verifyFormat("std::function<void(int, int)> callback;", Spaces);
10680   verifyFormat("while (( bool ) 1)\n"
10681                "  continue;",
10682                Spaces);
10683   verifyFormat("for (;;)\n"
10684                "  continue;",
10685                Spaces);
10686   verifyFormat("if (true)\n"
10687                "  f( );\n"
10688                "else if (true)\n"
10689                "  f( );",
10690                Spaces);
10691   verifyFormat("do {\n"
10692                "  do_something(( int ) i);\n"
10693                "} while (something( ));",
10694                Spaces);
10695   verifyFormat("switch (x) {\n"
10696                "default:\n"
10697                "  break;\n"
10698                "}",
10699                Spaces);
10700 
10701   // Run subset of tests again with:
10702   Spaces.SpacesInCStyleCastParentheses = false;
10703   Spaces.SpaceAfterCStyleCast = true;
10704   verifyFormat("while ((bool) 1)\n"
10705                "  continue;",
10706                Spaces);
10707   verifyFormat("do {\n"
10708                "  do_something((int) i);\n"
10709                "} while (something( ));",
10710                Spaces);
10711 }
10712 
10713 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
10714   verifyFormat("int a[5];");
10715   verifyFormat("a[3] += 42;");
10716 
10717   FormatStyle Spaces = getLLVMStyle();
10718   Spaces.SpacesInSquareBrackets = true;
10719   // Not lambdas.
10720   verifyFormat("int a[ 5 ];", Spaces);
10721   verifyFormat("a[ 3 ] += 42;", Spaces);
10722   verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
10723   verifyFormat("double &operator[](int i) { return 0; }\n"
10724                "int i;",
10725                Spaces);
10726   verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
10727   verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
10728   verifyFormat("int i = (*b)[ a ]->f();", Spaces);
10729   // Lambdas.
10730   verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
10731   verifyFormat("return [ i, args... ] {};", Spaces);
10732   verifyFormat("int foo = [ &bar ]() {};", Spaces);
10733   verifyFormat("int foo = [ = ]() {};", Spaces);
10734   verifyFormat("int foo = [ & ]() {};", Spaces);
10735   verifyFormat("int foo = [ =, &bar ]() {};", Spaces);
10736   verifyFormat("int foo = [ &bar, = ]() {};", Spaces);
10737 }
10738 
10739 TEST_F(FormatTest, ConfigurableSpaceBeforeBrackets) {
10740   FormatStyle NoSpaceStyle = getLLVMStyle();
10741   verifyFormat("int a[5];", NoSpaceStyle);
10742   verifyFormat("a[3] += 42;", NoSpaceStyle);
10743 
10744   verifyFormat("int a[1];", NoSpaceStyle);
10745   verifyFormat("int 1 [a];", NoSpaceStyle);
10746   verifyFormat("int a[1][2];", NoSpaceStyle);
10747   verifyFormat("a[7] = 5;", NoSpaceStyle);
10748   verifyFormat("int a = (f())[23];", NoSpaceStyle);
10749   verifyFormat("f([] {})", NoSpaceStyle);
10750 
10751   FormatStyle Space = getLLVMStyle();
10752   Space.SpaceBeforeSquareBrackets = true;
10753   verifyFormat("int c = []() -> int { return 2; }();\n", Space);
10754   verifyFormat("return [i, args...] {};", Space);
10755 
10756   verifyFormat("int a [5];", Space);
10757   verifyFormat("a [3] += 42;", Space);
10758   verifyFormat("constexpr char hello []{\"hello\"};", Space);
10759   verifyFormat("double &operator[](int i) { return 0; }\n"
10760                "int i;",
10761                Space);
10762   verifyFormat("std::unique_ptr<int []> foo() {}", Space);
10763   verifyFormat("int i = a [a][a]->f();", Space);
10764   verifyFormat("int i = (*b) [a]->f();", Space);
10765 
10766   verifyFormat("int a [1];", Space);
10767   verifyFormat("int 1 [a];", Space);
10768   verifyFormat("int a [1][2];", Space);
10769   verifyFormat("a [7] = 5;", Space);
10770   verifyFormat("int a = (f()) [23];", Space);
10771   verifyFormat("f([] {})", Space);
10772 }
10773 
10774 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
10775   verifyFormat("int a = 5;");
10776   verifyFormat("a += 42;");
10777   verifyFormat("a or_eq 8;");
10778 
10779   FormatStyle Spaces = getLLVMStyle();
10780   Spaces.SpaceBeforeAssignmentOperators = false;
10781   verifyFormat("int a= 5;", Spaces);
10782   verifyFormat("a+= 42;", Spaces);
10783   verifyFormat("a or_eq 8;", Spaces);
10784 }
10785 
10786 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
10787   verifyFormat("class Foo : public Bar {};");
10788   verifyFormat("Foo::Foo() : foo(1) {}");
10789   verifyFormat("for (auto a : b) {\n}");
10790   verifyFormat("int x = a ? b : c;");
10791   verifyFormat("{\n"
10792                "label0:\n"
10793                "  int x = 0;\n"
10794                "}");
10795   verifyFormat("switch (x) {\n"
10796                "case 1:\n"
10797                "default:\n"
10798                "}");
10799 
10800   FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30);
10801   CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false;
10802   verifyFormat("class Foo : public Bar {};", CtorInitializerStyle);
10803   verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle);
10804   verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle);
10805   verifyFormat("int x = a ? b : c;", CtorInitializerStyle);
10806   verifyFormat("{\n"
10807                "label1:\n"
10808                "  int x = 0;\n"
10809                "}",
10810                CtorInitializerStyle);
10811   verifyFormat("switch (x) {\n"
10812                "case 1:\n"
10813                "default:\n"
10814                "}",
10815                CtorInitializerStyle);
10816   CtorInitializerStyle.BreakConstructorInitializers =
10817       FormatStyle::BCIS_AfterColon;
10818   verifyFormat("Fooooooooooo::Fooooooooooo():\n"
10819                "    aaaaaaaaaaaaaaaa(1),\n"
10820                "    bbbbbbbbbbbbbbbb(2) {}",
10821                CtorInitializerStyle);
10822   CtorInitializerStyle.BreakConstructorInitializers =
10823       FormatStyle::BCIS_BeforeComma;
10824   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
10825                "    : aaaaaaaaaaaaaaaa(1)\n"
10826                "    , bbbbbbbbbbbbbbbb(2) {}",
10827                CtorInitializerStyle);
10828   CtorInitializerStyle.BreakConstructorInitializers =
10829       FormatStyle::BCIS_BeforeColon;
10830   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
10831                "    : aaaaaaaaaaaaaaaa(1),\n"
10832                "      bbbbbbbbbbbbbbbb(2) {}",
10833                CtorInitializerStyle);
10834   CtorInitializerStyle.ConstructorInitializerIndentWidth = 0;
10835   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
10836                ": aaaaaaaaaaaaaaaa(1),\n"
10837                "  bbbbbbbbbbbbbbbb(2) {}",
10838                CtorInitializerStyle);
10839 
10840   FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30);
10841   InheritanceStyle.SpaceBeforeInheritanceColon = false;
10842   verifyFormat("class Foo: public Bar {};", InheritanceStyle);
10843   verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle);
10844   verifyFormat("for (auto a : b) {\n}", InheritanceStyle);
10845   verifyFormat("int x = a ? b : c;", InheritanceStyle);
10846   verifyFormat("{\n"
10847                "label2:\n"
10848                "  int x = 0;\n"
10849                "}",
10850                InheritanceStyle);
10851   verifyFormat("switch (x) {\n"
10852                "case 1:\n"
10853                "default:\n"
10854                "}",
10855                InheritanceStyle);
10856   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon;
10857   verifyFormat("class Foooooooooooooooooooooo:\n"
10858                "    public aaaaaaaaaaaaaaaaaa,\n"
10859                "    public bbbbbbbbbbbbbbbbbb {\n"
10860                "}",
10861                InheritanceStyle);
10862   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
10863   verifyFormat("class Foooooooooooooooooooooo\n"
10864                "    : public aaaaaaaaaaaaaaaaaa\n"
10865                "    , public bbbbbbbbbbbbbbbbbb {\n"
10866                "}",
10867                InheritanceStyle);
10868   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
10869   verifyFormat("class Foooooooooooooooooooooo\n"
10870                "    : public aaaaaaaaaaaaaaaaaa,\n"
10871                "      public bbbbbbbbbbbbbbbbbb {\n"
10872                "}",
10873                InheritanceStyle);
10874   InheritanceStyle.ConstructorInitializerIndentWidth = 0;
10875   verifyFormat("class Foooooooooooooooooooooo\n"
10876                ": public aaaaaaaaaaaaaaaaaa,\n"
10877                "  public bbbbbbbbbbbbbbbbbb {}",
10878                InheritanceStyle);
10879 
10880   FormatStyle ForLoopStyle = getLLVMStyle();
10881   ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false;
10882   verifyFormat("class Foo : public Bar {};", ForLoopStyle);
10883   verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle);
10884   verifyFormat("for (auto a: b) {\n}", ForLoopStyle);
10885   verifyFormat("int x = a ? b : c;", ForLoopStyle);
10886   verifyFormat("{\n"
10887                "label2:\n"
10888                "  int x = 0;\n"
10889                "}",
10890                ForLoopStyle);
10891   verifyFormat("switch (x) {\n"
10892                "case 1:\n"
10893                "default:\n"
10894                "}",
10895                ForLoopStyle);
10896 
10897   FormatStyle NoSpaceStyle = getLLVMStyle();
10898   NoSpaceStyle.SpaceBeforeCtorInitializerColon = false;
10899   NoSpaceStyle.SpaceBeforeInheritanceColon = false;
10900   NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false;
10901   verifyFormat("class Foo: public Bar {};", NoSpaceStyle);
10902   verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle);
10903   verifyFormat("for (auto a: b) {\n}", NoSpaceStyle);
10904   verifyFormat("int x = a ? b : c;", NoSpaceStyle);
10905   verifyFormat("{\n"
10906                "label3:\n"
10907                "  int x = 0;\n"
10908                "}",
10909                NoSpaceStyle);
10910   verifyFormat("switch (x) {\n"
10911                "case 1:\n"
10912                "default:\n"
10913                "}",
10914                NoSpaceStyle);
10915 }
10916 
10917 TEST_F(FormatTest, AlignConsecutiveMacros) {
10918   FormatStyle Style = getLLVMStyle();
10919   Style.AlignConsecutiveAssignments = true;
10920   Style.AlignConsecutiveDeclarations = true;
10921   Style.AlignConsecutiveMacros = false;
10922 
10923   verifyFormat("#define a 3\n"
10924                "#define bbbb 4\n"
10925                "#define ccc (5)",
10926                Style);
10927 
10928   verifyFormat("#define f(x) (x * x)\n"
10929                "#define fff(x, y, z) (x * y + z)\n"
10930                "#define ffff(x, y) (x - y)",
10931                Style);
10932 
10933   verifyFormat("#define foo(x, y) (x + y)\n"
10934                "#define bar (5, 6)(2 + 2)",
10935                Style);
10936 
10937   verifyFormat("#define a 3\n"
10938                "#define bbbb 4\n"
10939                "#define ccc (5)\n"
10940                "#define f(x) (x * x)\n"
10941                "#define fff(x, y, z) (x * y + z)\n"
10942                "#define ffff(x, y) (x - y)",
10943                Style);
10944 
10945   Style.AlignConsecutiveMacros = true;
10946   verifyFormat("#define a    3\n"
10947                "#define bbbb 4\n"
10948                "#define ccc  (5)",
10949                Style);
10950 
10951   verifyFormat("#define f(x)         (x * x)\n"
10952                "#define fff(x, y, z) (x * y + z)\n"
10953                "#define ffff(x, y)   (x - y)",
10954                Style);
10955 
10956   verifyFormat("#define foo(x, y) (x + y)\n"
10957                "#define bar       (5, 6)(2 + 2)",
10958                Style);
10959 
10960   verifyFormat("#define a            3\n"
10961                "#define bbbb         4\n"
10962                "#define ccc          (5)\n"
10963                "#define f(x)         (x * x)\n"
10964                "#define fff(x, y, z) (x * y + z)\n"
10965                "#define ffff(x, y)   (x - y)",
10966                Style);
10967 
10968   verifyFormat("#define a         5\n"
10969                "#define foo(x, y) (x + y)\n"
10970                "#define CCC       (6)\n"
10971                "auto lambda = []() {\n"
10972                "  auto  ii = 0;\n"
10973                "  float j  = 0;\n"
10974                "  return 0;\n"
10975                "};\n"
10976                "int   i  = 0;\n"
10977                "float i2 = 0;\n"
10978                "auto  v  = type{\n"
10979                "    i = 1,   //\n"
10980                "    (i = 2), //\n"
10981                "    i = 3    //\n"
10982                "};",
10983                Style);
10984 
10985   Style.AlignConsecutiveMacros = false;
10986   Style.ColumnLimit = 20;
10987 
10988   verifyFormat("#define a          \\\n"
10989                "  \"aabbbbbbbbbbbb\"\n"
10990                "#define D          \\\n"
10991                "  \"aabbbbbbbbbbbb\" \\\n"
10992                "  \"ccddeeeeeeeee\"\n"
10993                "#define B          \\\n"
10994                "  \"QQQQQQQQQQQQQ\"  \\\n"
10995                "  \"FFFFFFFFFFFFF\"  \\\n"
10996                "  \"LLLLLLLL\"\n",
10997                Style);
10998 
10999   Style.AlignConsecutiveMacros = true;
11000   verifyFormat("#define a          \\\n"
11001                "  \"aabbbbbbbbbbbb\"\n"
11002                "#define D          \\\n"
11003                "  \"aabbbbbbbbbbbb\" \\\n"
11004                "  \"ccddeeeeeeeee\"\n"
11005                "#define B          \\\n"
11006                "  \"QQQQQQQQQQQQQ\"  \\\n"
11007                "  \"FFFFFFFFFFFFF\"  \\\n"
11008                "  \"LLLLLLLL\"\n",
11009                Style);
11010 }
11011 
11012 TEST_F(FormatTest, AlignConsecutiveAssignments) {
11013   FormatStyle Alignment = getLLVMStyle();
11014   Alignment.AlignConsecutiveMacros = true;
11015   Alignment.AlignConsecutiveAssignments = false;
11016   verifyFormat("int a = 5;\n"
11017                "int oneTwoThree = 123;",
11018                Alignment);
11019   verifyFormat("int a = 5;\n"
11020                "int oneTwoThree = 123;",
11021                Alignment);
11022 
11023   Alignment.AlignConsecutiveAssignments = true;
11024   verifyFormat("int a           = 5;\n"
11025                "int oneTwoThree = 123;",
11026                Alignment);
11027   verifyFormat("int a           = method();\n"
11028                "int oneTwoThree = 133;",
11029                Alignment);
11030   verifyFormat("a &= 5;\n"
11031                "bcd *= 5;\n"
11032                "ghtyf += 5;\n"
11033                "dvfvdb -= 5;\n"
11034                "a /= 5;\n"
11035                "vdsvsv %= 5;\n"
11036                "sfdbddfbdfbb ^= 5;\n"
11037                "dvsdsv |= 5;\n"
11038                "int dsvvdvsdvvv = 123;",
11039                Alignment);
11040   verifyFormat("int i = 1, j = 10;\n"
11041                "something = 2000;",
11042                Alignment);
11043   verifyFormat("something = 2000;\n"
11044                "int i = 1, j = 10;\n",
11045                Alignment);
11046   verifyFormat("something = 2000;\n"
11047                "another   = 911;\n"
11048                "int i = 1, j = 10;\n"
11049                "oneMore = 1;\n"
11050                "i       = 2;",
11051                Alignment);
11052   verifyFormat("int a   = 5;\n"
11053                "int one = 1;\n"
11054                "method();\n"
11055                "int oneTwoThree = 123;\n"
11056                "int oneTwo      = 12;",
11057                Alignment);
11058   verifyFormat("int oneTwoThree = 123;\n"
11059                "int oneTwo      = 12;\n"
11060                "method();\n",
11061                Alignment);
11062   verifyFormat("int oneTwoThree = 123; // comment\n"
11063                "int oneTwo      = 12;  // comment",
11064                Alignment);
11065   EXPECT_EQ("int a = 5;\n"
11066             "\n"
11067             "int oneTwoThree = 123;",
11068             format("int a       = 5;\n"
11069                    "\n"
11070                    "int oneTwoThree= 123;",
11071                    Alignment));
11072   EXPECT_EQ("int a   = 5;\n"
11073             "int one = 1;\n"
11074             "\n"
11075             "int oneTwoThree = 123;",
11076             format("int a = 5;\n"
11077                    "int one = 1;\n"
11078                    "\n"
11079                    "int oneTwoThree = 123;",
11080                    Alignment));
11081   EXPECT_EQ("int a   = 5;\n"
11082             "int one = 1;\n"
11083             "\n"
11084             "int oneTwoThree = 123;\n"
11085             "int oneTwo      = 12;",
11086             format("int a = 5;\n"
11087                    "int one = 1;\n"
11088                    "\n"
11089                    "int oneTwoThree = 123;\n"
11090                    "int oneTwo = 12;",
11091                    Alignment));
11092   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
11093   verifyFormat("#define A \\\n"
11094                "  int aaaa       = 12; \\\n"
11095                "  int b          = 23; \\\n"
11096                "  int ccc        = 234; \\\n"
11097                "  int dddddddddd = 2345;",
11098                Alignment);
11099   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
11100   verifyFormat("#define A               \\\n"
11101                "  int aaaa       = 12;  \\\n"
11102                "  int b          = 23;  \\\n"
11103                "  int ccc        = 234; \\\n"
11104                "  int dddddddddd = 2345;",
11105                Alignment);
11106   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
11107   verifyFormat("#define A                                                      "
11108                "                \\\n"
11109                "  int aaaa       = 12;                                         "
11110                "                \\\n"
11111                "  int b          = 23;                                         "
11112                "                \\\n"
11113                "  int ccc        = 234;                                        "
11114                "                \\\n"
11115                "  int dddddddddd = 2345;",
11116                Alignment);
11117   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
11118                "k = 4, int l = 5,\n"
11119                "                  int m = 6) {\n"
11120                "  int j      = 10;\n"
11121                "  otherThing = 1;\n"
11122                "}",
11123                Alignment);
11124   verifyFormat("void SomeFunction(int parameter = 0) {\n"
11125                "  int i   = 1;\n"
11126                "  int j   = 2;\n"
11127                "  int big = 10000;\n"
11128                "}",
11129                Alignment);
11130   verifyFormat("class C {\n"
11131                "public:\n"
11132                "  int i            = 1;\n"
11133                "  virtual void f() = 0;\n"
11134                "};",
11135                Alignment);
11136   verifyFormat("int i = 1;\n"
11137                "if (SomeType t = getSomething()) {\n"
11138                "}\n"
11139                "int j   = 2;\n"
11140                "int big = 10000;",
11141                Alignment);
11142   verifyFormat("int j = 7;\n"
11143                "for (int k = 0; k < N; ++k) {\n"
11144                "}\n"
11145                "int j   = 2;\n"
11146                "int big = 10000;\n"
11147                "}",
11148                Alignment);
11149   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
11150   verifyFormat("int i = 1;\n"
11151                "LooooooooooongType loooooooooooooooooooooongVariable\n"
11152                "    = someLooooooooooooooooongFunction();\n"
11153                "int j = 2;",
11154                Alignment);
11155   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
11156   verifyFormat("int i = 1;\n"
11157                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
11158                "    someLooooooooooooooooongFunction();\n"
11159                "int j = 2;",
11160                Alignment);
11161 
11162   verifyFormat("auto lambda = []() {\n"
11163                "  auto i = 0;\n"
11164                "  return 0;\n"
11165                "};\n"
11166                "int i  = 0;\n"
11167                "auto v = type{\n"
11168                "    i = 1,   //\n"
11169                "    (i = 2), //\n"
11170                "    i = 3    //\n"
11171                "};",
11172                Alignment);
11173 
11174   verifyFormat(
11175       "int i      = 1;\n"
11176       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
11177       "                          loooooooooooooooooooooongParameterB);\n"
11178       "int j      = 2;",
11179       Alignment);
11180 
11181   verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
11182                "          typename B   = very_long_type_name_1,\n"
11183                "          typename T_2 = very_long_type_name_2>\n"
11184                "auto foo() {}\n",
11185                Alignment);
11186   verifyFormat("int a, b = 1;\n"
11187                "int c  = 2;\n"
11188                "int dd = 3;\n",
11189                Alignment);
11190   verifyFormat("int aa       = ((1 > 2) ? 3 : 4);\n"
11191                "float b[1][] = {{3.f}};\n",
11192                Alignment);
11193   verifyFormat("for (int i = 0; i < 1; i++)\n"
11194                "  int x = 1;\n",
11195                Alignment);
11196   verifyFormat("for (i = 0; i < 1; i++)\n"
11197                "  x = 1;\n"
11198                "y = 1;\n",
11199                Alignment);
11200 }
11201 
11202 TEST_F(FormatTest, AlignConsecutiveDeclarations) {
11203   FormatStyle Alignment = getLLVMStyle();
11204   Alignment.AlignConsecutiveMacros = true;
11205   Alignment.AlignConsecutiveDeclarations = false;
11206   verifyFormat("float const a = 5;\n"
11207                "int oneTwoThree = 123;",
11208                Alignment);
11209   verifyFormat("int a = 5;\n"
11210                "float const oneTwoThree = 123;",
11211                Alignment);
11212 
11213   Alignment.AlignConsecutiveDeclarations = true;
11214   verifyFormat("float const a = 5;\n"
11215                "int         oneTwoThree = 123;",
11216                Alignment);
11217   verifyFormat("int         a = method();\n"
11218                "float const oneTwoThree = 133;",
11219                Alignment);
11220   verifyFormat("int i = 1, j = 10;\n"
11221                "something = 2000;",
11222                Alignment);
11223   verifyFormat("something = 2000;\n"
11224                "int i = 1, j = 10;\n",
11225                Alignment);
11226   verifyFormat("float      something = 2000;\n"
11227                "double     another = 911;\n"
11228                "int        i = 1, j = 10;\n"
11229                "const int *oneMore = 1;\n"
11230                "unsigned   i = 2;",
11231                Alignment);
11232   verifyFormat("float a = 5;\n"
11233                "int   one = 1;\n"
11234                "method();\n"
11235                "const double       oneTwoThree = 123;\n"
11236                "const unsigned int oneTwo = 12;",
11237                Alignment);
11238   verifyFormat("int      oneTwoThree{0}; // comment\n"
11239                "unsigned oneTwo;         // comment",
11240                Alignment);
11241   EXPECT_EQ("float const a = 5;\n"
11242             "\n"
11243             "int oneTwoThree = 123;",
11244             format("float const   a = 5;\n"
11245                    "\n"
11246                    "int           oneTwoThree= 123;",
11247                    Alignment));
11248   EXPECT_EQ("float a = 5;\n"
11249             "int   one = 1;\n"
11250             "\n"
11251             "unsigned oneTwoThree = 123;",
11252             format("float    a = 5;\n"
11253                    "int      one = 1;\n"
11254                    "\n"
11255                    "unsigned oneTwoThree = 123;",
11256                    Alignment));
11257   EXPECT_EQ("float a = 5;\n"
11258             "int   one = 1;\n"
11259             "\n"
11260             "unsigned oneTwoThree = 123;\n"
11261             "int      oneTwo = 12;",
11262             format("float    a = 5;\n"
11263                    "int one = 1;\n"
11264                    "\n"
11265                    "unsigned oneTwoThree = 123;\n"
11266                    "int oneTwo = 12;",
11267                    Alignment));
11268   // Function prototype alignment
11269   verifyFormat("int    a();\n"
11270                "double b();",
11271                Alignment);
11272   verifyFormat("int    a(int x);\n"
11273                "double b();",
11274                Alignment);
11275   unsigned OldColumnLimit = Alignment.ColumnLimit;
11276   // We need to set ColumnLimit to zero, in order to stress nested alignments,
11277   // otherwise the function parameters will be re-flowed onto a single line.
11278   Alignment.ColumnLimit = 0;
11279   EXPECT_EQ("int    a(int   x,\n"
11280             "         float y);\n"
11281             "double b(int    x,\n"
11282             "         double y);",
11283             format("int a(int x,\n"
11284                    " float y);\n"
11285                    "double b(int x,\n"
11286                    " double y);",
11287                    Alignment));
11288   // This ensures that function parameters of function declarations are
11289   // correctly indented when their owning functions are indented.
11290   // The failure case here is for 'double y' to not be indented enough.
11291   EXPECT_EQ("double a(int x);\n"
11292             "int    b(int    y,\n"
11293             "         double z);",
11294             format("double a(int x);\n"
11295                    "int b(int y,\n"
11296                    " double z);",
11297                    Alignment));
11298   // Set ColumnLimit low so that we induce wrapping immediately after
11299   // the function name and opening paren.
11300   Alignment.ColumnLimit = 13;
11301   verifyFormat("int function(\n"
11302                "    int  x,\n"
11303                "    bool y);",
11304                Alignment);
11305   Alignment.ColumnLimit = OldColumnLimit;
11306   // Ensure function pointers don't screw up recursive alignment
11307   verifyFormat("int    a(int x, void (*fp)(int y));\n"
11308                "double b();",
11309                Alignment);
11310   Alignment.AlignConsecutiveAssignments = true;
11311   // Ensure recursive alignment is broken by function braces, so that the
11312   // "a = 1" does not align with subsequent assignments inside the function
11313   // body.
11314   verifyFormat("int func(int a = 1) {\n"
11315                "  int b  = 2;\n"
11316                "  int cc = 3;\n"
11317                "}",
11318                Alignment);
11319   verifyFormat("float      something = 2000;\n"
11320                "double     another   = 911;\n"
11321                "int        i = 1, j = 10;\n"
11322                "const int *oneMore = 1;\n"
11323                "unsigned   i       = 2;",
11324                Alignment);
11325   verifyFormat("int      oneTwoThree = {0}; // comment\n"
11326                "unsigned oneTwo      = 0;   // comment",
11327                Alignment);
11328   // Make sure that scope is correctly tracked, in the absence of braces
11329   verifyFormat("for (int i = 0; i < n; i++)\n"
11330                "  j = i;\n"
11331                "double x = 1;\n",
11332                Alignment);
11333   verifyFormat("if (int i = 0)\n"
11334                "  j = i;\n"
11335                "double x = 1;\n",
11336                Alignment);
11337   // Ensure operator[] and operator() are comprehended
11338   verifyFormat("struct test {\n"
11339                "  long long int foo();\n"
11340                "  int           operator[](int a);\n"
11341                "  double        bar();\n"
11342                "};\n",
11343                Alignment);
11344   verifyFormat("struct test {\n"
11345                "  long long int foo();\n"
11346                "  int           operator()(int a);\n"
11347                "  double        bar();\n"
11348                "};\n",
11349                Alignment);
11350   EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
11351             "  int const i   = 1;\n"
11352             "  int *     j   = 2;\n"
11353             "  int       big = 10000;\n"
11354             "\n"
11355             "  unsigned oneTwoThree = 123;\n"
11356             "  int      oneTwo      = 12;\n"
11357             "  method();\n"
11358             "  float k  = 2;\n"
11359             "  int   ll = 10000;\n"
11360             "}",
11361             format("void SomeFunction(int parameter= 0) {\n"
11362                    " int const  i= 1;\n"
11363                    "  int *j=2;\n"
11364                    " int big  =  10000;\n"
11365                    "\n"
11366                    "unsigned oneTwoThree  =123;\n"
11367                    "int oneTwo = 12;\n"
11368                    "  method();\n"
11369                    "float k= 2;\n"
11370                    "int ll=10000;\n"
11371                    "}",
11372                    Alignment));
11373   Alignment.AlignConsecutiveAssignments = false;
11374   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
11375   verifyFormat("#define A \\\n"
11376                "  int       aaaa = 12; \\\n"
11377                "  float     b = 23; \\\n"
11378                "  const int ccc = 234; \\\n"
11379                "  unsigned  dddddddddd = 2345;",
11380                Alignment);
11381   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
11382   verifyFormat("#define A              \\\n"
11383                "  int       aaaa = 12; \\\n"
11384                "  float     b = 23;    \\\n"
11385                "  const int ccc = 234; \\\n"
11386                "  unsigned  dddddddddd = 2345;",
11387                Alignment);
11388   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
11389   Alignment.ColumnLimit = 30;
11390   verifyFormat("#define A                    \\\n"
11391                "  int       aaaa = 12;       \\\n"
11392                "  float     b = 23;          \\\n"
11393                "  const int ccc = 234;       \\\n"
11394                "  int       dddddddddd = 2345;",
11395                Alignment);
11396   Alignment.ColumnLimit = 80;
11397   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
11398                "k = 4, int l = 5,\n"
11399                "                  int m = 6) {\n"
11400                "  const int j = 10;\n"
11401                "  otherThing = 1;\n"
11402                "}",
11403                Alignment);
11404   verifyFormat("void SomeFunction(int parameter = 0) {\n"
11405                "  int const i = 1;\n"
11406                "  int *     j = 2;\n"
11407                "  int       big = 10000;\n"
11408                "}",
11409                Alignment);
11410   verifyFormat("class C {\n"
11411                "public:\n"
11412                "  int          i = 1;\n"
11413                "  virtual void f() = 0;\n"
11414                "};",
11415                Alignment);
11416   verifyFormat("float i = 1;\n"
11417                "if (SomeType t = getSomething()) {\n"
11418                "}\n"
11419                "const unsigned j = 2;\n"
11420                "int            big = 10000;",
11421                Alignment);
11422   verifyFormat("float j = 7;\n"
11423                "for (int k = 0; k < N; ++k) {\n"
11424                "}\n"
11425                "unsigned j = 2;\n"
11426                "int      big = 10000;\n"
11427                "}",
11428                Alignment);
11429   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
11430   verifyFormat("float              i = 1;\n"
11431                "LooooooooooongType loooooooooooooooooooooongVariable\n"
11432                "    = someLooooooooooooooooongFunction();\n"
11433                "int j = 2;",
11434                Alignment);
11435   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
11436   verifyFormat("int                i = 1;\n"
11437                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
11438                "    someLooooooooooooooooongFunction();\n"
11439                "int j = 2;",
11440                Alignment);
11441 
11442   Alignment.AlignConsecutiveAssignments = true;
11443   verifyFormat("auto lambda = []() {\n"
11444                "  auto  ii = 0;\n"
11445                "  float j  = 0;\n"
11446                "  return 0;\n"
11447                "};\n"
11448                "int   i  = 0;\n"
11449                "float i2 = 0;\n"
11450                "auto  v  = type{\n"
11451                "    i = 1,   //\n"
11452                "    (i = 2), //\n"
11453                "    i = 3    //\n"
11454                "};",
11455                Alignment);
11456   Alignment.AlignConsecutiveAssignments = false;
11457 
11458   verifyFormat(
11459       "int      i = 1;\n"
11460       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
11461       "                          loooooooooooooooooooooongParameterB);\n"
11462       "int      j = 2;",
11463       Alignment);
11464 
11465   // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
11466   // We expect declarations and assignments to align, as long as it doesn't
11467   // exceed the column limit, starting a new alignment sequence whenever it
11468   // happens.
11469   Alignment.AlignConsecutiveAssignments = true;
11470   Alignment.ColumnLimit = 30;
11471   verifyFormat("float    ii              = 1;\n"
11472                "unsigned j               = 2;\n"
11473                "int someVerylongVariable = 1;\n"
11474                "AnotherLongType  ll = 123456;\n"
11475                "VeryVeryLongType k  = 2;\n"
11476                "int              myvar = 1;",
11477                Alignment);
11478   Alignment.ColumnLimit = 80;
11479   Alignment.AlignConsecutiveAssignments = false;
11480 
11481   verifyFormat(
11482       "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
11483       "          typename LongType, typename B>\n"
11484       "auto foo() {}\n",
11485       Alignment);
11486   verifyFormat("float a, b = 1;\n"
11487                "int   c = 2;\n"
11488                "int   dd = 3;\n",
11489                Alignment);
11490   verifyFormat("int   aa = ((1 > 2) ? 3 : 4);\n"
11491                "float b[1][] = {{3.f}};\n",
11492                Alignment);
11493   Alignment.AlignConsecutiveAssignments = true;
11494   verifyFormat("float a, b = 1;\n"
11495                "int   c  = 2;\n"
11496                "int   dd = 3;\n",
11497                Alignment);
11498   verifyFormat("int   aa     = ((1 > 2) ? 3 : 4);\n"
11499                "float b[1][] = {{3.f}};\n",
11500                Alignment);
11501   Alignment.AlignConsecutiveAssignments = false;
11502 
11503   Alignment.ColumnLimit = 30;
11504   Alignment.BinPackParameters = false;
11505   verifyFormat("void foo(float     a,\n"
11506                "         float     b,\n"
11507                "         int       c,\n"
11508                "         uint32_t *d) {\n"
11509                "  int *  e = 0;\n"
11510                "  float  f = 0;\n"
11511                "  double g = 0;\n"
11512                "}\n"
11513                "void bar(ino_t     a,\n"
11514                "         int       b,\n"
11515                "         uint32_t *c,\n"
11516                "         bool      d) {}\n",
11517                Alignment);
11518   Alignment.BinPackParameters = true;
11519   Alignment.ColumnLimit = 80;
11520 
11521   // Bug 33507
11522   Alignment.PointerAlignment = FormatStyle::PAS_Middle;
11523   verifyFormat(
11524       "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
11525       "  static const Version verVs2017;\n"
11526       "  return true;\n"
11527       "});\n",
11528       Alignment);
11529   Alignment.PointerAlignment = FormatStyle::PAS_Right;
11530 
11531   // See llvm.org/PR35641
11532   Alignment.AlignConsecutiveDeclarations = true;
11533   verifyFormat("int func() { //\n"
11534                "  int      b;\n"
11535                "  unsigned c;\n"
11536                "}",
11537                Alignment);
11538 
11539   // See PR37175
11540   FormatStyle Style = getMozillaStyle();
11541   Style.AlignConsecutiveDeclarations = true;
11542   EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n"
11543             "foo(int a);",
11544             format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style));
11545 }
11546 
11547 TEST_F(FormatTest, LinuxBraceBreaking) {
11548   FormatStyle LinuxBraceStyle = getLLVMStyle();
11549   LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
11550   verifyFormat("namespace a\n"
11551                "{\n"
11552                "class A\n"
11553                "{\n"
11554                "  void f()\n"
11555                "  {\n"
11556                "    if (true) {\n"
11557                "      a();\n"
11558                "      b();\n"
11559                "    } else {\n"
11560                "      a();\n"
11561                "    }\n"
11562                "  }\n"
11563                "  void g() { return; }\n"
11564                "};\n"
11565                "struct B {\n"
11566                "  int x;\n"
11567                "};\n"
11568                "} // namespace a\n",
11569                LinuxBraceStyle);
11570   verifyFormat("enum X {\n"
11571                "  Y = 0,\n"
11572                "}\n",
11573                LinuxBraceStyle);
11574   verifyFormat("struct S {\n"
11575                "  int Type;\n"
11576                "  union {\n"
11577                "    int x;\n"
11578                "    double y;\n"
11579                "  } Value;\n"
11580                "  class C\n"
11581                "  {\n"
11582                "    MyFavoriteType Value;\n"
11583                "  } Class;\n"
11584                "}\n",
11585                LinuxBraceStyle);
11586 }
11587 
11588 TEST_F(FormatTest, MozillaBraceBreaking) {
11589   FormatStyle MozillaBraceStyle = getLLVMStyle();
11590   MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
11591   MozillaBraceStyle.FixNamespaceComments = false;
11592   verifyFormat("namespace a {\n"
11593                "class A\n"
11594                "{\n"
11595                "  void f()\n"
11596                "  {\n"
11597                "    if (true) {\n"
11598                "      a();\n"
11599                "      b();\n"
11600                "    }\n"
11601                "  }\n"
11602                "  void g() { return; }\n"
11603                "};\n"
11604                "enum E\n"
11605                "{\n"
11606                "  A,\n"
11607                "  // foo\n"
11608                "  B,\n"
11609                "  C\n"
11610                "};\n"
11611                "struct B\n"
11612                "{\n"
11613                "  int x;\n"
11614                "};\n"
11615                "}\n",
11616                MozillaBraceStyle);
11617   verifyFormat("struct S\n"
11618                "{\n"
11619                "  int Type;\n"
11620                "  union\n"
11621                "  {\n"
11622                "    int x;\n"
11623                "    double y;\n"
11624                "  } Value;\n"
11625                "  class C\n"
11626                "  {\n"
11627                "    MyFavoriteType Value;\n"
11628                "  } Class;\n"
11629                "}\n",
11630                MozillaBraceStyle);
11631 }
11632 
11633 TEST_F(FormatTest, StroustrupBraceBreaking) {
11634   FormatStyle StroustrupBraceStyle = getLLVMStyle();
11635   StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
11636   verifyFormat("namespace a {\n"
11637                "class A {\n"
11638                "  void f()\n"
11639                "  {\n"
11640                "    if (true) {\n"
11641                "      a();\n"
11642                "      b();\n"
11643                "    }\n"
11644                "  }\n"
11645                "  void g() { return; }\n"
11646                "};\n"
11647                "struct B {\n"
11648                "  int x;\n"
11649                "};\n"
11650                "} // namespace a\n",
11651                StroustrupBraceStyle);
11652 
11653   verifyFormat("void foo()\n"
11654                "{\n"
11655                "  if (a) {\n"
11656                "    a();\n"
11657                "  }\n"
11658                "  else {\n"
11659                "    b();\n"
11660                "  }\n"
11661                "}\n",
11662                StroustrupBraceStyle);
11663 
11664   verifyFormat("#ifdef _DEBUG\n"
11665                "int foo(int i = 0)\n"
11666                "#else\n"
11667                "int foo(int i = 5)\n"
11668                "#endif\n"
11669                "{\n"
11670                "  return i;\n"
11671                "}",
11672                StroustrupBraceStyle);
11673 
11674   verifyFormat("void foo() {}\n"
11675                "void bar()\n"
11676                "#ifdef _DEBUG\n"
11677                "{\n"
11678                "  foo();\n"
11679                "}\n"
11680                "#else\n"
11681                "{\n"
11682                "}\n"
11683                "#endif",
11684                StroustrupBraceStyle);
11685 
11686   verifyFormat("void foobar() { int i = 5; }\n"
11687                "#ifdef _DEBUG\n"
11688                "void bar() {}\n"
11689                "#else\n"
11690                "void bar() { foobar(); }\n"
11691                "#endif",
11692                StroustrupBraceStyle);
11693 }
11694 
11695 TEST_F(FormatTest, AllmanBraceBreaking) {
11696   FormatStyle AllmanBraceStyle = getLLVMStyle();
11697   AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
11698 
11699   EXPECT_EQ("namespace a\n"
11700             "{\n"
11701             "void f();\n"
11702             "void g();\n"
11703             "} // namespace a\n",
11704             format("namespace a\n"
11705                    "{\n"
11706                    "void f();\n"
11707                    "void g();\n"
11708                    "}\n",
11709                    AllmanBraceStyle));
11710 
11711   verifyFormat("namespace a\n"
11712                "{\n"
11713                "class A\n"
11714                "{\n"
11715                "  void f()\n"
11716                "  {\n"
11717                "    if (true)\n"
11718                "    {\n"
11719                "      a();\n"
11720                "      b();\n"
11721                "    }\n"
11722                "  }\n"
11723                "  void g() { return; }\n"
11724                "};\n"
11725                "struct B\n"
11726                "{\n"
11727                "  int x;\n"
11728                "};\n"
11729                "union C\n"
11730                "{\n"
11731                "};\n"
11732                "} // namespace a",
11733                AllmanBraceStyle);
11734 
11735   verifyFormat("void f()\n"
11736                "{\n"
11737                "  if (true)\n"
11738                "  {\n"
11739                "    a();\n"
11740                "  }\n"
11741                "  else if (false)\n"
11742                "  {\n"
11743                "    b();\n"
11744                "  }\n"
11745                "  else\n"
11746                "  {\n"
11747                "    c();\n"
11748                "  }\n"
11749                "}\n",
11750                AllmanBraceStyle);
11751 
11752   verifyFormat("void f()\n"
11753                "{\n"
11754                "  for (int i = 0; i < 10; ++i)\n"
11755                "  {\n"
11756                "    a();\n"
11757                "  }\n"
11758                "  while (false)\n"
11759                "  {\n"
11760                "    b();\n"
11761                "  }\n"
11762                "  do\n"
11763                "  {\n"
11764                "    c();\n"
11765                "  } while (false)\n"
11766                "}\n",
11767                AllmanBraceStyle);
11768 
11769   verifyFormat("void f(int a)\n"
11770                "{\n"
11771                "  switch (a)\n"
11772                "  {\n"
11773                "  case 0:\n"
11774                "    break;\n"
11775                "  case 1:\n"
11776                "  {\n"
11777                "    break;\n"
11778                "  }\n"
11779                "  case 2:\n"
11780                "  {\n"
11781                "  }\n"
11782                "  break;\n"
11783                "  default:\n"
11784                "    break;\n"
11785                "  }\n"
11786                "}\n",
11787                AllmanBraceStyle);
11788 
11789   verifyFormat("enum X\n"
11790                "{\n"
11791                "  Y = 0,\n"
11792                "}\n",
11793                AllmanBraceStyle);
11794   verifyFormat("enum X\n"
11795                "{\n"
11796                "  Y = 0\n"
11797                "}\n",
11798                AllmanBraceStyle);
11799 
11800   verifyFormat("@interface BSApplicationController ()\n"
11801                "{\n"
11802                "@private\n"
11803                "  id _extraIvar;\n"
11804                "}\n"
11805                "@end\n",
11806                AllmanBraceStyle);
11807 
11808   verifyFormat("#ifdef _DEBUG\n"
11809                "int foo(int i = 0)\n"
11810                "#else\n"
11811                "int foo(int i = 5)\n"
11812                "#endif\n"
11813                "{\n"
11814                "  return i;\n"
11815                "}",
11816                AllmanBraceStyle);
11817 
11818   verifyFormat("void foo() {}\n"
11819                "void bar()\n"
11820                "#ifdef _DEBUG\n"
11821                "{\n"
11822                "  foo();\n"
11823                "}\n"
11824                "#else\n"
11825                "{\n"
11826                "}\n"
11827                "#endif",
11828                AllmanBraceStyle);
11829 
11830   verifyFormat("void foobar() { int i = 5; }\n"
11831                "#ifdef _DEBUG\n"
11832                "void bar() {}\n"
11833                "#else\n"
11834                "void bar() { foobar(); }\n"
11835                "#endif",
11836                AllmanBraceStyle);
11837 
11838   // This shouldn't affect ObjC blocks..
11839   verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
11840                "  // ...\n"
11841                "  int i;\n"
11842                "}];",
11843                AllmanBraceStyle);
11844   verifyFormat("void (^block)(void) = ^{\n"
11845                "  // ...\n"
11846                "  int i;\n"
11847                "};",
11848                AllmanBraceStyle);
11849   // .. or dict literals.
11850   verifyFormat("void f()\n"
11851                "{\n"
11852                "  // ...\n"
11853                "  [object someMethod:@{@\"a\" : @\"b\"}];\n"
11854                "}",
11855                AllmanBraceStyle);
11856   verifyFormat("void f()\n"
11857                "{\n"
11858                "  // ...\n"
11859                "  [object someMethod:@{a : @\"b\"}];\n"
11860                "}",
11861                AllmanBraceStyle);
11862   verifyFormat("int f()\n"
11863                "{ // comment\n"
11864                "  return 42;\n"
11865                "}",
11866                AllmanBraceStyle);
11867 
11868   AllmanBraceStyle.ColumnLimit = 19;
11869   verifyFormat("void f() { int i; }", AllmanBraceStyle);
11870   AllmanBraceStyle.ColumnLimit = 18;
11871   verifyFormat("void f()\n"
11872                "{\n"
11873                "  int i;\n"
11874                "}",
11875                AllmanBraceStyle);
11876   AllmanBraceStyle.ColumnLimit = 80;
11877 
11878   FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
11879   BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine =
11880       FormatStyle::SIS_WithoutElse;
11881   BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
11882   verifyFormat("void f(bool b)\n"
11883                "{\n"
11884                "  if (b)\n"
11885                "  {\n"
11886                "    return;\n"
11887                "  }\n"
11888                "}\n",
11889                BreakBeforeBraceShortIfs);
11890   verifyFormat("void f(bool b)\n"
11891                "{\n"
11892                "  if constexpr (b)\n"
11893                "  {\n"
11894                "    return;\n"
11895                "  }\n"
11896                "}\n",
11897                BreakBeforeBraceShortIfs);
11898   verifyFormat("void f(bool b)\n"
11899                "{\n"
11900                "  if CONSTEXPR (b)\n"
11901                "  {\n"
11902                "    return;\n"
11903                "  }\n"
11904                "}\n",
11905                BreakBeforeBraceShortIfs);
11906   verifyFormat("void f(bool b)\n"
11907                "{\n"
11908                "  if (b) return;\n"
11909                "}\n",
11910                BreakBeforeBraceShortIfs);
11911   verifyFormat("void f(bool b)\n"
11912                "{\n"
11913                "  if constexpr (b) return;\n"
11914                "}\n",
11915                BreakBeforeBraceShortIfs);
11916   verifyFormat("void f(bool b)\n"
11917                "{\n"
11918                "  if CONSTEXPR (b) return;\n"
11919                "}\n",
11920                BreakBeforeBraceShortIfs);
11921   verifyFormat("void f(bool b)\n"
11922                "{\n"
11923                "  while (b)\n"
11924                "  {\n"
11925                "    return;\n"
11926                "  }\n"
11927                "}\n",
11928                BreakBeforeBraceShortIfs);
11929 }
11930 
11931 TEST_F(FormatTest, WhitesmithsBraceBreaking) {
11932   FormatStyle WhitesmithsBraceStyle = getLLVMStyle();
11933   WhitesmithsBraceStyle.BreakBeforeBraces = FormatStyle::BS_Whitesmiths;
11934 
11935   // Make a few changes to the style for testing purposes
11936   WhitesmithsBraceStyle.AllowShortFunctionsOnASingleLine =
11937       FormatStyle::SFS_Empty;
11938   WhitesmithsBraceStyle.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None;
11939   WhitesmithsBraceStyle.ColumnLimit = 0;
11940 
11941   // FIXME: this test case can't decide whether there should be a blank line
11942   // after the ~D() line or not. It adds one if one doesn't exist in the test
11943   // and it removes the line if one exists.
11944   /*
11945   verifyFormat("class A;\n"
11946                "namespace B\n"
11947                "  {\n"
11948                "class C;\n"
11949                "// Comment\n"
11950                "class D\n"
11951                "  {\n"
11952                "public:\n"
11953                "  D();\n"
11954                "  ~D() {}\n"
11955                "private:\n"
11956                "  enum E\n"
11957                "    {\n"
11958                "    F\n"
11959                "    }\n"
11960                "  };\n"
11961                "  } // namespace B\n",
11962                WhitesmithsBraceStyle);
11963   */
11964 
11965   verifyFormat("namespace a\n"
11966                "  {\n"
11967                "class A\n"
11968                "  {\n"
11969                "  void f()\n"
11970                "    {\n"
11971                "    if (true)\n"
11972                "      {\n"
11973                "      a();\n"
11974                "      b();\n"
11975                "      }\n"
11976                "    }\n"
11977                "  void g()\n"
11978                "    {\n"
11979                "    return;\n"
11980                "    }\n"
11981                "  };\n"
11982                "struct B\n"
11983                "  {\n"
11984                "  int x;\n"
11985                "  };\n"
11986                "  } // namespace a",
11987                WhitesmithsBraceStyle);
11988 
11989   verifyFormat("void f()\n"
11990                "  {\n"
11991                "  if (true)\n"
11992                "    {\n"
11993                "    a();\n"
11994                "    }\n"
11995                "  else if (false)\n"
11996                "    {\n"
11997                "    b();\n"
11998                "    }\n"
11999                "  else\n"
12000                "    {\n"
12001                "    c();\n"
12002                "    }\n"
12003                "  }\n",
12004                WhitesmithsBraceStyle);
12005 
12006   verifyFormat("void f()\n"
12007                "  {\n"
12008                "  for (int i = 0; i < 10; ++i)\n"
12009                "    {\n"
12010                "    a();\n"
12011                "    }\n"
12012                "  while (false)\n"
12013                "    {\n"
12014                "    b();\n"
12015                "    }\n"
12016                "  do\n"
12017                "    {\n"
12018                "    c();\n"
12019                "    } while (false)\n"
12020                "  }\n",
12021                WhitesmithsBraceStyle);
12022 
12023   // FIXME: the block and the break under case 2 in this test don't get indented
12024   // correctly
12025   /*
12026   verifyFormat("void switchTest1(int a)\n"
12027                "  {\n"
12028                "  switch (a)\n"
12029                "    {\n"
12030                "    case 2:\n"
12031                "      {\n"
12032                "      }\n"
12033                "      break;\n"
12034                "    }\n"
12035                "  }\n",
12036                WhitesmithsBraceStyle);
12037   */
12038 
12039   // FIXME: the block and the break under case 2 in this test don't get indented
12040   // correctly
12041   /*
12042   verifyFormat("void switchTest2(int a)\n"
12043                "  {\n"
12044                "  switch (a)\n"
12045                "    {\n"
12046                "  case 0:\n"
12047                "    break;\n"
12048                "  case 1:\n"
12049                "    {\n"
12050                "    break;\n"
12051                "    }\n"
12052                "  case 2:\n"
12053                "    {\n"
12054                "    }\n"
12055                "    break;\n"
12056                "  default:\n"
12057                "    break;\n"
12058                "    }\n"
12059                "  }\n",
12060                WhitesmithsBraceStyle);
12061   */
12062 
12063   verifyFormat("enum X\n"
12064                "  {\n"
12065                "  Y = 0, // testing\n"
12066                "  }\n",
12067                WhitesmithsBraceStyle);
12068 
12069   verifyFormat("enum X\n"
12070                "  {\n"
12071                "  Y = 0\n"
12072                "  }\n",
12073                WhitesmithsBraceStyle);
12074   verifyFormat("enum X\n"
12075                "  {\n"
12076                "  Y = 0,\n"
12077                "  Z = 1\n"
12078                "  };\n",
12079                WhitesmithsBraceStyle);
12080 
12081   verifyFormat("@interface BSApplicationController ()\n"
12082                "  {\n"
12083                "@private\n"
12084                "  id _extraIvar;\n"
12085                "  }\n"
12086                "@end\n",
12087                WhitesmithsBraceStyle);
12088 
12089   verifyFormat("#ifdef _DEBUG\n"
12090                "int foo(int i = 0)\n"
12091                "#else\n"
12092                "int foo(int i = 5)\n"
12093                "#endif\n"
12094                "  {\n"
12095                "  return i;\n"
12096                "  }",
12097                WhitesmithsBraceStyle);
12098 
12099   verifyFormat("void foo() {}\n"
12100                "void bar()\n"
12101                "#ifdef _DEBUG\n"
12102                "  {\n"
12103                "  foo();\n"
12104                "  }\n"
12105                "#else\n"
12106                "  {\n"
12107                "  }\n"
12108                "#endif",
12109                WhitesmithsBraceStyle);
12110 
12111   verifyFormat("void foobar()\n"
12112                "  {\n"
12113                "  int i = 5;\n"
12114                "  }\n"
12115                "#ifdef _DEBUG\n"
12116                "void bar()\n"
12117                "  {\n"
12118                "  }\n"
12119                "#else\n"
12120                "void bar()\n"
12121                "  {\n"
12122                "  foobar();\n"
12123                "  }\n"
12124                "#endif",
12125                WhitesmithsBraceStyle);
12126 
12127   // This shouldn't affect ObjC blocks..
12128   verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
12129                "  // ...\n"
12130                "  int i;\n"
12131                "}];",
12132                WhitesmithsBraceStyle);
12133   verifyFormat("void (^block)(void) = ^{\n"
12134                "  // ...\n"
12135                "  int i;\n"
12136                "};",
12137                WhitesmithsBraceStyle);
12138   // .. or dict literals.
12139   verifyFormat("void f()\n"
12140                "  {\n"
12141                "  [object someMethod:@{@\"a\" : @\"b\"}];\n"
12142                "  }",
12143                WhitesmithsBraceStyle);
12144 
12145   verifyFormat("int f()\n"
12146                "  { // comment\n"
12147                "  return 42;\n"
12148                "  }",
12149                WhitesmithsBraceStyle);
12150 
12151   FormatStyle BreakBeforeBraceShortIfs = WhitesmithsBraceStyle;
12152   BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine =
12153       FormatStyle::SIS_Always;
12154   BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
12155   verifyFormat("void f(bool b)\n"
12156                "  {\n"
12157                "  if (b)\n"
12158                "    {\n"
12159                "    return;\n"
12160                "    }\n"
12161                "  }\n",
12162                BreakBeforeBraceShortIfs);
12163   verifyFormat("void f(bool b)\n"
12164                "  {\n"
12165                "  if (b) return;\n"
12166                "  }\n",
12167                BreakBeforeBraceShortIfs);
12168   verifyFormat("void f(bool b)\n"
12169                "  {\n"
12170                "  while (b)\n"
12171                "    {\n"
12172                "    return;\n"
12173                "    }\n"
12174                "  }\n",
12175                BreakBeforeBraceShortIfs);
12176 }
12177 
12178 TEST_F(FormatTest, GNUBraceBreaking) {
12179   FormatStyle GNUBraceStyle = getLLVMStyle();
12180   GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
12181   verifyFormat("namespace a\n"
12182                "{\n"
12183                "class A\n"
12184                "{\n"
12185                "  void f()\n"
12186                "  {\n"
12187                "    int a;\n"
12188                "    {\n"
12189                "      int b;\n"
12190                "    }\n"
12191                "    if (true)\n"
12192                "      {\n"
12193                "        a();\n"
12194                "        b();\n"
12195                "      }\n"
12196                "  }\n"
12197                "  void g() { return; }\n"
12198                "}\n"
12199                "} // namespace a",
12200                GNUBraceStyle);
12201 
12202   verifyFormat("void f()\n"
12203                "{\n"
12204                "  if (true)\n"
12205                "    {\n"
12206                "      a();\n"
12207                "    }\n"
12208                "  else if (false)\n"
12209                "    {\n"
12210                "      b();\n"
12211                "    }\n"
12212                "  else\n"
12213                "    {\n"
12214                "      c();\n"
12215                "    }\n"
12216                "}\n",
12217                GNUBraceStyle);
12218 
12219   verifyFormat("void f()\n"
12220                "{\n"
12221                "  for (int i = 0; i < 10; ++i)\n"
12222                "    {\n"
12223                "      a();\n"
12224                "    }\n"
12225                "  while (false)\n"
12226                "    {\n"
12227                "      b();\n"
12228                "    }\n"
12229                "  do\n"
12230                "    {\n"
12231                "      c();\n"
12232                "    }\n"
12233                "  while (false);\n"
12234                "}\n",
12235                GNUBraceStyle);
12236 
12237   verifyFormat("void f(int a)\n"
12238                "{\n"
12239                "  switch (a)\n"
12240                "    {\n"
12241                "    case 0:\n"
12242                "      break;\n"
12243                "    case 1:\n"
12244                "      {\n"
12245                "        break;\n"
12246                "      }\n"
12247                "    case 2:\n"
12248                "      {\n"
12249                "      }\n"
12250                "      break;\n"
12251                "    default:\n"
12252                "      break;\n"
12253                "    }\n"
12254                "}\n",
12255                GNUBraceStyle);
12256 
12257   verifyFormat("enum X\n"
12258                "{\n"
12259                "  Y = 0,\n"
12260                "}\n",
12261                GNUBraceStyle);
12262 
12263   verifyFormat("@interface BSApplicationController ()\n"
12264                "{\n"
12265                "@private\n"
12266                "  id _extraIvar;\n"
12267                "}\n"
12268                "@end\n",
12269                GNUBraceStyle);
12270 
12271   verifyFormat("#ifdef _DEBUG\n"
12272                "int foo(int i = 0)\n"
12273                "#else\n"
12274                "int foo(int i = 5)\n"
12275                "#endif\n"
12276                "{\n"
12277                "  return i;\n"
12278                "}",
12279                GNUBraceStyle);
12280 
12281   verifyFormat("void foo() {}\n"
12282                "void bar()\n"
12283                "#ifdef _DEBUG\n"
12284                "{\n"
12285                "  foo();\n"
12286                "}\n"
12287                "#else\n"
12288                "{\n"
12289                "}\n"
12290                "#endif",
12291                GNUBraceStyle);
12292 
12293   verifyFormat("void foobar() { int i = 5; }\n"
12294                "#ifdef _DEBUG\n"
12295                "void bar() {}\n"
12296                "#else\n"
12297                "void bar() { foobar(); }\n"
12298                "#endif",
12299                GNUBraceStyle);
12300 }
12301 
12302 TEST_F(FormatTest, WebKitBraceBreaking) {
12303   FormatStyle WebKitBraceStyle = getLLVMStyle();
12304   WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
12305   WebKitBraceStyle.FixNamespaceComments = false;
12306   verifyFormat("namespace a {\n"
12307                "class A {\n"
12308                "  void f()\n"
12309                "  {\n"
12310                "    if (true) {\n"
12311                "      a();\n"
12312                "      b();\n"
12313                "    }\n"
12314                "  }\n"
12315                "  void g() { return; }\n"
12316                "};\n"
12317                "enum E {\n"
12318                "  A,\n"
12319                "  // foo\n"
12320                "  B,\n"
12321                "  C\n"
12322                "};\n"
12323                "struct B {\n"
12324                "  int x;\n"
12325                "};\n"
12326                "}\n",
12327                WebKitBraceStyle);
12328   verifyFormat("struct S {\n"
12329                "  int Type;\n"
12330                "  union {\n"
12331                "    int x;\n"
12332                "    double y;\n"
12333                "  } Value;\n"
12334                "  class C {\n"
12335                "    MyFavoriteType Value;\n"
12336                "  } Class;\n"
12337                "};\n",
12338                WebKitBraceStyle);
12339 }
12340 
12341 TEST_F(FormatTest, CatchExceptionReferenceBinding) {
12342   verifyFormat("void f() {\n"
12343                "  try {\n"
12344                "  } catch (const Exception &e) {\n"
12345                "  }\n"
12346                "}\n",
12347                getLLVMStyle());
12348 }
12349 
12350 TEST_F(FormatTest, UnderstandsPragmas) {
12351   verifyFormat("#pragma omp reduction(| : var)");
12352   verifyFormat("#pragma omp reduction(+ : var)");
12353 
12354   EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
12355             "(including parentheses).",
12356             format("#pragma    mark   Any non-hyphenated or hyphenated string "
12357                    "(including parentheses)."));
12358 }
12359 
12360 TEST_F(FormatTest, UnderstandPragmaOption) {
12361   verifyFormat("#pragma option -C -A");
12362 
12363   EXPECT_EQ("#pragma option -C -A", format("#pragma    option   -C   -A"));
12364 }
12365 
12366 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
12367   FormatStyle Style = getLLVMStyle();
12368   Style.ColumnLimit = 20;
12369 
12370   // See PR41213
12371   EXPECT_EQ("/*\n"
12372             " *\t9012345\n"
12373             " * /8901\n"
12374             " */",
12375             format("/*\n"
12376                    " *\t9012345 /8901\n"
12377                    " */",
12378                    Style));
12379   EXPECT_EQ("/*\n"
12380             " *345678\n"
12381             " *\t/8901\n"
12382             " */",
12383             format("/*\n"
12384                    " *345678\t/8901\n"
12385                    " */",
12386                    Style));
12387 
12388   verifyFormat("int a; // the\n"
12389                "       // comment",
12390                Style);
12391   EXPECT_EQ("int a; /* first line\n"
12392             "        * second\n"
12393             "        * line third\n"
12394             "        * line\n"
12395             "        */",
12396             format("int a; /* first line\n"
12397                    "        * second\n"
12398                    "        * line third\n"
12399                    "        * line\n"
12400                    "        */",
12401                    Style));
12402   EXPECT_EQ("int a; // first line\n"
12403             "       // second\n"
12404             "       // line third\n"
12405             "       // line",
12406             format("int a; // first line\n"
12407                    "       // second line\n"
12408                    "       // third line",
12409                    Style));
12410 
12411   Style.PenaltyExcessCharacter = 90;
12412   verifyFormat("int a; // the comment", Style);
12413   EXPECT_EQ("int a; // the comment\n"
12414             "       // aaa",
12415             format("int a; // the comment aaa", Style));
12416   EXPECT_EQ("int a; /* first line\n"
12417             "        * second line\n"
12418             "        * third line\n"
12419             "        */",
12420             format("int a; /* first line\n"
12421                    "        * second line\n"
12422                    "        * third line\n"
12423                    "        */",
12424                    Style));
12425   EXPECT_EQ("int a; // first line\n"
12426             "       // second line\n"
12427             "       // third line",
12428             format("int a; // first line\n"
12429                    "       // second line\n"
12430                    "       // third line",
12431                    Style));
12432   // FIXME: Investigate why this is not getting the same layout as the test
12433   // above.
12434   EXPECT_EQ("int a; /* first line\n"
12435             "        * second line\n"
12436             "        * third line\n"
12437             "        */",
12438             format("int a; /* first line second line third line"
12439                    "\n*/",
12440                    Style));
12441 
12442   EXPECT_EQ("// foo bar baz bazfoo\n"
12443             "// foo bar foo bar\n",
12444             format("// foo bar baz bazfoo\n"
12445                    "// foo bar foo           bar\n",
12446                    Style));
12447   EXPECT_EQ("// foo bar baz bazfoo\n"
12448             "// foo bar foo bar\n",
12449             format("// foo bar baz      bazfoo\n"
12450                    "// foo            bar foo bar\n",
12451                    Style));
12452 
12453   // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
12454   // next one.
12455   EXPECT_EQ("// foo bar baz bazfoo\n"
12456             "// bar foo bar\n",
12457             format("// foo bar baz      bazfoo bar\n"
12458                    "// foo            bar\n",
12459                    Style));
12460 
12461   EXPECT_EQ("// foo bar baz bazfoo\n"
12462             "// foo bar baz bazfoo\n"
12463             "// bar foo bar\n",
12464             format("// foo bar baz      bazfoo\n"
12465                    "// foo bar baz      bazfoo bar\n"
12466                    "// foo bar\n",
12467                    Style));
12468 
12469   EXPECT_EQ("// foo bar baz bazfoo\n"
12470             "// foo bar baz bazfoo\n"
12471             "// bar foo bar\n",
12472             format("// foo bar baz      bazfoo\n"
12473                    "// foo bar baz      bazfoo bar\n"
12474                    "// foo           bar\n",
12475                    Style));
12476 
12477   // Make sure we do not keep protruding characters if strict mode reflow is
12478   // cheaper than keeping protruding characters.
12479   Style.ColumnLimit = 21;
12480   EXPECT_EQ(
12481       "// foo foo foo foo\n"
12482       "// foo foo foo foo\n"
12483       "// foo foo foo foo\n",
12484       format("// foo foo foo foo foo foo foo foo foo foo foo foo\n", Style));
12485 
12486   EXPECT_EQ("int a = /* long block\n"
12487             "           comment */\n"
12488             "    42;",
12489             format("int a = /* long block comment */ 42;", Style));
12490 }
12491 
12492 #define EXPECT_ALL_STYLES_EQUAL(Styles)                                        \
12493   for (size_t i = 1; i < Styles.size(); ++i)                                   \
12494   EXPECT_EQ(Styles[0], Styles[i])                                              \
12495       << "Style #" << i << " of " << Styles.size() << " differs from Style #0"
12496 
12497 TEST_F(FormatTest, GetsPredefinedStyleByName) {
12498   SmallVector<FormatStyle, 3> Styles;
12499   Styles.resize(3);
12500 
12501   Styles[0] = getLLVMStyle();
12502   EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
12503   EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
12504   EXPECT_ALL_STYLES_EQUAL(Styles);
12505 
12506   Styles[0] = getGoogleStyle();
12507   EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
12508   EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
12509   EXPECT_ALL_STYLES_EQUAL(Styles);
12510 
12511   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
12512   EXPECT_TRUE(
12513       getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
12514   EXPECT_TRUE(
12515       getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
12516   EXPECT_ALL_STYLES_EQUAL(Styles);
12517 
12518   Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
12519   EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
12520   EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
12521   EXPECT_ALL_STYLES_EQUAL(Styles);
12522 
12523   Styles[0] = getMozillaStyle();
12524   EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
12525   EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
12526   EXPECT_ALL_STYLES_EQUAL(Styles);
12527 
12528   Styles[0] = getWebKitStyle();
12529   EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
12530   EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
12531   EXPECT_ALL_STYLES_EQUAL(Styles);
12532 
12533   Styles[0] = getGNUStyle();
12534   EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
12535   EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
12536   EXPECT_ALL_STYLES_EQUAL(Styles);
12537 
12538   EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
12539 }
12540 
12541 TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
12542   SmallVector<FormatStyle, 8> Styles;
12543   Styles.resize(2);
12544 
12545   Styles[0] = getGoogleStyle();
12546   Styles[1] = getLLVMStyle();
12547   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
12548   EXPECT_ALL_STYLES_EQUAL(Styles);
12549 
12550   Styles.resize(5);
12551   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
12552   Styles[1] = getLLVMStyle();
12553   Styles[1].Language = FormatStyle::LK_JavaScript;
12554   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
12555 
12556   Styles[2] = getLLVMStyle();
12557   Styles[2].Language = FormatStyle::LK_JavaScript;
12558   EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
12559                                   "BasedOnStyle: Google",
12560                                   &Styles[2])
12561                    .value());
12562 
12563   Styles[3] = getLLVMStyle();
12564   Styles[3].Language = FormatStyle::LK_JavaScript;
12565   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
12566                                   "Language: JavaScript",
12567                                   &Styles[3])
12568                    .value());
12569 
12570   Styles[4] = getLLVMStyle();
12571   Styles[4].Language = FormatStyle::LK_JavaScript;
12572   EXPECT_EQ(0, parseConfiguration("---\n"
12573                                   "BasedOnStyle: LLVM\n"
12574                                   "IndentWidth: 123\n"
12575                                   "---\n"
12576                                   "BasedOnStyle: Google\n"
12577                                   "Language: JavaScript",
12578                                   &Styles[4])
12579                    .value());
12580   EXPECT_ALL_STYLES_EQUAL(Styles);
12581 }
12582 
12583 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME)                             \
12584   Style.FIELD = false;                                                         \
12585   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value());      \
12586   EXPECT_TRUE(Style.FIELD);                                                    \
12587   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value());     \
12588   EXPECT_FALSE(Style.FIELD);
12589 
12590 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
12591 
12592 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME)              \
12593   Style.STRUCT.FIELD = false;                                                  \
12594   EXPECT_EQ(0,                                                                 \
12595             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": true", &Style)   \
12596                 .value());                                                     \
12597   EXPECT_TRUE(Style.STRUCT.FIELD);                                             \
12598   EXPECT_EQ(0,                                                                 \
12599             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": false", &Style)  \
12600                 .value());                                                     \
12601   EXPECT_FALSE(Style.STRUCT.FIELD);
12602 
12603 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD)                                 \
12604   CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
12605 
12606 #define CHECK_PARSE(TEXT, FIELD, VALUE)                                        \
12607   EXPECT_NE(VALUE, Style.FIELD);                                               \
12608   EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value());                      \
12609   EXPECT_EQ(VALUE, Style.FIELD)
12610 
12611 TEST_F(FormatTest, ParsesConfigurationBools) {
12612   FormatStyle Style = {};
12613   Style.Language = FormatStyle::LK_Cpp;
12614   CHECK_PARSE_BOOL(AlignOperands);
12615   CHECK_PARSE_BOOL(AlignTrailingComments);
12616   CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
12617   CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
12618   CHECK_PARSE_BOOL(AlignConsecutiveMacros);
12619   CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine);
12620   CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine);
12621   CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
12622   CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
12623   CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
12624   CHECK_PARSE_BOOL(BinPackArguments);
12625   CHECK_PARSE_BOOL(BinPackParameters);
12626   CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
12627   CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
12628   CHECK_PARSE_BOOL(BreakStringLiterals);
12629   CHECK_PARSE_BOOL(CompactNamespaces);
12630   CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
12631   CHECK_PARSE_BOOL(DeriveLineEnding);
12632   CHECK_PARSE_BOOL(DerivePointerAlignment);
12633   CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
12634   CHECK_PARSE_BOOL(DisableFormat);
12635   CHECK_PARSE_BOOL(IndentCaseLabels);
12636   CHECK_PARSE_BOOL(IndentCaseBlocks);
12637   CHECK_PARSE_BOOL(IndentGotoLabels);
12638   CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
12639   CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
12640   CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
12641   CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
12642   CHECK_PARSE_BOOL(Cpp11BracedListStyle);
12643   CHECK_PARSE_BOOL(ReflowComments);
12644   CHECK_PARSE_BOOL(SortIncludes);
12645   CHECK_PARSE_BOOL(SortUsingDeclarations);
12646   CHECK_PARSE_BOOL(SpacesInParentheses);
12647   CHECK_PARSE_BOOL(SpacesInSquareBrackets);
12648   CHECK_PARSE_BOOL(SpacesInAngles);
12649   CHECK_PARSE_BOOL(SpacesInConditionalStatement);
12650   CHECK_PARSE_BOOL(SpaceInEmptyBlock);
12651   CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
12652   CHECK_PARSE_BOOL(SpacesInContainerLiterals);
12653   CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
12654   CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
12655   CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
12656   CHECK_PARSE_BOOL(SpaceAfterLogicalNot);
12657   CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
12658   CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList);
12659   CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon);
12660   CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon);
12661   CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon);
12662   CHECK_PARSE_BOOL(SpaceBeforeSquareBrackets);
12663   CHECK_PARSE_BOOL(UseCRLF);
12664 
12665   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel);
12666   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
12667   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
12668   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
12669   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
12670   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
12671   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
12672   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
12673   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
12674   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
12675   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
12676   CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
12677   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
12678   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
12679   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
12680 }
12681 
12682 #undef CHECK_PARSE_BOOL
12683 
12684 TEST_F(FormatTest, ParsesConfiguration) {
12685   FormatStyle Style = {};
12686   Style.Language = FormatStyle::LK_Cpp;
12687   CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
12688   CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
12689               ConstructorInitializerIndentWidth, 1234u);
12690   CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
12691   CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
12692   CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
12693   CHECK_PARSE("PenaltyBreakAssignment: 1234", PenaltyBreakAssignment, 1234u);
12694   CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
12695               PenaltyBreakBeforeFirstCallParameter, 1234u);
12696   CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234",
12697               PenaltyBreakTemplateDeclaration, 1234u);
12698   CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
12699   CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
12700               PenaltyReturnTypeOnItsOwnLine, 1234u);
12701   CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
12702               SpacesBeforeTrailingComments, 1234u);
12703   CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
12704   CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
12705   CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
12706 
12707   Style.PointerAlignment = FormatStyle::PAS_Middle;
12708   CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
12709               FormatStyle::PAS_Left);
12710   CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
12711               FormatStyle::PAS_Right);
12712   CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
12713               FormatStyle::PAS_Middle);
12714   // For backward compatibility:
12715   CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
12716               FormatStyle::PAS_Left);
12717   CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
12718               FormatStyle::PAS_Right);
12719   CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
12720               FormatStyle::PAS_Middle);
12721 
12722   Style.Standard = FormatStyle::LS_Auto;
12723   CHECK_PARSE("Standard: c++03", Standard, FormatStyle::LS_Cpp03);
12724   CHECK_PARSE("Standard: c++11", Standard, FormatStyle::LS_Cpp11);
12725   CHECK_PARSE("Standard: c++14", Standard, FormatStyle::LS_Cpp14);
12726   CHECK_PARSE("Standard: c++17", Standard, FormatStyle::LS_Cpp17);
12727   CHECK_PARSE("Standard: c++20", Standard, FormatStyle::LS_Cpp20);
12728   CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
12729   CHECK_PARSE("Standard: Latest", Standard, FormatStyle::LS_Latest);
12730   // Legacy aliases:
12731   CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
12732   CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Latest);
12733   CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
12734   CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
12735 
12736   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
12737   CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
12738               BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
12739   CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
12740               FormatStyle::BOS_None);
12741   CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
12742               FormatStyle::BOS_All);
12743   // For backward compatibility:
12744   CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
12745               FormatStyle::BOS_None);
12746   CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
12747               FormatStyle::BOS_All);
12748 
12749   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
12750   CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
12751               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
12752   CHECK_PARSE("BreakConstructorInitializers: AfterColon",
12753               BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
12754   CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
12755               BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
12756   // For backward compatibility:
12757   CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
12758               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
12759 
12760   Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
12761   CHECK_PARSE("BreakInheritanceList: BeforeComma", BreakInheritanceList,
12762               FormatStyle::BILS_BeforeComma);
12763   CHECK_PARSE("BreakInheritanceList: AfterColon", BreakInheritanceList,
12764               FormatStyle::BILS_AfterColon);
12765   CHECK_PARSE("BreakInheritanceList: BeforeColon", BreakInheritanceList,
12766               FormatStyle::BILS_BeforeColon);
12767   // For backward compatibility:
12768   CHECK_PARSE("BreakBeforeInheritanceComma: true", BreakInheritanceList,
12769               FormatStyle::BILS_BeforeComma);
12770 
12771   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
12772   CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
12773               FormatStyle::BAS_Align);
12774   CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
12775               FormatStyle::BAS_DontAlign);
12776   CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
12777               FormatStyle::BAS_AlwaysBreak);
12778   // For backward compatibility:
12779   CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
12780               FormatStyle::BAS_DontAlign);
12781   CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
12782               FormatStyle::BAS_Align);
12783 
12784   Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
12785   CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
12786               FormatStyle::ENAS_DontAlign);
12787   CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
12788               FormatStyle::ENAS_Left);
12789   CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
12790               FormatStyle::ENAS_Right);
12791   // For backward compatibility:
12792   CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
12793               FormatStyle::ENAS_Left);
12794   CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
12795               FormatStyle::ENAS_Right);
12796 
12797   Style.UseTab = FormatStyle::UT_ForIndentation;
12798   CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
12799   CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
12800   CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
12801   CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
12802               FormatStyle::UT_ForContinuationAndIndentation);
12803   // For backward compatibility:
12804   CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
12805   CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
12806 
12807   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty;
12808   CHECK_PARSE("AllowShortBlocksOnASingleLine: Never",
12809               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never);
12810   CHECK_PARSE("AllowShortBlocksOnASingleLine: Empty",
12811               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Empty);
12812   CHECK_PARSE("AllowShortBlocksOnASingleLine: Always",
12813               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always);
12814   // For backward compatibility:
12815   CHECK_PARSE("AllowShortBlocksOnASingleLine: false",
12816               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never);
12817   CHECK_PARSE("AllowShortBlocksOnASingleLine: true",
12818               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always);
12819 
12820   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
12821   CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
12822               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
12823   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
12824               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
12825   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
12826               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
12827   CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
12828               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
12829   // For backward compatibility:
12830   CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
12831               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
12832   CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
12833               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
12834 
12835   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
12836   CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
12837               FormatStyle::SBPO_Never);
12838   CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
12839               FormatStyle::SBPO_Always);
12840   CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
12841               FormatStyle::SBPO_ControlStatements);
12842   CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens,
12843               FormatStyle::SBPO_NonEmptyParentheses);
12844   // For backward compatibility:
12845   CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
12846               FormatStyle::SBPO_Never);
12847   CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
12848               FormatStyle::SBPO_ControlStatements);
12849 
12850   Style.ColumnLimit = 123;
12851   FormatStyle BaseStyle = getLLVMStyle();
12852   CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
12853   CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
12854 
12855   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
12856   CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
12857               FormatStyle::BS_Attach);
12858   CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
12859               FormatStyle::BS_Linux);
12860   CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
12861               FormatStyle::BS_Mozilla);
12862   CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
12863               FormatStyle::BS_Stroustrup);
12864   CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
12865               FormatStyle::BS_Allman);
12866   CHECK_PARSE("BreakBeforeBraces: Whitesmiths", BreakBeforeBraces,
12867               FormatStyle::BS_Whitesmiths);
12868   CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
12869   CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
12870               FormatStyle::BS_WebKit);
12871   CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
12872               FormatStyle::BS_Custom);
12873 
12874   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Never;
12875   CHECK_PARSE("BraceWrapping:\n"
12876               "  AfterControlStatement: MultiLine",
12877               BraceWrapping.AfterControlStatement,
12878               FormatStyle::BWACS_MultiLine);
12879   CHECK_PARSE("BraceWrapping:\n"
12880               "  AfterControlStatement: Always",
12881               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always);
12882   CHECK_PARSE("BraceWrapping:\n"
12883               "  AfterControlStatement: Never",
12884               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never);
12885   // For backward compatibility:
12886   CHECK_PARSE("BraceWrapping:\n"
12887               "  AfterControlStatement: true",
12888               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always);
12889   CHECK_PARSE("BraceWrapping:\n"
12890               "  AfterControlStatement: false",
12891               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never);
12892 
12893   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
12894   CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
12895               FormatStyle::RTBS_None);
12896   CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
12897               FormatStyle::RTBS_All);
12898   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
12899               AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
12900   CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
12901               AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
12902   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
12903               AlwaysBreakAfterReturnType,
12904               FormatStyle::RTBS_TopLevelDefinitions);
12905 
12906   Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
12907   CHECK_PARSE("AlwaysBreakTemplateDeclarations: No",
12908               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_No);
12909   CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine",
12910               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine);
12911   CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes",
12912               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes);
12913   CHECK_PARSE("AlwaysBreakTemplateDeclarations: false",
12914               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine);
12915   CHECK_PARSE("AlwaysBreakTemplateDeclarations: true",
12916               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes);
12917 
12918   Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
12919   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
12920               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
12921   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
12922               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
12923   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
12924               AlwaysBreakAfterDefinitionReturnType,
12925               FormatStyle::DRTBS_TopLevel);
12926 
12927   Style.NamespaceIndentation = FormatStyle::NI_All;
12928   CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
12929               FormatStyle::NI_None);
12930   CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
12931               FormatStyle::NI_Inner);
12932   CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
12933               FormatStyle::NI_All);
12934 
12935   Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always;
12936   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never",
12937               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
12938   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse",
12939               AllowShortIfStatementsOnASingleLine,
12940               FormatStyle::SIS_WithoutElse);
12941   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always",
12942               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always);
12943   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false",
12944               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
12945   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true",
12946               AllowShortIfStatementsOnASingleLine,
12947               FormatStyle::SIS_WithoutElse);
12948 
12949   // FIXME: This is required because parsing a configuration simply overwrites
12950   // the first N elements of the list instead of resetting it.
12951   Style.ForEachMacros.clear();
12952   std::vector<std::string> BoostForeach;
12953   BoostForeach.push_back("BOOST_FOREACH");
12954   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
12955   std::vector<std::string> BoostAndQForeach;
12956   BoostAndQForeach.push_back("BOOST_FOREACH");
12957   BoostAndQForeach.push_back("Q_FOREACH");
12958   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
12959               BoostAndQForeach);
12960 
12961   Style.StatementMacros.clear();
12962   CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros,
12963               std::vector<std::string>{"QUNUSED"});
12964   CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros,
12965               std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"}));
12966 
12967   Style.NamespaceMacros.clear();
12968   CHECK_PARSE("NamespaceMacros: [TESTSUITE]", NamespaceMacros,
12969               std::vector<std::string>{"TESTSUITE"});
12970   CHECK_PARSE("NamespaceMacros: [TESTSUITE, SUITE]", NamespaceMacros,
12971               std::vector<std::string>({"TESTSUITE", "SUITE"}));
12972 
12973   Style.IncludeStyle.IncludeCategories.clear();
12974   std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = {
12975       {"abc/.*", 2, 0}, {".*", 1, 0}};
12976   CHECK_PARSE("IncludeCategories:\n"
12977               "  - Regex: abc/.*\n"
12978               "    Priority: 2\n"
12979               "  - Regex: .*\n"
12980               "    Priority: 1",
12981               IncludeStyle.IncludeCategories, ExpectedCategories);
12982   CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex,
12983               "abc$");
12984   CHECK_PARSE("IncludeIsMainSourceRegex: 'abc$'",
12985               IncludeStyle.IncludeIsMainSourceRegex, "abc$");
12986 
12987   Style.RawStringFormats.clear();
12988   std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
12989       {
12990           FormatStyle::LK_TextProto,
12991           {"pb", "proto"},
12992           {"PARSE_TEXT_PROTO"},
12993           /*CanonicalDelimiter=*/"",
12994           "llvm",
12995       },
12996       {
12997           FormatStyle::LK_Cpp,
12998           {"cc", "cpp"},
12999           {"C_CODEBLOCK", "CPPEVAL"},
13000           /*CanonicalDelimiter=*/"cc",
13001           /*BasedOnStyle=*/"",
13002       },
13003   };
13004 
13005   CHECK_PARSE("RawStringFormats:\n"
13006               "  - Language: TextProto\n"
13007               "    Delimiters:\n"
13008               "      - 'pb'\n"
13009               "      - 'proto'\n"
13010               "    EnclosingFunctions:\n"
13011               "      - 'PARSE_TEXT_PROTO'\n"
13012               "    BasedOnStyle: llvm\n"
13013               "  - Language: Cpp\n"
13014               "    Delimiters:\n"
13015               "      - 'cc'\n"
13016               "      - 'cpp'\n"
13017               "    EnclosingFunctions:\n"
13018               "      - 'C_CODEBLOCK'\n"
13019               "      - 'CPPEVAL'\n"
13020               "    CanonicalDelimiter: 'cc'",
13021               RawStringFormats, ExpectedRawStringFormats);
13022 }
13023 
13024 TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
13025   FormatStyle Style = {};
13026   Style.Language = FormatStyle::LK_Cpp;
13027   CHECK_PARSE("Language: Cpp\n"
13028               "IndentWidth: 12",
13029               IndentWidth, 12u);
13030   EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
13031                                "IndentWidth: 34",
13032                                &Style),
13033             ParseError::Unsuitable);
13034   FormatStyle BinPackedTCS = {};
13035   BinPackedTCS.Language = FormatStyle::LK_JavaScript;
13036   EXPECT_EQ(parseConfiguration("BinPackArguments: true\n"
13037                                "InsertTrailingCommas: Wrapped",
13038                                &BinPackedTCS),
13039             ParseError::BinPackTrailingCommaConflict);
13040   EXPECT_EQ(12u, Style.IndentWidth);
13041   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
13042   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
13043 
13044   Style.Language = FormatStyle::LK_JavaScript;
13045   CHECK_PARSE("Language: JavaScript\n"
13046               "IndentWidth: 12",
13047               IndentWidth, 12u);
13048   CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
13049   EXPECT_EQ(parseConfiguration("Language: Cpp\n"
13050                                "IndentWidth: 34",
13051                                &Style),
13052             ParseError::Unsuitable);
13053   EXPECT_EQ(23u, Style.IndentWidth);
13054   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
13055   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
13056 
13057   CHECK_PARSE("BasedOnStyle: LLVM\n"
13058               "IndentWidth: 67",
13059               IndentWidth, 67u);
13060 
13061   CHECK_PARSE("---\n"
13062               "Language: JavaScript\n"
13063               "IndentWidth: 12\n"
13064               "---\n"
13065               "Language: Cpp\n"
13066               "IndentWidth: 34\n"
13067               "...\n",
13068               IndentWidth, 12u);
13069 
13070   Style.Language = FormatStyle::LK_Cpp;
13071   CHECK_PARSE("---\n"
13072               "Language: JavaScript\n"
13073               "IndentWidth: 12\n"
13074               "---\n"
13075               "Language: Cpp\n"
13076               "IndentWidth: 34\n"
13077               "...\n",
13078               IndentWidth, 34u);
13079   CHECK_PARSE("---\n"
13080               "IndentWidth: 78\n"
13081               "---\n"
13082               "Language: JavaScript\n"
13083               "IndentWidth: 56\n"
13084               "...\n",
13085               IndentWidth, 78u);
13086 
13087   Style.ColumnLimit = 123;
13088   Style.IndentWidth = 234;
13089   Style.BreakBeforeBraces = FormatStyle::BS_Linux;
13090   Style.TabWidth = 345;
13091   EXPECT_FALSE(parseConfiguration("---\n"
13092                                   "IndentWidth: 456\n"
13093                                   "BreakBeforeBraces: Allman\n"
13094                                   "---\n"
13095                                   "Language: JavaScript\n"
13096                                   "IndentWidth: 111\n"
13097                                   "TabWidth: 111\n"
13098                                   "---\n"
13099                                   "Language: Cpp\n"
13100                                   "BreakBeforeBraces: Stroustrup\n"
13101                                   "TabWidth: 789\n"
13102                                   "...\n",
13103                                   &Style));
13104   EXPECT_EQ(123u, Style.ColumnLimit);
13105   EXPECT_EQ(456u, Style.IndentWidth);
13106   EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
13107   EXPECT_EQ(789u, Style.TabWidth);
13108 
13109   EXPECT_EQ(parseConfiguration("---\n"
13110                                "Language: JavaScript\n"
13111                                "IndentWidth: 56\n"
13112                                "---\n"
13113                                "IndentWidth: 78\n"
13114                                "...\n",
13115                                &Style),
13116             ParseError::Error);
13117   EXPECT_EQ(parseConfiguration("---\n"
13118                                "Language: JavaScript\n"
13119                                "IndentWidth: 56\n"
13120                                "---\n"
13121                                "Language: JavaScript\n"
13122                                "IndentWidth: 78\n"
13123                                "...\n",
13124                                &Style),
13125             ParseError::Error);
13126 
13127   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
13128 }
13129 
13130 #undef CHECK_PARSE
13131 
13132 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
13133   FormatStyle Style = {};
13134   Style.Language = FormatStyle::LK_JavaScript;
13135   Style.BreakBeforeTernaryOperators = true;
13136   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
13137   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
13138 
13139   Style.BreakBeforeTernaryOperators = true;
13140   EXPECT_EQ(0, parseConfiguration("---\n"
13141                                   "BasedOnStyle: Google\n"
13142                                   "---\n"
13143                                   "Language: JavaScript\n"
13144                                   "IndentWidth: 76\n"
13145                                   "...\n",
13146                                   &Style)
13147                    .value());
13148   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
13149   EXPECT_EQ(76u, Style.IndentWidth);
13150   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
13151 }
13152 
13153 TEST_F(FormatTest, ConfigurationRoundTripTest) {
13154   FormatStyle Style = getLLVMStyle();
13155   std::string YAML = configurationAsText(Style);
13156   FormatStyle ParsedStyle = {};
13157   ParsedStyle.Language = FormatStyle::LK_Cpp;
13158   EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
13159   EXPECT_EQ(Style, ParsedStyle);
13160 }
13161 
13162 TEST_F(FormatTest, WorksFor8bitEncodings) {
13163   EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
13164             "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
13165             "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
13166             "\"\xef\xee\xf0\xf3...\"",
13167             format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
13168                    "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
13169                    "\xef\xee\xf0\xf3...\"",
13170                    getLLVMStyleWithColumns(12)));
13171 }
13172 
13173 TEST_F(FormatTest, HandlesUTF8BOM) {
13174   EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
13175   EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
13176             format("\xef\xbb\xbf#include <iostream>"));
13177   EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
13178             format("\xef\xbb\xbf\n#include <iostream>"));
13179 }
13180 
13181 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
13182 #if !defined(_MSC_VER)
13183 
13184 TEST_F(FormatTest, CountsUTF8CharactersProperly) {
13185   verifyFormat("\"Однажды в студёную зимнюю пору...\"",
13186                getLLVMStyleWithColumns(35));
13187   verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
13188                getLLVMStyleWithColumns(31));
13189   verifyFormat("// Однажды в студёную зимнюю пору...",
13190                getLLVMStyleWithColumns(36));
13191   verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
13192   verifyFormat("/* Однажды в студёную зимнюю пору... */",
13193                getLLVMStyleWithColumns(39));
13194   verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
13195                getLLVMStyleWithColumns(35));
13196 }
13197 
13198 TEST_F(FormatTest, SplitsUTF8Strings) {
13199   // Non-printable characters' width is currently considered to be the length in
13200   // bytes in UTF8. The characters can be displayed in very different manner
13201   // (zero-width, single width with a substitution glyph, expanded to their code
13202   // (e.g. "<8d>"), so there's no single correct way to handle them.
13203   EXPECT_EQ("\"aaaaÄ\"\n"
13204             "\"\xc2\x8d\";",
13205             format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
13206   EXPECT_EQ("\"aaaaaaaÄ\"\n"
13207             "\"\xc2\x8d\";",
13208             format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
13209   EXPECT_EQ("\"Однажды, в \"\n"
13210             "\"студёную \"\n"
13211             "\"зимнюю \"\n"
13212             "\"пору,\"",
13213             format("\"Однажды, в студёную зимнюю пору,\"",
13214                    getLLVMStyleWithColumns(13)));
13215   EXPECT_EQ(
13216       "\"一 二 三 \"\n"
13217       "\"四 五六 \"\n"
13218       "\"七 八 九 \"\n"
13219       "\"十\"",
13220       format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
13221   EXPECT_EQ("\"一\t\"\n"
13222             "\"二 \t\"\n"
13223             "\"三 四 \"\n"
13224             "\"五\t\"\n"
13225             "\"六 \t\"\n"
13226             "\"七 \"\n"
13227             "\"八九十\tqq\"",
13228             format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
13229                    getLLVMStyleWithColumns(11)));
13230 
13231   // UTF8 character in an escape sequence.
13232   EXPECT_EQ("\"aaaaaa\"\n"
13233             "\"\\\xC2\x8D\"",
13234             format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
13235 }
13236 
13237 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
13238   EXPECT_EQ("const char *sssss =\n"
13239             "    \"一二三四五六七八\\\n"
13240             " 九 十\";",
13241             format("const char *sssss = \"一二三四五六七八\\\n"
13242                    " 九 十\";",
13243                    getLLVMStyleWithColumns(30)));
13244 }
13245 
13246 TEST_F(FormatTest, SplitsUTF8LineComments) {
13247   EXPECT_EQ("// aaaaÄ\xc2\x8d",
13248             format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
13249   EXPECT_EQ("// Я из лесу\n"
13250             "// вышел; был\n"
13251             "// сильный\n"
13252             "// мороз.",
13253             format("// Я из лесу вышел; был сильный мороз.",
13254                    getLLVMStyleWithColumns(13)));
13255   EXPECT_EQ("// 一二三\n"
13256             "// 四五六七\n"
13257             "// 八  九\n"
13258             "// 十",
13259             format("// 一二三 四五六七 八  九 十", getLLVMStyleWithColumns(9)));
13260 }
13261 
13262 TEST_F(FormatTest, SplitsUTF8BlockComments) {
13263   EXPECT_EQ("/* Гляжу,\n"
13264             " * поднимается\n"
13265             " * медленно в\n"
13266             " * гору\n"
13267             " * Лошадка,\n"
13268             " * везущая\n"
13269             " * хворосту\n"
13270             " * воз. */",
13271             format("/* Гляжу, поднимается медленно в гору\n"
13272                    " * Лошадка, везущая хворосту воз. */",
13273                    getLLVMStyleWithColumns(13)));
13274   EXPECT_EQ(
13275       "/* 一二三\n"
13276       " * 四五六七\n"
13277       " * 八  九\n"
13278       " * 十  */",
13279       format("/* 一二三 四五六七 八  九 十  */", getLLVMStyleWithColumns(9)));
13280   EXPECT_EQ("/* �������� ��������\n"
13281             " * ��������\n"
13282             " * ������-�� */",
13283             format("/* �������� �������� �������� ������-�� */", getLLVMStyleWithColumns(12)));
13284 }
13285 
13286 #endif // _MSC_VER
13287 
13288 TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
13289   FormatStyle Style = getLLVMStyle();
13290 
13291   Style.ConstructorInitializerIndentWidth = 4;
13292   verifyFormat(
13293       "SomeClass::Constructor()\n"
13294       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
13295       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
13296       Style);
13297 
13298   Style.ConstructorInitializerIndentWidth = 2;
13299   verifyFormat(
13300       "SomeClass::Constructor()\n"
13301       "  : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
13302       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
13303       Style);
13304 
13305   Style.ConstructorInitializerIndentWidth = 0;
13306   verifyFormat(
13307       "SomeClass::Constructor()\n"
13308       ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
13309       "  aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
13310       Style);
13311   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
13312   verifyFormat(
13313       "SomeLongTemplateVariableName<\n"
13314       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
13315       Style);
13316   verifyFormat("bool smaller = 1 < "
13317                "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
13318                "                       "
13319                "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
13320                Style);
13321 
13322   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
13323   verifyFormat("SomeClass::Constructor() :\n"
13324                "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n"
13325                "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}",
13326                Style);
13327 }
13328 
13329 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
13330   FormatStyle Style = getLLVMStyle();
13331   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
13332   Style.ConstructorInitializerIndentWidth = 4;
13333   verifyFormat("SomeClass::Constructor()\n"
13334                "    : a(a)\n"
13335                "    , b(b)\n"
13336                "    , c(c) {}",
13337                Style);
13338   verifyFormat("SomeClass::Constructor()\n"
13339                "    : a(a) {}",
13340                Style);
13341 
13342   Style.ColumnLimit = 0;
13343   verifyFormat("SomeClass::Constructor()\n"
13344                "    : a(a) {}",
13345                Style);
13346   verifyFormat("SomeClass::Constructor() noexcept\n"
13347                "    : a(a) {}",
13348                Style);
13349   verifyFormat("SomeClass::Constructor()\n"
13350                "    : a(a)\n"
13351                "    , b(b)\n"
13352                "    , c(c) {}",
13353                Style);
13354   verifyFormat("SomeClass::Constructor()\n"
13355                "    : a(a) {\n"
13356                "  foo();\n"
13357                "  bar();\n"
13358                "}",
13359                Style);
13360 
13361   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
13362   verifyFormat("SomeClass::Constructor()\n"
13363                "    : a(a)\n"
13364                "    , b(b)\n"
13365                "    , c(c) {\n}",
13366                Style);
13367   verifyFormat("SomeClass::Constructor()\n"
13368                "    : a(a) {\n}",
13369                Style);
13370 
13371   Style.ColumnLimit = 80;
13372   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
13373   Style.ConstructorInitializerIndentWidth = 2;
13374   verifyFormat("SomeClass::Constructor()\n"
13375                "  : a(a)\n"
13376                "  , b(b)\n"
13377                "  , c(c) {}",
13378                Style);
13379 
13380   Style.ConstructorInitializerIndentWidth = 0;
13381   verifyFormat("SomeClass::Constructor()\n"
13382                ": a(a)\n"
13383                ", b(b)\n"
13384                ", c(c) {}",
13385                Style);
13386 
13387   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
13388   Style.ConstructorInitializerIndentWidth = 4;
13389   verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
13390   verifyFormat(
13391       "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
13392       Style);
13393   verifyFormat(
13394       "SomeClass::Constructor()\n"
13395       "    : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
13396       Style);
13397   Style.ConstructorInitializerIndentWidth = 4;
13398   Style.ColumnLimit = 60;
13399   verifyFormat("SomeClass::Constructor()\n"
13400                "    : aaaaaaaa(aaaaaaaa)\n"
13401                "    , aaaaaaaa(aaaaaaaa)\n"
13402                "    , aaaaaaaa(aaaaaaaa) {}",
13403                Style);
13404 }
13405 
13406 TEST_F(FormatTest, Destructors) {
13407   verifyFormat("void F(int &i) { i.~int(); }");
13408   verifyFormat("void F(int &i) { i->~int(); }");
13409 }
13410 
13411 TEST_F(FormatTest, FormatsWithWebKitStyle) {
13412   FormatStyle Style = getWebKitStyle();
13413 
13414   // Don't indent in outer namespaces.
13415   verifyFormat("namespace outer {\n"
13416                "int i;\n"
13417                "namespace inner {\n"
13418                "    int i;\n"
13419                "} // namespace inner\n"
13420                "} // namespace outer\n"
13421                "namespace other_outer {\n"
13422                "int i;\n"
13423                "}",
13424                Style);
13425 
13426   // Don't indent case labels.
13427   verifyFormat("switch (variable) {\n"
13428                "case 1:\n"
13429                "case 2:\n"
13430                "    doSomething();\n"
13431                "    break;\n"
13432                "default:\n"
13433                "    ++variable;\n"
13434                "}",
13435                Style);
13436 
13437   // Wrap before binary operators.
13438   EXPECT_EQ("void f()\n"
13439             "{\n"
13440             "    if (aaaaaaaaaaaaaaaa\n"
13441             "        && bbbbbbbbbbbbbbbbbbbbbbbb\n"
13442             "        && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
13443             "        return;\n"
13444             "}",
13445             format("void f() {\n"
13446                    "if (aaaaaaaaaaaaaaaa\n"
13447                    "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
13448                    "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
13449                    "return;\n"
13450                    "}",
13451                    Style));
13452 
13453   // Allow functions on a single line.
13454   verifyFormat("void f() { return; }", Style);
13455 
13456   // Allow empty blocks on a single line and insert a space in empty blocks.
13457   EXPECT_EQ("void f() { }", format("void f() {}", Style));
13458   EXPECT_EQ("while (true) { }", format("while (true) {}", Style));
13459   // However, don't merge non-empty short loops.
13460   EXPECT_EQ("while (true) {\n"
13461             "    continue;\n"
13462             "}",
13463             format("while (true) { continue; }", Style));
13464 
13465   // Constructor initializers are formatted one per line with the "," on the
13466   // new line.
13467   verifyFormat("Constructor()\n"
13468                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
13469                "    , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
13470                "          aaaaaaaaaaaaaa)\n"
13471                "    , aaaaaaaaaaaaaaaaaaaaaaa()\n"
13472                "{\n"
13473                "}",
13474                Style);
13475   verifyFormat("SomeClass::Constructor()\n"
13476                "    : a(a)\n"
13477                "{\n"
13478                "}",
13479                Style);
13480   EXPECT_EQ("SomeClass::Constructor()\n"
13481             "    : a(a)\n"
13482             "{\n"
13483             "}",
13484             format("SomeClass::Constructor():a(a){}", Style));
13485   verifyFormat("SomeClass::Constructor()\n"
13486                "    : a(a)\n"
13487                "    , b(b)\n"
13488                "    , c(c)\n"
13489                "{\n"
13490                "}",
13491                Style);
13492   verifyFormat("SomeClass::Constructor()\n"
13493                "    : a(a)\n"
13494                "{\n"
13495                "    foo();\n"
13496                "    bar();\n"
13497                "}",
13498                Style);
13499 
13500   // Access specifiers should be aligned left.
13501   verifyFormat("class C {\n"
13502                "public:\n"
13503                "    int i;\n"
13504                "};",
13505                Style);
13506 
13507   // Do not align comments.
13508   verifyFormat("int a; // Do not\n"
13509                "double b; // align comments.",
13510                Style);
13511 
13512   // Do not align operands.
13513   EXPECT_EQ("ASSERT(aaaa\n"
13514             "    || bbbb);",
13515             format("ASSERT ( aaaa\n||bbbb);", Style));
13516 
13517   // Accept input's line breaks.
13518   EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
13519             "    || bbbbbbbbbbbbbbb) {\n"
13520             "    i++;\n"
13521             "}",
13522             format("if (aaaaaaaaaaaaaaa\n"
13523                    "|| bbbbbbbbbbbbbbb) { i++; }",
13524                    Style));
13525   EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
13526             "    i++;\n"
13527             "}",
13528             format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
13529 
13530   // Don't automatically break all macro definitions (llvm.org/PR17842).
13531   verifyFormat("#define aNumber 10", Style);
13532   // However, generally keep the line breaks that the user authored.
13533   EXPECT_EQ("#define aNumber \\\n"
13534             "    10",
13535             format("#define aNumber \\\n"
13536                    " 10",
13537                    Style));
13538 
13539   // Keep empty and one-element array literals on a single line.
13540   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
13541             "                                  copyItems:YES];",
13542             format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
13543                    "copyItems:YES];",
13544                    Style));
13545   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
13546             "                                  copyItems:YES];",
13547             format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
13548                    "             copyItems:YES];",
13549                    Style));
13550   // FIXME: This does not seem right, there should be more indentation before
13551   // the array literal's entries. Nested blocks have the same problem.
13552   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
13553             "    @\"a\",\n"
13554             "    @\"a\"\n"
13555             "]\n"
13556             "                                  copyItems:YES];",
13557             format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
13558                    "     @\"a\",\n"
13559                    "     @\"a\"\n"
13560                    "     ]\n"
13561                    "       copyItems:YES];",
13562                    Style));
13563   EXPECT_EQ(
13564       "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
13565       "                                  copyItems:YES];",
13566       format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
13567              "   copyItems:YES];",
13568              Style));
13569 
13570   verifyFormat("[self.a b:c c:d];", Style);
13571   EXPECT_EQ("[self.a b:c\n"
13572             "        c:d];",
13573             format("[self.a b:c\n"
13574                    "c:d];",
13575                    Style));
13576 }
13577 
13578 TEST_F(FormatTest, FormatsLambdas) {
13579   verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
13580   verifyFormat(
13581       "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n");
13582   verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
13583   verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
13584   verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
13585   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
13586   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
13587   verifyFormat("auto c = [a = [b = 42] {}] {};\n");
13588   verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
13589   verifyFormat("int x = f(*+[] {});");
13590   verifyFormat("void f() {\n"
13591                "  other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
13592                "}\n");
13593   verifyFormat("void f() {\n"
13594                "  other(x.begin(), //\n"
13595                "        x.end(),   //\n"
13596                "        [&](int, int) { return 1; });\n"
13597                "}\n");
13598   verifyFormat("void f() {\n"
13599                "  other.other.other.other.other(\n"
13600                "      x.begin(), x.end(),\n"
13601                "      [something, rather](int, int, int, int, int, int, int) { "
13602                "return 1; });\n"
13603                "}\n");
13604   verifyFormat(
13605       "void f() {\n"
13606       "  other.other.other.other.other(\n"
13607       "      x.begin(), x.end(),\n"
13608       "      [something, rather](int, int, int, int, int, int, int) {\n"
13609       "        //\n"
13610       "      });\n"
13611       "}\n");
13612   verifyFormat("SomeFunction([]() { // A cool function...\n"
13613                "  return 43;\n"
13614                "});");
13615   EXPECT_EQ("SomeFunction([]() {\n"
13616             "#define A a\n"
13617             "  return 43;\n"
13618             "});",
13619             format("SomeFunction([](){\n"
13620                    "#define A a\n"
13621                    "return 43;\n"
13622                    "});"));
13623   verifyFormat("void f() {\n"
13624                "  SomeFunction([](decltype(x), A *a) {});\n"
13625                "}");
13626   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
13627                "    [](const aaaaaaaaaa &a) { return a; });");
13628   verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
13629                "  SomeOtherFunctioooooooooooooooooooooooooon();\n"
13630                "});");
13631   verifyFormat("Constructor()\n"
13632                "    : Field([] { // comment\n"
13633                "        int i;\n"
13634                "      }) {}");
13635   verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
13636                "  return some_parameter.size();\n"
13637                "};");
13638   verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
13639                "    [](const string &s) { return s; };");
13640   verifyFormat("int i = aaaaaa ? 1 //\n"
13641                "               : [] {\n"
13642                "                   return 2; //\n"
13643                "                 }();");
13644   verifyFormat("llvm::errs() << \"number of twos is \"\n"
13645                "             << std::count_if(v.begin(), v.end(), [](int x) {\n"
13646                "                  return x == 2; // force break\n"
13647                "                });");
13648   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
13649                "    [=](int iiiiiiiiiiii) {\n"
13650                "      return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
13651                "             aaaaaaaaaaaaaaaaaaaaaaa;\n"
13652                "    });",
13653                getLLVMStyleWithColumns(60));
13654   verifyFormat("SomeFunction({[&] {\n"
13655                "                // comment\n"
13656                "              },\n"
13657                "              [&] {\n"
13658                "                // comment\n"
13659                "              }});");
13660   verifyFormat("SomeFunction({[&] {\n"
13661                "  // comment\n"
13662                "}});");
13663   verifyFormat(
13664       "virtual aaaaaaaaaaaaaaaa(\n"
13665       "    std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n"
13666       "    aaaaa aaaaaaaaa);");
13667 
13668   // Lambdas with return types.
13669   verifyFormat("int c = []() -> int { return 2; }();\n");
13670   verifyFormat("int c = []() -> int * { return 2; }();\n");
13671   verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
13672   verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
13673   verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
13674   verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
13675   verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
13676   verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
13677   verifyFormat("[a, a]() -> a<1> {};");
13678   verifyFormat("[]() -> foo<5 + 2> { return {}; };");
13679   verifyFormat("[]() -> foo<5 - 2> { return {}; };");
13680   verifyFormat("[]() -> foo<5 / 2> { return {}; };");
13681   verifyFormat("[]() -> foo<5 * 2> { return {}; };");
13682   verifyFormat("[]() -> foo<5 % 2> { return {}; };");
13683   verifyFormat("[]() -> foo<5 << 2> { return {}; };");
13684   verifyFormat("[]() -> foo<!5> { return {}; };");
13685   verifyFormat("[]() -> foo<~5> { return {}; };");
13686   verifyFormat("[]() -> foo<5 | 2> { return {}; };");
13687   verifyFormat("[]() -> foo<5 || 2> { return {}; };");
13688   verifyFormat("[]() -> foo<5 & 2> { return {}; };");
13689   verifyFormat("[]() -> foo<5 && 2> { return {}; };");
13690   verifyFormat("[]() -> foo<5 == 2> { return {}; };");
13691   verifyFormat("[]() -> foo<5 != 2> { return {}; };");
13692   verifyFormat("[]() -> foo<5 >= 2> { return {}; };");
13693   verifyFormat("[]() -> foo<5 <= 2> { return {}; };");
13694   verifyFormat("[]() -> foo<5 < 2> { return {}; };");
13695   verifyFormat("[]() -> foo<2 ? 1 : 0> { return {}; };");
13696   verifyFormat("namespace bar {\n"
13697                "// broken:\n"
13698                "auto foo{[]() -> foo<5 + 2> { return {}; }};\n"
13699                "} // namespace bar");
13700   verifyFormat("namespace bar {\n"
13701                "// broken:\n"
13702                "auto foo{[]() -> foo<5 - 2> { return {}; }};\n"
13703                "} // namespace bar");
13704   verifyFormat("namespace bar {\n"
13705                "// broken:\n"
13706                "auto foo{[]() -> foo<5 / 2> { return {}; }};\n"
13707                "} // namespace bar");
13708   verifyFormat("namespace bar {\n"
13709                "// broken:\n"
13710                "auto foo{[]() -> foo<5 * 2> { return {}; }};\n"
13711                "} // namespace bar");
13712   verifyFormat("namespace bar {\n"
13713                "// broken:\n"
13714                "auto foo{[]() -> foo<5 % 2> { return {}; }};\n"
13715                "} // namespace bar");
13716   verifyFormat("namespace bar {\n"
13717                "// broken:\n"
13718                "auto foo{[]() -> foo<5 << 2> { return {}; }};\n"
13719                "} // namespace bar");
13720   verifyFormat("namespace bar {\n"
13721                "// broken:\n"
13722                "auto foo{[]() -> foo<!5> { return {}; }};\n"
13723                "} // namespace bar");
13724   verifyFormat("namespace bar {\n"
13725                "// broken:\n"
13726                "auto foo{[]() -> foo<~5> { return {}; }};\n"
13727                "} // namespace bar");
13728   verifyFormat("namespace bar {\n"
13729                "// broken:\n"
13730                "auto foo{[]() -> foo<5 | 2> { return {}; }};\n"
13731                "} // namespace bar");
13732   verifyFormat("namespace bar {\n"
13733                "// broken:\n"
13734                "auto foo{[]() -> foo<5 || 2> { return {}; }};\n"
13735                "} // namespace bar");
13736   verifyFormat("namespace bar {\n"
13737                "// broken:\n"
13738                "auto foo{[]() -> foo<5 & 2> { return {}; }};\n"
13739                "} // namespace bar");
13740   verifyFormat("namespace bar {\n"
13741                "// broken:\n"
13742                "auto foo{[]() -> foo<5 && 2> { return {}; }};\n"
13743                "} // namespace bar");
13744   verifyFormat("namespace bar {\n"
13745                "// broken:\n"
13746                "auto foo{[]() -> foo<5 == 2> { return {}; }};\n"
13747                "} // namespace bar");
13748   verifyFormat("namespace bar {\n"
13749                "// broken:\n"
13750                "auto foo{[]() -> foo<5 != 2> { return {}; }};\n"
13751                "} // namespace bar");
13752   verifyFormat("namespace bar {\n"
13753                "// broken:\n"
13754                "auto foo{[]() -> foo<5 >= 2> { return {}; }};\n"
13755                "} // namespace bar");
13756   verifyFormat("namespace bar {\n"
13757                "// broken:\n"
13758                "auto foo{[]() -> foo<5 <= 2> { return {}; }};\n"
13759                "} // namespace bar");
13760   verifyFormat("namespace bar {\n"
13761                "// broken:\n"
13762                "auto foo{[]() -> foo<5 < 2> { return {}; }};\n"
13763                "} // namespace bar");
13764   verifyFormat("namespace bar {\n"
13765                "// broken:\n"
13766                "auto foo{[]() -> foo<2 ? 1 : 0> { return {}; }};\n"
13767                "} // namespace bar");
13768   verifyFormat("[]() -> a<1> {};");
13769   verifyFormat("[]() -> a<1> { ; };");
13770   verifyFormat("[]() -> a<1> { ; }();");
13771   verifyFormat("[a, a]() -> a<true> {};");
13772   verifyFormat("[]() -> a<true> {};");
13773   verifyFormat("[]() -> a<true> { ; };");
13774   verifyFormat("[]() -> a<true> { ; }();");
13775   verifyFormat("[a, a]() -> a<false> {};");
13776   verifyFormat("[]() -> a<false> {};");
13777   verifyFormat("[]() -> a<false> { ; };");
13778   verifyFormat("[]() -> a<false> { ; }();");
13779   verifyFormat("auto foo{[]() -> foo<false> { ; }};");
13780   verifyFormat("namespace bar {\n"
13781                "auto foo{[]() -> foo<false> { ; }};\n"
13782                "} // namespace bar");
13783   verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
13784                "                   int j) -> int {\n"
13785                "  return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
13786                "};");
13787   verifyFormat(
13788       "aaaaaaaaaaaaaaaaaaaaaa(\n"
13789       "    [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
13790       "      return aaaaaaaaaaaaaaaaa;\n"
13791       "    });",
13792       getLLVMStyleWithColumns(70));
13793   verifyFormat("[]() //\n"
13794                "    -> int {\n"
13795                "  return 1; //\n"
13796                "};");
13797 
13798   // Lambdas with explicit template argument lists.
13799   verifyFormat(
13800       "auto L = []<template <typename> class T, class U>(T<U> &&a) {};\n");
13801 
13802   // Multiple lambdas in the same parentheses change indentation rules. These
13803   // lambdas are forced to start on new lines.
13804   verifyFormat("SomeFunction(\n"
13805                "    []() {\n"
13806                "      //\n"
13807                "    },\n"
13808                "    []() {\n"
13809                "      //\n"
13810                "    });");
13811 
13812   // A lambda passed as arg0 is always pushed to the next line.
13813   verifyFormat("SomeFunction(\n"
13814                "    [this] {\n"
13815                "      //\n"
13816                "    },\n"
13817                "    1);\n");
13818 
13819   // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like
13820   // the arg0 case above.
13821   auto Style = getGoogleStyle();
13822   Style.BinPackArguments = false;
13823   verifyFormat("SomeFunction(\n"
13824                "    a,\n"
13825                "    [this] {\n"
13826                "      //\n"
13827                "    },\n"
13828                "    b);\n",
13829                Style);
13830   verifyFormat("SomeFunction(\n"
13831                "    a,\n"
13832                "    [this] {\n"
13833                "      //\n"
13834                "    },\n"
13835                "    b);\n");
13836 
13837   // A lambda with a very long line forces arg0 to be pushed out irrespective of
13838   // the BinPackArguments value (as long as the code is wide enough).
13839   verifyFormat(
13840       "something->SomeFunction(\n"
13841       "    a,\n"
13842       "    [this] {\n"
13843       "      "
13844       "D0000000000000000000000000000000000000000000000000000000000001();\n"
13845       "    },\n"
13846       "    b);\n");
13847 
13848   // A multi-line lambda is pulled up as long as the introducer fits on the
13849   // previous line and there are no further args.
13850   verifyFormat("function(1, [this, that] {\n"
13851                "  //\n"
13852                "});\n");
13853   verifyFormat("function([this, that] {\n"
13854                "  //\n"
13855                "});\n");
13856   // FIXME: this format is not ideal and we should consider forcing the first
13857   // arg onto its own line.
13858   verifyFormat("function(a, b, c, //\n"
13859                "         d, [this, that] {\n"
13860                "           //\n"
13861                "         });\n");
13862 
13863   // Multiple lambdas are treated correctly even when there is a short arg0.
13864   verifyFormat("SomeFunction(\n"
13865                "    1,\n"
13866                "    [this] {\n"
13867                "      //\n"
13868                "    },\n"
13869                "    [this] {\n"
13870                "      //\n"
13871                "    },\n"
13872                "    1);\n");
13873 
13874   // More complex introducers.
13875   verifyFormat("return [i, args...] {};");
13876 
13877   // Not lambdas.
13878   verifyFormat("constexpr char hello[]{\"hello\"};");
13879   verifyFormat("double &operator[](int i) { return 0; }\n"
13880                "int i;");
13881   verifyFormat("std::unique_ptr<int[]> foo() {}");
13882   verifyFormat("int i = a[a][a]->f();");
13883   verifyFormat("int i = (*b)[a]->f();");
13884 
13885   // Other corner cases.
13886   verifyFormat("void f() {\n"
13887                "  bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
13888                "  );\n"
13889                "}");
13890 
13891   // Lambdas created through weird macros.
13892   verifyFormat("void f() {\n"
13893                "  MACRO((const AA &a) { return 1; });\n"
13894                "  MACRO((AA &a) { return 1; });\n"
13895                "}");
13896 
13897   verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
13898                "      doo_dah();\n"
13899                "      doo_dah();\n"
13900                "    })) {\n"
13901                "}");
13902   verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
13903                "                doo_dah();\n"
13904                "                doo_dah();\n"
13905                "              })) {\n"
13906                "}");
13907   verifyFormat("if CONSTEXPR (blah_blah(whatever, whatever, [] {\n"
13908                "                doo_dah();\n"
13909                "                doo_dah();\n"
13910                "              })) {\n"
13911                "}");
13912   verifyFormat("auto lambda = []() {\n"
13913                "  int a = 2\n"
13914                "#if A\n"
13915                "          + 2\n"
13916                "#endif\n"
13917                "      ;\n"
13918                "};");
13919 
13920   // Lambdas with complex multiline introducers.
13921   verifyFormat(
13922       "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
13923       "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
13924       "        -> ::std::unordered_set<\n"
13925       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
13926       "      //\n"
13927       "    });");
13928 
13929   FormatStyle DoNotMerge = getLLVMStyle();
13930   DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None;
13931   verifyFormat("auto c = []() {\n"
13932                "  return b;\n"
13933                "};",
13934                "auto c = []() { return b; };", DoNotMerge);
13935   verifyFormat("auto c = []() {\n"
13936                "};",
13937                " auto c = []() {};", DoNotMerge);
13938 
13939   FormatStyle MergeEmptyOnly = getLLVMStyle();
13940   MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty;
13941   verifyFormat("auto c = []() {\n"
13942                "  return b;\n"
13943                "};",
13944                "auto c = []() {\n"
13945                "  return b;\n"
13946                " };",
13947                MergeEmptyOnly);
13948   verifyFormat("auto c = []() {};",
13949                "auto c = []() {\n"
13950                "};",
13951                MergeEmptyOnly);
13952 
13953   FormatStyle MergeInline = getLLVMStyle();
13954   MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline;
13955   verifyFormat("auto c = []() {\n"
13956                "  return b;\n"
13957                "};",
13958                "auto c = []() { return b; };", MergeInline);
13959   verifyFormat("function([]() { return b; })", "function([]() { return b; })",
13960                MergeInline);
13961   verifyFormat("function([]() { return b; }, a)",
13962                "function([]() { return b; }, a)", MergeInline);
13963   verifyFormat("function(a, []() { return b; })",
13964                "function(a, []() { return b; })", MergeInline);
13965 }
13966 
13967 TEST_F(FormatTest, EmptyLinesInLambdas) {
13968   verifyFormat("auto lambda = []() {\n"
13969                "  x(); //\n"
13970                "};",
13971                "auto lambda = []() {\n"
13972                "\n"
13973                "  x(); //\n"
13974                "\n"
13975                "};");
13976 }
13977 
13978 TEST_F(FormatTest, FormatsBlocks) {
13979   FormatStyle ShortBlocks = getLLVMStyle();
13980   ShortBlocks.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always;
13981   verifyFormat("int (^Block)(int, int);", ShortBlocks);
13982   verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
13983   verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
13984   verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
13985   verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
13986   verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
13987 
13988   verifyFormat("foo(^{ bar(); });", ShortBlocks);
13989   verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
13990   verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
13991 
13992   verifyFormat("[operation setCompletionBlock:^{\n"
13993                "  [self onOperationDone];\n"
13994                "}];");
13995   verifyFormat("int i = {[operation setCompletionBlock:^{\n"
13996                "  [self onOperationDone];\n"
13997                "}]};");
13998   verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
13999                "  f();\n"
14000                "}];");
14001   verifyFormat("int a = [operation block:^int(int *i) {\n"
14002                "  return 1;\n"
14003                "}];");
14004   verifyFormat("[myObject doSomethingWith:arg1\n"
14005                "                      aaa:^int(int *a) {\n"
14006                "                        return 1;\n"
14007                "                      }\n"
14008                "                      bbb:f(a * bbbbbbbb)];");
14009 
14010   verifyFormat("[operation setCompletionBlock:^{\n"
14011                "  [self.delegate newDataAvailable];\n"
14012                "}];",
14013                getLLVMStyleWithColumns(60));
14014   verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
14015                "  NSString *path = [self sessionFilePath];\n"
14016                "  if (path) {\n"
14017                "    // ...\n"
14018                "  }\n"
14019                "});");
14020   verifyFormat("[[SessionService sharedService]\n"
14021                "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
14022                "      if (window) {\n"
14023                "        [self windowDidLoad:window];\n"
14024                "      } else {\n"
14025                "        [self errorLoadingWindow];\n"
14026                "      }\n"
14027                "    }];");
14028   verifyFormat("void (^largeBlock)(void) = ^{\n"
14029                "  // ...\n"
14030                "};\n",
14031                getLLVMStyleWithColumns(40));
14032   verifyFormat("[[SessionService sharedService]\n"
14033                "    loadWindowWithCompletionBlock: //\n"
14034                "        ^(SessionWindow *window) {\n"
14035                "          if (window) {\n"
14036                "            [self windowDidLoad:window];\n"
14037                "          } else {\n"
14038                "            [self errorLoadingWindow];\n"
14039                "          }\n"
14040                "        }];",
14041                getLLVMStyleWithColumns(60));
14042   verifyFormat("[myObject doSomethingWith:arg1\n"
14043                "    firstBlock:^(Foo *a) {\n"
14044                "      // ...\n"
14045                "      int i;\n"
14046                "    }\n"
14047                "    secondBlock:^(Bar *b) {\n"
14048                "      // ...\n"
14049                "      int i;\n"
14050                "    }\n"
14051                "    thirdBlock:^Foo(Bar *b) {\n"
14052                "      // ...\n"
14053                "      int i;\n"
14054                "    }];");
14055   verifyFormat("[myObject doSomethingWith:arg1\n"
14056                "               firstBlock:-1\n"
14057                "              secondBlock:^(Bar *b) {\n"
14058                "                // ...\n"
14059                "                int i;\n"
14060                "              }];");
14061 
14062   verifyFormat("f(^{\n"
14063                "  @autoreleasepool {\n"
14064                "    if (a) {\n"
14065                "      g();\n"
14066                "    }\n"
14067                "  }\n"
14068                "});");
14069   verifyFormat("Block b = ^int *(A *a, B *b) {}");
14070   verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
14071                "};");
14072 
14073   FormatStyle FourIndent = getLLVMStyle();
14074   FourIndent.ObjCBlockIndentWidth = 4;
14075   verifyFormat("[operation setCompletionBlock:^{\n"
14076                "    [self onOperationDone];\n"
14077                "}];",
14078                FourIndent);
14079 }
14080 
14081 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
14082   FormatStyle ZeroColumn = getLLVMStyle();
14083   ZeroColumn.ColumnLimit = 0;
14084 
14085   verifyFormat("[[SessionService sharedService] "
14086                "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
14087                "  if (window) {\n"
14088                "    [self windowDidLoad:window];\n"
14089                "  } else {\n"
14090                "    [self errorLoadingWindow];\n"
14091                "  }\n"
14092                "}];",
14093                ZeroColumn);
14094   EXPECT_EQ("[[SessionService sharedService]\n"
14095             "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
14096             "      if (window) {\n"
14097             "        [self windowDidLoad:window];\n"
14098             "      } else {\n"
14099             "        [self errorLoadingWindow];\n"
14100             "      }\n"
14101             "    }];",
14102             format("[[SessionService sharedService]\n"
14103                    "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
14104                    "                if (window) {\n"
14105                    "    [self windowDidLoad:window];\n"
14106                    "  } else {\n"
14107                    "    [self errorLoadingWindow];\n"
14108                    "  }\n"
14109                    "}];",
14110                    ZeroColumn));
14111   verifyFormat("[myObject doSomethingWith:arg1\n"
14112                "    firstBlock:^(Foo *a) {\n"
14113                "      // ...\n"
14114                "      int i;\n"
14115                "    }\n"
14116                "    secondBlock:^(Bar *b) {\n"
14117                "      // ...\n"
14118                "      int i;\n"
14119                "    }\n"
14120                "    thirdBlock:^Foo(Bar *b) {\n"
14121                "      // ...\n"
14122                "      int i;\n"
14123                "    }];",
14124                ZeroColumn);
14125   verifyFormat("f(^{\n"
14126                "  @autoreleasepool {\n"
14127                "    if (a) {\n"
14128                "      g();\n"
14129                "    }\n"
14130                "  }\n"
14131                "});",
14132                ZeroColumn);
14133   verifyFormat("void (^largeBlock)(void) = ^{\n"
14134                "  // ...\n"
14135                "};",
14136                ZeroColumn);
14137 
14138   ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always;
14139   EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
14140             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
14141   ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never;
14142   EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
14143             "  int i;\n"
14144             "};",
14145             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
14146 }
14147 
14148 TEST_F(FormatTest, SupportsCRLF) {
14149   EXPECT_EQ("int a;\r\n"
14150             "int b;\r\n"
14151             "int c;\r\n",
14152             format("int a;\r\n"
14153                    "  int b;\r\n"
14154                    "    int c;\r\n",
14155                    getLLVMStyle()));
14156   EXPECT_EQ("int a;\r\n"
14157             "int b;\r\n"
14158             "int c;\r\n",
14159             format("int a;\r\n"
14160                    "  int b;\n"
14161                    "    int c;\r\n",
14162                    getLLVMStyle()));
14163   EXPECT_EQ("int a;\n"
14164             "int b;\n"
14165             "int c;\n",
14166             format("int a;\r\n"
14167                    "  int b;\n"
14168                    "    int c;\n",
14169                    getLLVMStyle()));
14170   EXPECT_EQ("\"aaaaaaa \"\r\n"
14171             "\"bbbbbbb\";\r\n",
14172             format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
14173   EXPECT_EQ("#define A \\\r\n"
14174             "  b;      \\\r\n"
14175             "  c;      \\\r\n"
14176             "  d;\r\n",
14177             format("#define A \\\r\n"
14178                    "  b; \\\r\n"
14179                    "  c; d; \r\n",
14180                    getGoogleStyle()));
14181 
14182   EXPECT_EQ("/*\r\n"
14183             "multi line block comments\r\n"
14184             "should not introduce\r\n"
14185             "an extra carriage return\r\n"
14186             "*/\r\n",
14187             format("/*\r\n"
14188                    "multi line block comments\r\n"
14189                    "should not introduce\r\n"
14190                    "an extra carriage return\r\n"
14191                    "*/\r\n"));
14192   EXPECT_EQ("/*\r\n"
14193             "\r\n"
14194             "*/",
14195             format("/*\r\n"
14196                    "    \r\r\r\n"
14197                    "*/"));
14198 
14199   FormatStyle style = getLLVMStyle();
14200 
14201   style.DeriveLineEnding = true;
14202   style.UseCRLF = false;
14203   EXPECT_EQ("union FooBarBazQux {\n"
14204             "  int foo;\n"
14205             "  int bar;\n"
14206             "  int baz;\n"
14207             "};",
14208             format("union FooBarBazQux {\r\n"
14209                    "  int foo;\n"
14210                    "  int bar;\r\n"
14211                    "  int baz;\n"
14212                    "};",
14213                    style));
14214   style.UseCRLF = true;
14215   EXPECT_EQ("union FooBarBazQux {\r\n"
14216             "  int foo;\r\n"
14217             "  int bar;\r\n"
14218             "  int baz;\r\n"
14219             "};",
14220             format("union FooBarBazQux {\r\n"
14221                    "  int foo;\n"
14222                    "  int bar;\r\n"
14223                    "  int baz;\n"
14224                    "};",
14225                    style));
14226 
14227   style.DeriveLineEnding = false;
14228   style.UseCRLF = false;
14229   EXPECT_EQ("union FooBarBazQux {\n"
14230             "  int foo;\n"
14231             "  int bar;\n"
14232             "  int baz;\n"
14233             "  int qux;\n"
14234             "};",
14235             format("union FooBarBazQux {\r\n"
14236                    "  int foo;\n"
14237                    "  int bar;\r\n"
14238                    "  int baz;\n"
14239                    "  int qux;\r\n"
14240                    "};",
14241                    style));
14242   style.UseCRLF = true;
14243   EXPECT_EQ("union FooBarBazQux {\r\n"
14244             "  int foo;\r\n"
14245             "  int bar;\r\n"
14246             "  int baz;\r\n"
14247             "  int qux;\r\n"
14248             "};",
14249             format("union FooBarBazQux {\r\n"
14250                    "  int foo;\n"
14251                    "  int bar;\r\n"
14252                    "  int baz;\n"
14253                    "  int qux;\n"
14254                    "};",
14255                    style));
14256 
14257   style.DeriveLineEnding = true;
14258   style.UseCRLF = false;
14259   EXPECT_EQ("union FooBarBazQux {\r\n"
14260             "  int foo;\r\n"
14261             "  int bar;\r\n"
14262             "  int baz;\r\n"
14263             "  int qux;\r\n"
14264             "};",
14265             format("union FooBarBazQux {\r\n"
14266                    "  int foo;\n"
14267                    "  int bar;\r\n"
14268                    "  int baz;\n"
14269                    "  int qux;\r\n"
14270                    "};",
14271                    style));
14272   style.UseCRLF = true;
14273   EXPECT_EQ("union FooBarBazQux {\n"
14274             "  int foo;\n"
14275             "  int bar;\n"
14276             "  int baz;\n"
14277             "  int qux;\n"
14278             "};",
14279             format("union FooBarBazQux {\r\n"
14280                    "  int foo;\n"
14281                    "  int bar;\r\n"
14282                    "  int baz;\n"
14283                    "  int qux;\n"
14284                    "};",
14285                    style));
14286 }
14287 
14288 TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
14289   verifyFormat("MY_CLASS(C) {\n"
14290                "  int i;\n"
14291                "  int j;\n"
14292                "};");
14293 }
14294 
14295 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
14296   FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
14297   TwoIndent.ContinuationIndentWidth = 2;
14298 
14299   EXPECT_EQ("int i =\n"
14300             "  longFunction(\n"
14301             "    arg);",
14302             format("int i = longFunction(arg);", TwoIndent));
14303 
14304   FormatStyle SixIndent = getLLVMStyleWithColumns(20);
14305   SixIndent.ContinuationIndentWidth = 6;
14306 
14307   EXPECT_EQ("int i =\n"
14308             "      longFunction(\n"
14309             "            arg);",
14310             format("int i = longFunction(arg);", SixIndent));
14311 }
14312 
14313 TEST_F(FormatTest, WrappedClosingParenthesisIndent) {
14314   FormatStyle Style = getLLVMStyle();
14315   verifyFormat("int Foo::getter(\n"
14316                "    //\n"
14317                ") const {\n"
14318                "  return foo;\n"
14319                "}",
14320                Style);
14321   verifyFormat("void Foo::setter(\n"
14322                "    //\n"
14323                ") {\n"
14324                "  foo = 1;\n"
14325                "}",
14326                Style);
14327 }
14328 
14329 TEST_F(FormatTest, SpacesInAngles) {
14330   FormatStyle Spaces = getLLVMStyle();
14331   Spaces.SpacesInAngles = true;
14332 
14333   verifyFormat("static_cast< int >(arg);", Spaces);
14334   verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
14335   verifyFormat("f< int, float >();", Spaces);
14336   verifyFormat("template <> g() {}", Spaces);
14337   verifyFormat("template < std::vector< int > > f() {}", Spaces);
14338   verifyFormat("std::function< void(int, int) > fct;", Spaces);
14339   verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
14340                Spaces);
14341 
14342   Spaces.Standard = FormatStyle::LS_Cpp03;
14343   Spaces.SpacesInAngles = true;
14344   verifyFormat("A< A< int > >();", Spaces);
14345 
14346   Spaces.SpacesInAngles = false;
14347   verifyFormat("A<A<int> >();", Spaces);
14348 
14349   Spaces.Standard = FormatStyle::LS_Cpp11;
14350   Spaces.SpacesInAngles = true;
14351   verifyFormat("A< A< int > >();", Spaces);
14352 
14353   Spaces.SpacesInAngles = false;
14354   verifyFormat("A<A<int>>();", Spaces);
14355 }
14356 
14357 TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
14358   FormatStyle Style = getLLVMStyle();
14359   Style.SpaceAfterTemplateKeyword = false;
14360   verifyFormat("template<int> void foo();", Style);
14361 }
14362 
14363 TEST_F(FormatTest, TripleAngleBrackets) {
14364   verifyFormat("f<<<1, 1>>>();");
14365   verifyFormat("f<<<1, 1, 1, s>>>();");
14366   verifyFormat("f<<<a, b, c, d>>>();");
14367   EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
14368   verifyFormat("f<param><<<1, 1>>>();");
14369   verifyFormat("f<1><<<1, 1>>>();");
14370   EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
14371   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
14372                "aaaaaaaaaaa<<<\n    1, 1>>>();");
14373   verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
14374                "    <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
14375 }
14376 
14377 TEST_F(FormatTest, MergeLessLessAtEnd) {
14378   verifyFormat("<<");
14379   EXPECT_EQ("< < <", format("\\\n<<<"));
14380   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
14381                "aaallvm::outs() <<");
14382   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
14383                "aaaallvm::outs()\n    <<");
14384 }
14385 
14386 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
14387   std::string code = "#if A\n"
14388                      "#if B\n"
14389                      "a.\n"
14390                      "#endif\n"
14391                      "    a = 1;\n"
14392                      "#else\n"
14393                      "#endif\n"
14394                      "#if C\n"
14395                      "#else\n"
14396                      "#endif\n";
14397   EXPECT_EQ(code, format(code));
14398 }
14399 
14400 TEST_F(FormatTest, HandleConflictMarkers) {
14401   // Git/SVN conflict markers.
14402   EXPECT_EQ("int a;\n"
14403             "void f() {\n"
14404             "  callme(some(parameter1,\n"
14405             "<<<<<<< text by the vcs\n"
14406             "              parameter2),\n"
14407             "||||||| text by the vcs\n"
14408             "              parameter2),\n"
14409             "         parameter3,\n"
14410             "======= text by the vcs\n"
14411             "              parameter2, parameter3),\n"
14412             ">>>>>>> text by the vcs\n"
14413             "         otherparameter);\n",
14414             format("int a;\n"
14415                    "void f() {\n"
14416                    "  callme(some(parameter1,\n"
14417                    "<<<<<<< text by the vcs\n"
14418                    "  parameter2),\n"
14419                    "||||||| text by the vcs\n"
14420                    "  parameter2),\n"
14421                    "  parameter3,\n"
14422                    "======= text by the vcs\n"
14423                    "  parameter2,\n"
14424                    "  parameter3),\n"
14425                    ">>>>>>> text by the vcs\n"
14426                    "  otherparameter);\n"));
14427 
14428   // Perforce markers.
14429   EXPECT_EQ("void f() {\n"
14430             "  function(\n"
14431             ">>>> text by the vcs\n"
14432             "      parameter,\n"
14433             "==== text by the vcs\n"
14434             "      parameter,\n"
14435             "==== text by the vcs\n"
14436             "      parameter,\n"
14437             "<<<< text by the vcs\n"
14438             "      parameter);\n",
14439             format("void f() {\n"
14440                    "  function(\n"
14441                    ">>>> text by the vcs\n"
14442                    "  parameter,\n"
14443                    "==== text by the vcs\n"
14444                    "  parameter,\n"
14445                    "==== text by the vcs\n"
14446                    "  parameter,\n"
14447                    "<<<< text by the vcs\n"
14448                    "  parameter);\n"));
14449 
14450   EXPECT_EQ("<<<<<<<\n"
14451             "|||||||\n"
14452             "=======\n"
14453             ">>>>>>>",
14454             format("<<<<<<<\n"
14455                    "|||||||\n"
14456                    "=======\n"
14457                    ">>>>>>>"));
14458 
14459   EXPECT_EQ("<<<<<<<\n"
14460             "|||||||\n"
14461             "int i;\n"
14462             "=======\n"
14463             ">>>>>>>",
14464             format("<<<<<<<\n"
14465                    "|||||||\n"
14466                    "int i;\n"
14467                    "=======\n"
14468                    ">>>>>>>"));
14469 
14470   // FIXME: Handle parsing of macros around conflict markers correctly:
14471   EXPECT_EQ("#define Macro \\\n"
14472             "<<<<<<<\n"
14473             "Something \\\n"
14474             "|||||||\n"
14475             "Else \\\n"
14476             "=======\n"
14477             "Other \\\n"
14478             ">>>>>>>\n"
14479             "    End int i;\n",
14480             format("#define Macro \\\n"
14481                    "<<<<<<<\n"
14482                    "  Something \\\n"
14483                    "|||||||\n"
14484                    "  Else \\\n"
14485                    "=======\n"
14486                    "  Other \\\n"
14487                    ">>>>>>>\n"
14488                    "  End\n"
14489                    "int i;\n"));
14490 }
14491 
14492 TEST_F(FormatTest, DisableRegions) {
14493   EXPECT_EQ("int i;\n"
14494             "// clang-format off\n"
14495             "  int j;\n"
14496             "// clang-format on\n"
14497             "int k;",
14498             format(" int  i;\n"
14499                    "   // clang-format off\n"
14500                    "  int j;\n"
14501                    " // clang-format on\n"
14502                    "   int   k;"));
14503   EXPECT_EQ("int i;\n"
14504             "/* clang-format off */\n"
14505             "  int j;\n"
14506             "/* clang-format on */\n"
14507             "int k;",
14508             format(" int  i;\n"
14509                    "   /* clang-format off */\n"
14510                    "  int j;\n"
14511                    " /* clang-format on */\n"
14512                    "   int   k;"));
14513 
14514   // Don't reflow comments within disabled regions.
14515   EXPECT_EQ("// clang-format off\n"
14516             "// long long long long long long line\n"
14517             "/* clang-format on */\n"
14518             "/* long long long\n"
14519             " * long long long\n"
14520             " * line */\n"
14521             "int i;\n"
14522             "/* clang-format off */\n"
14523             "/* long long long long long long line */\n",
14524             format("// clang-format off\n"
14525                    "// long long long long long long line\n"
14526                    "/* clang-format on */\n"
14527                    "/* long long long long long long line */\n"
14528                    "int i;\n"
14529                    "/* clang-format off */\n"
14530                    "/* long long long long long long line */\n",
14531                    getLLVMStyleWithColumns(20)));
14532 }
14533 
14534 TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
14535   format("? ) =");
14536   verifyNoCrash("#define a\\\n /**/}");
14537 }
14538 
14539 TEST_F(FormatTest, FormatsTableGenCode) {
14540   FormatStyle Style = getLLVMStyle();
14541   Style.Language = FormatStyle::LK_TableGen;
14542   verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
14543 }
14544 
14545 TEST_F(FormatTest, ArrayOfTemplates) {
14546   EXPECT_EQ("auto a = new unique_ptr<int>[10];",
14547             format("auto a = new unique_ptr<int > [ 10];"));
14548 
14549   FormatStyle Spaces = getLLVMStyle();
14550   Spaces.SpacesInSquareBrackets = true;
14551   EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
14552             format("auto a = new unique_ptr<int > [10];", Spaces));
14553 }
14554 
14555 TEST_F(FormatTest, ArrayAsTemplateType) {
14556   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
14557             format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
14558 
14559   FormatStyle Spaces = getLLVMStyle();
14560   Spaces.SpacesInSquareBrackets = true;
14561   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
14562             format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
14563 }
14564 
14565 TEST_F(FormatTest, NoSpaceAfterSuper) { verifyFormat("__super::FooBar();"); }
14566 
14567 TEST(FormatStyle, GetStyleWithEmptyFileName) {
14568   llvm::vfs::InMemoryFileSystem FS;
14569   auto Style1 = getStyle("file", "", "Google", "", &FS);
14570   ASSERT_TRUE((bool)Style1);
14571   ASSERT_EQ(*Style1, getGoogleStyle());
14572 }
14573 
14574 TEST(FormatStyle, GetStyleOfFile) {
14575   llvm::vfs::InMemoryFileSystem FS;
14576   // Test 1: format file in the same directory.
14577   ASSERT_TRUE(
14578       FS.addFile("/a/.clang-format", 0,
14579                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
14580   ASSERT_TRUE(
14581       FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
14582   auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
14583   ASSERT_TRUE((bool)Style1);
14584   ASSERT_EQ(*Style1, getLLVMStyle());
14585 
14586   // Test 2.1: fallback to default.
14587   ASSERT_TRUE(
14588       FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
14589   auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
14590   ASSERT_TRUE((bool)Style2);
14591   ASSERT_EQ(*Style2, getMozillaStyle());
14592 
14593   // Test 2.2: no format on 'none' fallback style.
14594   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
14595   ASSERT_TRUE((bool)Style2);
14596   ASSERT_EQ(*Style2, getNoStyle());
14597 
14598   // Test 2.3: format if config is found with no based style while fallback is
14599   // 'none'.
14600   ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
14601                          llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
14602   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
14603   ASSERT_TRUE((bool)Style2);
14604   ASSERT_EQ(*Style2, getLLVMStyle());
14605 
14606   // Test 2.4: format if yaml with no based style, while fallback is 'none'.
14607   Style2 = getStyle("{}", "a.h", "none", "", &FS);
14608   ASSERT_TRUE((bool)Style2);
14609   ASSERT_EQ(*Style2, getLLVMStyle());
14610 
14611   // Test 3: format file in parent directory.
14612   ASSERT_TRUE(
14613       FS.addFile("/c/.clang-format", 0,
14614                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
14615   ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
14616                          llvm::MemoryBuffer::getMemBuffer("int i;")));
14617   auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
14618   ASSERT_TRUE((bool)Style3);
14619   ASSERT_EQ(*Style3, getGoogleStyle());
14620 
14621   // Test 4: error on invalid fallback style
14622   auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
14623   ASSERT_FALSE((bool)Style4);
14624   llvm::consumeError(Style4.takeError());
14625 
14626   // Test 5: error on invalid yaml on command line
14627   auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
14628   ASSERT_FALSE((bool)Style5);
14629   llvm::consumeError(Style5.takeError());
14630 
14631   // Test 6: error on invalid style
14632   auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
14633   ASSERT_FALSE((bool)Style6);
14634   llvm::consumeError(Style6.takeError());
14635 
14636   // Test 7: found config file, error on parsing it
14637   ASSERT_TRUE(
14638       FS.addFile("/d/.clang-format", 0,
14639                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
14640                                                   "InvalidKey: InvalidValue")));
14641   ASSERT_TRUE(
14642       FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
14643   auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
14644   ASSERT_FALSE((bool)Style7);
14645   llvm::consumeError(Style7.takeError());
14646 
14647   // Test 8: inferred per-language defaults apply.
14648   auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS);
14649   ASSERT_TRUE((bool)StyleTd);
14650   ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen));
14651 }
14652 
14653 TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
14654   // Column limit is 20.
14655   std::string Code = "Type *a =\n"
14656                      "    new Type();\n"
14657                      "g(iiiii, 0, jjjjj,\n"
14658                      "  0, kkkkk, 0, mm);\n"
14659                      "int  bad     = format   ;";
14660   std::string Expected = "auto a = new Type();\n"
14661                          "g(iiiii, nullptr,\n"
14662                          "  jjjjj, nullptr,\n"
14663                          "  kkkkk, nullptr,\n"
14664                          "  mm);\n"
14665                          "int  bad     = format   ;";
14666   FileID ID = Context.createInMemoryFile("format.cpp", Code);
14667   tooling::Replacements Replaces = toReplacements(
14668       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
14669                             "auto "),
14670        tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
14671                             "nullptr"),
14672        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
14673                             "nullptr"),
14674        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
14675                             "nullptr")});
14676 
14677   format::FormatStyle Style = format::getLLVMStyle();
14678   Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
14679   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
14680   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
14681       << llvm::toString(FormattedReplaces.takeError()) << "\n";
14682   auto Result = applyAllReplacements(Code, *FormattedReplaces);
14683   EXPECT_TRUE(static_cast<bool>(Result));
14684   EXPECT_EQ(Expected, *Result);
14685 }
14686 
14687 TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
14688   std::string Code = "#include \"a.h\"\n"
14689                      "#include \"c.h\"\n"
14690                      "\n"
14691                      "int main() {\n"
14692                      "  return 0;\n"
14693                      "}";
14694   std::string Expected = "#include \"a.h\"\n"
14695                          "#include \"b.h\"\n"
14696                          "#include \"c.h\"\n"
14697                          "\n"
14698                          "int main() {\n"
14699                          "  return 0;\n"
14700                          "}";
14701   FileID ID = Context.createInMemoryFile("fix.cpp", Code);
14702   tooling::Replacements Replaces = toReplacements(
14703       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
14704                             "#include \"b.h\"\n")});
14705 
14706   format::FormatStyle Style = format::getLLVMStyle();
14707   Style.SortIncludes = true;
14708   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
14709   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
14710       << llvm::toString(FormattedReplaces.takeError()) << "\n";
14711   auto Result = applyAllReplacements(Code, *FormattedReplaces);
14712   EXPECT_TRUE(static_cast<bool>(Result));
14713   EXPECT_EQ(Expected, *Result);
14714 }
14715 
14716 TEST_F(FormatTest, FormatSortsUsingDeclarations) {
14717   EXPECT_EQ("using std::cin;\n"
14718             "using std::cout;",
14719             format("using std::cout;\n"
14720                    "using std::cin;",
14721                    getGoogleStyle()));
14722 }
14723 
14724 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
14725   format::FormatStyle Style = format::getLLVMStyle();
14726   Style.Standard = FormatStyle::LS_Cpp03;
14727   // cpp03 recognize this string as identifier u8 and literal character 'a'
14728   EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
14729 }
14730 
14731 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
14732   // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
14733   // all modes, including C++11, C++14 and C++17
14734   EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
14735 }
14736 
14737 TEST_F(FormatTest, DoNotFormatLikelyXml) {
14738   EXPECT_EQ("<!-- ;> -->", format("<!-- ;> -->", getGoogleStyle()));
14739   EXPECT_EQ(" <!-- >; -->", format(" <!-- >; -->", getGoogleStyle()));
14740 }
14741 
14742 TEST_F(FormatTest, StructuredBindings) {
14743   // Structured bindings is a C++17 feature.
14744   // all modes, including C++11, C++14 and C++17
14745   verifyFormat("auto [a, b] = f();");
14746   EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
14747   EXPECT_EQ("const auto [a, b] = f();", format("const   auto[a, b] = f();"));
14748   EXPECT_EQ("auto const [a, b] = f();", format("auto  const[a, b] = f();"));
14749   EXPECT_EQ("auto const volatile [a, b] = f();",
14750             format("auto  const   volatile[a, b] = f();"));
14751   EXPECT_EQ("auto [a, b, c] = f();", format("auto   [  a  ,  b,c   ] = f();"));
14752   EXPECT_EQ("auto &[a, b, c] = f();",
14753             format("auto   &[  a  ,  b,c   ] = f();"));
14754   EXPECT_EQ("auto &&[a, b, c] = f();",
14755             format("auto   &&[  a  ,  b,c   ] = f();"));
14756   EXPECT_EQ("auto const &[a, b] = f();", format("auto  const&[a, b] = f();"));
14757   EXPECT_EQ("auto const volatile &&[a, b] = f();",
14758             format("auto  const  volatile  &&[a, b] = f();"));
14759   EXPECT_EQ("auto const &&[a, b] = f();",
14760             format("auto  const   &&  [a, b] = f();"));
14761   EXPECT_EQ("const auto &[a, b] = f();",
14762             format("const  auto  &  [a, b] = f();"));
14763   EXPECT_EQ("const auto volatile &&[a, b] = f();",
14764             format("const  auto   volatile  &&[a, b] = f();"));
14765   EXPECT_EQ("volatile const auto &&[a, b] = f();",
14766             format("volatile  const  auto   &&[a, b] = f();"));
14767   EXPECT_EQ("const auto &&[a, b] = f();",
14768             format("const  auto  &&  [a, b] = f();"));
14769 
14770   // Make sure we don't mistake structured bindings for lambdas.
14771   FormatStyle PointerMiddle = getLLVMStyle();
14772   PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
14773   verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
14774   verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
14775   verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
14776   verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
14777   verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
14778   verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
14779   verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
14780   verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
14781   verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
14782   verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
14783   verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
14784   verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
14785 
14786   EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
14787             format("for (const auto   &&   [a, b] : some_range) {\n}"));
14788   EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
14789             format("for (const auto   &   [a, b] : some_range) {\n}"));
14790   EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
14791             format("for (const auto[a, b] : some_range) {\n}"));
14792   EXPECT_EQ("auto [x, y](expr);", format("auto[x,y]  (expr);"));
14793   EXPECT_EQ("auto &[x, y](expr);", format("auto  &  [x,y]  (expr);"));
14794   EXPECT_EQ("auto &&[x, y](expr);", format("auto  &&  [x,y]  (expr);"));
14795   EXPECT_EQ("auto const &[x, y](expr);",
14796             format("auto  const  &  [x,y]  (expr);"));
14797   EXPECT_EQ("auto const &&[x, y](expr);",
14798             format("auto  const  &&  [x,y]  (expr);"));
14799   EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y]     {expr};"));
14800   EXPECT_EQ("auto const &[x, y]{expr};",
14801             format("auto  const  &  [x,y]  {expr};"));
14802   EXPECT_EQ("auto const &&[x, y]{expr};",
14803             format("auto  const  &&  [x,y]  {expr};"));
14804 
14805   format::FormatStyle Spaces = format::getLLVMStyle();
14806   Spaces.SpacesInSquareBrackets = true;
14807   verifyFormat("auto [ a, b ] = f();", Spaces);
14808   verifyFormat("auto &&[ a, b ] = f();", Spaces);
14809   verifyFormat("auto &[ a, b ] = f();", Spaces);
14810   verifyFormat("auto const &&[ a, b ] = f();", Spaces);
14811   verifyFormat("auto const &[ a, b ] = f();", Spaces);
14812 }
14813 
14814 TEST_F(FormatTest, FileAndCode) {
14815   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", ""));
14816   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", ""));
14817   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", ""));
14818   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", ""));
14819   EXPECT_EQ(FormatStyle::LK_ObjC,
14820             guessLanguage("foo.h", "@interface Foo\n@end\n"));
14821   EXPECT_EQ(
14822       FormatStyle::LK_ObjC,
14823       guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }"));
14824   EXPECT_EQ(FormatStyle::LK_ObjC,
14825             guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))"));
14826   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;"));
14827   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", ""));
14828   EXPECT_EQ(FormatStyle::LK_ObjC,
14829             guessLanguage("foo", "@interface Foo\n@end\n"));
14830   EXPECT_EQ(FormatStyle::LK_ObjC,
14831             guessLanguage("foo.h", "int DoStuff(CGRect rect);\n"));
14832   EXPECT_EQ(
14833       FormatStyle::LK_ObjC,
14834       guessLanguage("foo.h",
14835                     "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n"));
14836   EXPECT_EQ(
14837       FormatStyle::LK_Cpp,
14838       guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;"));
14839 }
14840 
14841 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) {
14842   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];"));
14843   EXPECT_EQ(FormatStyle::LK_ObjC,
14844             guessLanguage("foo.h", "array[[calculator getIndex]];"));
14845   EXPECT_EQ(FormatStyle::LK_Cpp,
14846             guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];"));
14847   EXPECT_EQ(
14848       FormatStyle::LK_Cpp,
14849       guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];"));
14850   EXPECT_EQ(FormatStyle::LK_ObjC,
14851             guessLanguage("foo.h", "[[noreturn foo] bar];"));
14852   EXPECT_EQ(FormatStyle::LK_Cpp,
14853             guessLanguage("foo.h", "[[clang::fallthrough]];"));
14854   EXPECT_EQ(FormatStyle::LK_ObjC,
14855             guessLanguage("foo.h", "[[clang:fallthrough] foo];"));
14856   EXPECT_EQ(FormatStyle::LK_Cpp,
14857             guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];"));
14858   EXPECT_EQ(FormatStyle::LK_Cpp,
14859             guessLanguage("foo.h", "[[using clang: fallthrough]];"));
14860   EXPECT_EQ(FormatStyle::LK_ObjC,
14861             guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];"));
14862   EXPECT_EQ(FormatStyle::LK_Cpp,
14863             guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];"));
14864   EXPECT_EQ(
14865       FormatStyle::LK_Cpp,
14866       guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)"));
14867   EXPECT_EQ(
14868       FormatStyle::LK_Cpp,
14869       guessLanguage("foo.h",
14870                     "[[clang::callable_when(\"unconsumed\", \"unknown\")]]"));
14871   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]"));
14872 }
14873 
14874 TEST_F(FormatTest, GuessLanguageWithCaret) {
14875   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);"));
14876   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);"));
14877   EXPECT_EQ(FormatStyle::LK_ObjC,
14878             guessLanguage("foo.h", "int(^)(char, float);"));
14879   EXPECT_EQ(FormatStyle::LK_ObjC,
14880             guessLanguage("foo.h", "int(^foo)(char, float);"));
14881   EXPECT_EQ(FormatStyle::LK_ObjC,
14882             guessLanguage("foo.h", "int(^foo[10])(char, float);"));
14883   EXPECT_EQ(FormatStyle::LK_ObjC,
14884             guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);"));
14885   EXPECT_EQ(
14886       FormatStyle::LK_ObjC,
14887       guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);"));
14888 }
14889 
14890 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) {
14891   EXPECT_EQ(FormatStyle::LK_Cpp,
14892             guessLanguage("foo.h", "void f() {\n"
14893                                    "  asm (\"mov %[e], %[d]\"\n"
14894                                    "     : [d] \"=rm\" (d)\n"
14895                                    "       [e] \"rm\" (*e));\n"
14896                                    "}"));
14897   EXPECT_EQ(FormatStyle::LK_Cpp,
14898             guessLanguage("foo.h", "void f() {\n"
14899                                    "  _asm (\"mov %[e], %[d]\"\n"
14900                                    "     : [d] \"=rm\" (d)\n"
14901                                    "       [e] \"rm\" (*e));\n"
14902                                    "}"));
14903   EXPECT_EQ(FormatStyle::LK_Cpp,
14904             guessLanguage("foo.h", "void f() {\n"
14905                                    "  __asm (\"mov %[e], %[d]\"\n"
14906                                    "     : [d] \"=rm\" (d)\n"
14907                                    "       [e] \"rm\" (*e));\n"
14908                                    "}"));
14909   EXPECT_EQ(FormatStyle::LK_Cpp,
14910             guessLanguage("foo.h", "void f() {\n"
14911                                    "  __asm__ (\"mov %[e], %[d]\"\n"
14912                                    "     : [d] \"=rm\" (d)\n"
14913                                    "       [e] \"rm\" (*e));\n"
14914                                    "}"));
14915   EXPECT_EQ(FormatStyle::LK_Cpp,
14916             guessLanguage("foo.h", "void f() {\n"
14917                                    "  asm (\"mov %[e], %[d]\"\n"
14918                                    "     : [d] \"=rm\" (d),\n"
14919                                    "       [e] \"rm\" (*e));\n"
14920                                    "}"));
14921   EXPECT_EQ(FormatStyle::LK_Cpp,
14922             guessLanguage("foo.h", "void f() {\n"
14923                                    "  asm volatile (\"mov %[e], %[d]\"\n"
14924                                    "     : [d] \"=rm\" (d)\n"
14925                                    "       [e] \"rm\" (*e));\n"
14926                                    "}"));
14927 }
14928 
14929 TEST_F(FormatTest, GuessLanguageWithChildLines) {
14930   EXPECT_EQ(FormatStyle::LK_Cpp,
14931             guessLanguage("foo.h", "#define FOO ({ std::string s; })"));
14932   EXPECT_EQ(FormatStyle::LK_ObjC,
14933             guessLanguage("foo.h", "#define FOO ({ NSString *s; })"));
14934   EXPECT_EQ(
14935       FormatStyle::LK_Cpp,
14936       guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })"));
14937   EXPECT_EQ(
14938       FormatStyle::LK_ObjC,
14939       guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })"));
14940 }
14941 
14942 TEST_F(FormatTest, TypenameMacros) {
14943   std::vector<std::string> TypenameMacros = {"STACK_OF", "LIST", "TAILQ_ENTRY"};
14944 
14945   // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=30353
14946   FormatStyle Google = getGoogleStyleWithColumns(0);
14947   Google.TypenameMacros = TypenameMacros;
14948   verifyFormat("struct foo {\n"
14949                "  int bar;\n"
14950                "  TAILQ_ENTRY(a) bleh;\n"
14951                "};",
14952                Google);
14953 
14954   FormatStyle Macros = getLLVMStyle();
14955   Macros.TypenameMacros = TypenameMacros;
14956 
14957   verifyFormat("STACK_OF(int) a;", Macros);
14958   verifyFormat("STACK_OF(int) *a;", Macros);
14959   verifyFormat("STACK_OF(int const *) *a;", Macros);
14960   verifyFormat("STACK_OF(int *const) *a;", Macros);
14961   verifyFormat("STACK_OF(int, string) a;", Macros);
14962   verifyFormat("STACK_OF(LIST(int)) a;", Macros);
14963   verifyFormat("STACK_OF(LIST(int)) a, b;", Macros);
14964   verifyFormat("for (LIST(int) *a = NULL; a;) {\n}", Macros);
14965   verifyFormat("STACK_OF(int) f(LIST(int) *arg);", Macros);
14966 
14967   Macros.PointerAlignment = FormatStyle::PAS_Left;
14968   verifyFormat("STACK_OF(int)* a;", Macros);
14969   verifyFormat("STACK_OF(int*)* a;", Macros);
14970 }
14971 
14972 TEST_F(FormatTest, AmbersandInLamda) {
14973   // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=41899
14974   FormatStyle AlignStyle = getLLVMStyle();
14975   AlignStyle.PointerAlignment = FormatStyle::PAS_Left;
14976   verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle);
14977   AlignStyle.PointerAlignment = FormatStyle::PAS_Right;
14978   verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle);
14979 }
14980 
14981 TEST_F(FormatTest, SpacesInConditionalStatement) {
14982   FormatStyle Spaces = getLLVMStyle();
14983   Spaces.SpacesInConditionalStatement = true;
14984   verifyFormat("for ( int i = 0; i; i++ )\n  continue;", Spaces);
14985   verifyFormat("if ( !a )\n  return;", Spaces);
14986   verifyFormat("if ( a )\n  return;", Spaces);
14987   verifyFormat("if constexpr ( a )\n  return;", Spaces);
14988   verifyFormat("switch ( a )\ncase 1:\n  return;", Spaces);
14989   verifyFormat("while ( a )\n  return;", Spaces);
14990   verifyFormat("while ( (a && b) )\n  return;", Spaces);
14991   verifyFormat("do {\n} while ( 1 != 0 );", Spaces);
14992   verifyFormat("try {\n} catch ( const std::exception & ) {\n}", Spaces);
14993   // Check that space on the left of "::" is inserted as expected at beginning
14994   // of condition.
14995   verifyFormat("while ( ::func() )\n  return;", Spaces);
14996 }
14997 
14998 TEST_F(FormatTest, AlternativeOperators) {
14999   // Test case for ensuring alternate operators are not
15000   // combined with their right most neighbour.
15001   verifyFormat("int a and b;");
15002   verifyFormat("int a and_eq b;");
15003   verifyFormat("int a bitand b;");
15004   verifyFormat("int a bitor b;");
15005   verifyFormat("int a compl b;");
15006   verifyFormat("int a not b;");
15007   verifyFormat("int a not_eq b;");
15008   verifyFormat("int a or b;");
15009   verifyFormat("int a xor b;");
15010   verifyFormat("int a xor_eq b;");
15011   verifyFormat("return this not_eq bitand other;");
15012   verifyFormat("bool operator not_eq(const X bitand other)");
15013 
15014   verifyFormat("int a and 5;");
15015   verifyFormat("int a and_eq 5;");
15016   verifyFormat("int a bitand 5;");
15017   verifyFormat("int a bitor 5;");
15018   verifyFormat("int a compl 5;");
15019   verifyFormat("int a not 5;");
15020   verifyFormat("int a not_eq 5;");
15021   verifyFormat("int a or 5;");
15022   verifyFormat("int a xor 5;");
15023   verifyFormat("int a xor_eq 5;");
15024 
15025   verifyFormat("int a compl(5);");
15026   verifyFormat("int a not(5);");
15027 
15028   /* FIXME handle alternate tokens
15029    * https://en.cppreference.com/w/cpp/language/operator_alternative
15030   // alternative tokens
15031   verifyFormat("compl foo();");     //  ~foo();
15032   verifyFormat("foo() <%%>;");      // foo();
15033   verifyFormat("void foo() <%%>;"); // void foo(){}
15034   verifyFormat("int a <:1:>;");     // int a[1];[
15035   verifyFormat("%:define ABC abc"); // #define ABC abc
15036   verifyFormat("%:%:");             // ##
15037   */
15038 }
15039 
15040 TEST_F(FormatTest, STLWhileNotDefineChed) {
15041   verifyFormat("#if defined(while)\n"
15042                "#define while EMIT WARNING C4005\n"
15043                "#endif // while");
15044 }
15045 
15046 TEST_F(FormatTest, OperatorSpacing) {
15047   FormatStyle Style = getLLVMStyle();
15048   Style.PointerAlignment = FormatStyle::PAS_Right;
15049   verifyFormat("Foo::operator*();", Style);
15050   verifyFormat("Foo::operator void *();", Style);
15051   verifyFormat("Foo::operator()(void *);", Style);
15052   verifyFormat("Foo::operator*(void *);", Style);
15053   verifyFormat("Foo::operator*();", Style);
15054   verifyFormat("operator*(int (*)(), class Foo);", Style);
15055 
15056   verifyFormat("Foo::operator&();", Style);
15057   verifyFormat("Foo::operator void &();", Style);
15058   verifyFormat("Foo::operator()(void &);", Style);
15059   verifyFormat("Foo::operator&(void &);", Style);
15060   verifyFormat("Foo::operator&();", Style);
15061   verifyFormat("operator&(int (&)(), class Foo);", Style);
15062 
15063   verifyFormat("Foo::operator&&();", Style);
15064   verifyFormat("Foo::operator void &&();", Style);
15065   verifyFormat("Foo::operator()(void &&);", Style);
15066   verifyFormat("Foo::operator&&(void &&);", Style);
15067   verifyFormat("Foo::operator&&();", Style);
15068   verifyFormat("operator&&(int(&&)(), class Foo);", Style);
15069 
15070   Style.PointerAlignment = FormatStyle::PAS_Left;
15071   verifyFormat("Foo::operator*();", Style);
15072   verifyFormat("Foo::operator void*();", Style);
15073   verifyFormat("Foo::operator/*comment*/ void*();", Style);
15074   verifyFormat("Foo::operator/*a*/ const /*b*/ void*();", Style);
15075   verifyFormat("Foo::operator/*a*/ volatile /*b*/ void*();", Style);
15076   verifyFormat("Foo::operator()(void*);", Style);
15077   verifyFormat("Foo::operator*(void*);", Style);
15078   verifyFormat("Foo::operator*();", Style);
15079   verifyFormat("operator*(int (*)(), class Foo);", Style);
15080 
15081   verifyFormat("Foo::operator&();", Style);
15082   verifyFormat("Foo::operator void&();", Style);
15083   verifyFormat("Foo::operator/*comment*/ void&();", Style);
15084   verifyFormat("Foo::operator/*a*/ const /*b*/ void&();", Style);
15085   verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&();", Style);
15086   verifyFormat("Foo::operator()(void&);", Style);
15087   verifyFormat("Foo::operator&(void&);", Style);
15088   verifyFormat("Foo::operator&();", Style);
15089   verifyFormat("operator&(int (&)(), class Foo);", Style);
15090 
15091   verifyFormat("Foo::operator&&();", Style);
15092   verifyFormat("Foo::operator void&&();", Style);
15093   verifyFormat("Foo::operator/*comment*/ void&&();", Style);
15094   verifyFormat("Foo::operator/*a*/ const /*b*/ void&&();", Style);
15095   verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&&();", Style);
15096   verifyFormat("Foo::operator()(void&&);", Style);
15097   verifyFormat("Foo::operator&&(void&&);", Style);
15098   verifyFormat("Foo::operator&&();", Style);
15099   verifyFormat("operator&&(int(&&)(), class Foo);", Style);
15100 
15101   Style.PointerAlignment = FormatStyle::PAS_Middle;
15102   verifyFormat("Foo::operator*();", Style);
15103   verifyFormat("Foo::operator void *();", Style);
15104   verifyFormat("Foo::operator()(void *);", Style);
15105   verifyFormat("Foo::operator*(void *);", Style);
15106   verifyFormat("Foo::operator*();", Style);
15107   verifyFormat("operator*(int (*)(), class Foo);", Style);
15108 
15109   verifyFormat("Foo::operator&();", Style);
15110   verifyFormat("Foo::operator void &();", Style);
15111   verifyFormat("Foo::operator()(void &);", Style);
15112   verifyFormat("Foo::operator&(void &);", Style);
15113   verifyFormat("Foo::operator&();", Style);
15114   verifyFormat("operator&(int (&)(), class Foo);", Style);
15115 
15116   verifyFormat("Foo::operator&&();", Style);
15117   verifyFormat("Foo::operator void &&();", Style);
15118   verifyFormat("Foo::operator()(void &&);", Style);
15119   verifyFormat("Foo::operator&&(void &&);", Style);
15120   verifyFormat("Foo::operator&&();", Style);
15121   verifyFormat("operator&&(int(&&)(), class Foo);", Style);
15122 }
15123 
15124 } // namespace
15125 } // namespace format
15126 } // namespace clang
15127