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 
7411   verifyIndependentOfContext("a = *(x + y);");
7412   verifyIndependentOfContext("a = &(x + y);");
7413   verifyIndependentOfContext("*(x + y).call();");
7414   verifyIndependentOfContext("&(x + y)->call();");
7415   verifyFormat("void f() { &(*I).first; }");
7416 
7417   verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
7418   verifyFormat(
7419       "int *MyValues = {\n"
7420       "    *A, // Operator detection might be confused by the '{'\n"
7421       "    *BB // Operator detection might be confused by previous comment\n"
7422       "};");
7423 
7424   verifyIndependentOfContext("if (int *a = &b)");
7425   verifyIndependentOfContext("if (int &a = *b)");
7426   verifyIndependentOfContext("if (a & b[i])");
7427   verifyIndependentOfContext("if constexpr (a & b[i])");
7428   verifyIndependentOfContext("if CONSTEXPR (a & b[i])");
7429   verifyIndependentOfContext("if (a * (b * c))");
7430   verifyIndependentOfContext("if constexpr (a * (b * c))");
7431   verifyIndependentOfContext("if CONSTEXPR (a * (b * c))");
7432   verifyIndependentOfContext("if (a::b::c::d & b[i])");
7433   verifyIndependentOfContext("if (*b[i])");
7434   verifyIndependentOfContext("if (int *a = (&b))");
7435   verifyIndependentOfContext("while (int *a = &b)");
7436   verifyIndependentOfContext("while (a * (b * c))");
7437   verifyIndependentOfContext("size = sizeof *a;");
7438   verifyIndependentOfContext("if (a && (b = c))");
7439   verifyFormat("void f() {\n"
7440                "  for (const int &v : Values) {\n"
7441                "  }\n"
7442                "}");
7443   verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
7444   verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
7445   verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
7446 
7447   verifyFormat("#define A (!a * b)");
7448   verifyFormat("#define MACRO     \\\n"
7449                "  int *i = a * b; \\\n"
7450                "  void f(a *b);",
7451                getLLVMStyleWithColumns(19));
7452 
7453   verifyIndependentOfContext("A = new SomeType *[Length];");
7454   verifyIndependentOfContext("A = new SomeType *[Length]();");
7455   verifyIndependentOfContext("T **t = new T *;");
7456   verifyIndependentOfContext("T **t = new T *();");
7457   verifyGoogleFormat("A = new SomeType*[Length]();");
7458   verifyGoogleFormat("A = new SomeType*[Length];");
7459   verifyGoogleFormat("T** t = new T*;");
7460   verifyGoogleFormat("T** t = new T*();");
7461 
7462   verifyFormat("STATIC_ASSERT((a & b) == 0);");
7463   verifyFormat("STATIC_ASSERT(0 == (a & b));");
7464   verifyFormat("template <bool a, bool b> "
7465                "typename t::if<x && y>::type f() {}");
7466   verifyFormat("template <int *y> f() {}");
7467   verifyFormat("vector<int *> v;");
7468   verifyFormat("vector<int *const> v;");
7469   verifyFormat("vector<int *const **const *> v;");
7470   verifyFormat("vector<int *volatile> v;");
7471   verifyFormat("vector<a * b> v;");
7472   verifyFormat("foo<b && false>();");
7473   verifyFormat("foo<b & 1>();");
7474   verifyFormat("decltype(*::std::declval<const T &>()) void F();");
7475   verifyFormat(
7476       "template <class T, class = typename std::enable_if<\n"
7477       "                       std::is_integral<T>::value &&\n"
7478       "                       (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
7479       "void F();",
7480       getLLVMStyleWithColumns(70));
7481   verifyFormat("template <class T,\n"
7482                "          class = typename std::enable_if<\n"
7483                "              std::is_integral<T>::value &&\n"
7484                "              (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
7485                "          class U>\n"
7486                "void F();",
7487                getLLVMStyleWithColumns(70));
7488   verifyFormat(
7489       "template <class T,\n"
7490       "          class = typename ::std::enable_if<\n"
7491       "              ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
7492       "void F();",
7493       getGoogleStyleWithColumns(68));
7494 
7495   verifyIndependentOfContext("MACRO(int *i);");
7496   verifyIndependentOfContext("MACRO(auto *a);");
7497   verifyIndependentOfContext("MACRO(const A *a);");
7498   verifyIndependentOfContext("MACRO(A *const a);");
7499   verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
7500   verifyFormat("void f() { f(float{1}, a * a); }");
7501   // FIXME: Is there a way to make this work?
7502   // verifyIndependentOfContext("MACRO(A *a);");
7503 
7504   verifyFormat("DatumHandle const *operator->() const { return input_; }");
7505   verifyFormat("return options != nullptr && operator==(*options);");
7506 
7507   EXPECT_EQ("#define OP(x)                                    \\\n"
7508             "  ostream &operator<<(ostream &s, const A &a) {  \\\n"
7509             "    return s << a.DebugString();                 \\\n"
7510             "  }",
7511             format("#define OP(x) \\\n"
7512                    "  ostream &operator<<(ostream &s, const A &a) { \\\n"
7513                    "    return s << a.DebugString(); \\\n"
7514                    "  }",
7515                    getLLVMStyleWithColumns(50)));
7516 
7517   // FIXME: We cannot handle this case yet; we might be able to figure out that
7518   // foo<x> d > v; doesn't make sense.
7519   verifyFormat("foo<a<b && c> d> v;");
7520 
7521   FormatStyle PointerMiddle = getLLVMStyle();
7522   PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
7523   verifyFormat("delete *x;", PointerMiddle);
7524   verifyFormat("int * x;", PointerMiddle);
7525   verifyFormat("int *[] x;", PointerMiddle);
7526   verifyFormat("template <int * y> f() {}", PointerMiddle);
7527   verifyFormat("int * f(int * a) {}", PointerMiddle);
7528   verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
7529   verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
7530   verifyFormat("A<int *> a;", PointerMiddle);
7531   verifyFormat("A<int **> a;", PointerMiddle);
7532   verifyFormat("A<int *, int *> a;", PointerMiddle);
7533   verifyFormat("A<int *[]> a;", PointerMiddle);
7534   verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
7535   verifyFormat("A = new SomeType *[Length];", PointerMiddle);
7536   verifyFormat("T ** t = new T *;", PointerMiddle);
7537 
7538   // Member function reference qualifiers aren't binary operators.
7539   verifyFormat("string // break\n"
7540                "operator()() & {}");
7541   verifyFormat("string // break\n"
7542                "operator()() && {}");
7543   verifyGoogleFormat("template <typename T>\n"
7544                      "auto x() & -> int {}");
7545 }
7546 
7547 TEST_F(FormatTest, UnderstandsAttributes) {
7548   verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
7549   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
7550                "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
7551   FormatStyle AfterType = getLLVMStyle();
7552   AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
7553   verifyFormat("__attribute__((nodebug)) void\n"
7554                "foo() {}\n",
7555                AfterType);
7556 }
7557 
7558 TEST_F(FormatTest, UnderstandsSquareAttributes) {
7559   verifyFormat("SomeType s [[unused]] (InitValue);");
7560   verifyFormat("SomeType s [[gnu::unused]] (InitValue);");
7561   verifyFormat("SomeType s [[using gnu: unused]] (InitValue);");
7562   verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}");
7563   verifyFormat("void f() [[deprecated(\"so sorry\")]];");
7564   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7565                "    [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);");
7566 
7567   // Make sure we do not mistake attributes for array subscripts.
7568   verifyFormat("int a() {}\n"
7569                "[[unused]] int b() {}\n");
7570   verifyFormat("NSArray *arr;\n"
7571                "arr[[Foo() bar]];");
7572 
7573   // On the other hand, we still need to correctly find array subscripts.
7574   verifyFormat("int a = std::vector<int>{1, 2, 3}[0];");
7575 
7576   // Make sure that we do not mistake Objective-C method inside array literals
7577   // as attributes, even if those method names are also keywords.
7578   verifyFormat("@[ [foo bar] ];");
7579   verifyFormat("@[ [NSArray class] ];");
7580   verifyFormat("@[ [foo enum] ];");
7581 
7582   // Make sure we do not parse attributes as lambda introducers.
7583   FormatStyle MultiLineFunctions = getLLVMStyle();
7584   MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
7585   verifyFormat("[[unused]] int b() {\n"
7586                "  return 42;\n"
7587                "}\n",
7588                MultiLineFunctions);
7589 }
7590 
7591 TEST_F(FormatTest, UnderstandsEllipsis) {
7592   verifyFormat("int printf(const char *fmt, ...);");
7593   verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
7594   verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
7595 
7596   FormatStyle PointersLeft = getLLVMStyle();
7597   PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
7598   verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
7599 }
7600 
7601 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
7602   EXPECT_EQ("int *a;\n"
7603             "int *a;\n"
7604             "int *a;",
7605             format("int *a;\n"
7606                    "int* a;\n"
7607                    "int *a;",
7608                    getGoogleStyle()));
7609   EXPECT_EQ("int* a;\n"
7610             "int* a;\n"
7611             "int* a;",
7612             format("int* a;\n"
7613                    "int* a;\n"
7614                    "int *a;",
7615                    getGoogleStyle()));
7616   EXPECT_EQ("int *a;\n"
7617             "int *a;\n"
7618             "int *a;",
7619             format("int *a;\n"
7620                    "int * a;\n"
7621                    "int *  a;",
7622                    getGoogleStyle()));
7623   EXPECT_EQ("auto x = [] {\n"
7624             "  int *a;\n"
7625             "  int *a;\n"
7626             "  int *a;\n"
7627             "};",
7628             format("auto x=[]{int *a;\n"
7629                    "int * a;\n"
7630                    "int *  a;};",
7631                    getGoogleStyle()));
7632 }
7633 
7634 TEST_F(FormatTest, UnderstandsRvalueReferences) {
7635   verifyFormat("int f(int &&a) {}");
7636   verifyFormat("int f(int a, char &&b) {}");
7637   verifyFormat("void f() { int &&a = b; }");
7638   verifyGoogleFormat("int f(int a, char&& b) {}");
7639   verifyGoogleFormat("void f() { int&& a = b; }");
7640 
7641   verifyIndependentOfContext("A<int &&> a;");
7642   verifyIndependentOfContext("A<int &&, int &&> a;");
7643   verifyGoogleFormat("A<int&&> a;");
7644   verifyGoogleFormat("A<int&&, int&&> a;");
7645 
7646   // Not rvalue references:
7647   verifyFormat("template <bool B, bool C> class A {\n"
7648                "  static_assert(B && C, \"Something is wrong\");\n"
7649                "};");
7650   verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
7651   verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
7652   verifyFormat("#define A(a, b) (a && b)");
7653 }
7654 
7655 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
7656   verifyFormat("void f() {\n"
7657                "  x[aaaaaaaaa -\n"
7658                "    b] = 23;\n"
7659                "}",
7660                getLLVMStyleWithColumns(15));
7661 }
7662 
7663 TEST_F(FormatTest, FormatsCasts) {
7664   verifyFormat("Type *A = static_cast<Type *>(P);");
7665   verifyFormat("Type *A = (Type *)P;");
7666   verifyFormat("Type *A = (vector<Type *, int *>)P;");
7667   verifyFormat("int a = (int)(2.0f);");
7668   verifyFormat("int a = (int)2.0f;");
7669   verifyFormat("x[(int32)y];");
7670   verifyFormat("x = (int32)y;");
7671   verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
7672   verifyFormat("int a = (int)*b;");
7673   verifyFormat("int a = (int)2.0f;");
7674   verifyFormat("int a = (int)~0;");
7675   verifyFormat("int a = (int)++a;");
7676   verifyFormat("int a = (int)sizeof(int);");
7677   verifyFormat("int a = (int)+2;");
7678   verifyFormat("my_int a = (my_int)2.0f;");
7679   verifyFormat("my_int a = (my_int)sizeof(int);");
7680   verifyFormat("return (my_int)aaa;");
7681   verifyFormat("#define x ((int)-1)");
7682   verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
7683   verifyFormat("#define p(q) ((int *)&q)");
7684   verifyFormat("fn(a)(b) + 1;");
7685 
7686   verifyFormat("void f() { my_int a = (my_int)*b; }");
7687   verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
7688   verifyFormat("my_int a = (my_int)~0;");
7689   verifyFormat("my_int a = (my_int)++a;");
7690   verifyFormat("my_int a = (my_int)-2;");
7691   verifyFormat("my_int a = (my_int)1;");
7692   verifyFormat("my_int a = (my_int *)1;");
7693   verifyFormat("my_int a = (const my_int)-1;");
7694   verifyFormat("my_int a = (const my_int *)-1;");
7695   verifyFormat("my_int a = (my_int)(my_int)-1;");
7696   verifyFormat("my_int a = (ns::my_int)-2;");
7697   verifyFormat("case (my_int)ONE:");
7698   verifyFormat("auto x = (X)this;");
7699   // Casts in Obj-C style calls used to not be recognized as such.
7700   verifyFormat("int a = [(type*)[((type*)val) arg] arg];", getGoogleStyle());
7701 
7702   // FIXME: single value wrapped with paren will be treated as cast.
7703   verifyFormat("void f(int i = (kValue)*kMask) {}");
7704 
7705   verifyFormat("{ (void)F; }");
7706 
7707   // Don't break after a cast's
7708   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7709                "    (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
7710                "                                   bbbbbbbbbbbbbbbbbbbbbb);");
7711 
7712   // These are not casts.
7713   verifyFormat("void f(int *) {}");
7714   verifyFormat("f(foo)->b;");
7715   verifyFormat("f(foo).b;");
7716   verifyFormat("f(foo)(b);");
7717   verifyFormat("f(foo)[b];");
7718   verifyFormat("[](foo) { return 4; }(bar);");
7719   verifyFormat("(*funptr)(foo)[4];");
7720   verifyFormat("funptrs[4](foo)[4];");
7721   verifyFormat("void f(int *);");
7722   verifyFormat("void f(int *) = 0;");
7723   verifyFormat("void f(SmallVector<int>) {}");
7724   verifyFormat("void f(SmallVector<int>);");
7725   verifyFormat("void f(SmallVector<int>) = 0;");
7726   verifyFormat("void f(int i = (kA * kB) & kMask) {}");
7727   verifyFormat("int a = sizeof(int) * b;");
7728   verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
7729   verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
7730   verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
7731   verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
7732 
7733   // These are not casts, but at some point were confused with casts.
7734   verifyFormat("virtual void foo(int *) override;");
7735   verifyFormat("virtual void foo(char &) const;");
7736   verifyFormat("virtual void foo(int *a, char *) const;");
7737   verifyFormat("int a = sizeof(int *) + b;");
7738   verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
7739   verifyFormat("bool b = f(g<int>) && c;");
7740   verifyFormat("typedef void (*f)(int i) func;");
7741   verifyFormat("void operator++(int) noexcept;");
7742   verifyFormat("void operator++(int &) noexcept;");
7743   verifyFormat("void operator delete(void *, std::size_t, const std::nothrow_t "
7744                "&) noexcept;");
7745   verifyFormat(
7746       "void operator delete(std::size_t, const std::nothrow_t &) noexcept;");
7747   verifyFormat("void operator delete(const std::nothrow_t &) noexcept;");
7748   verifyFormat("void operator delete(std::nothrow_t &) noexcept;");
7749   verifyFormat("void operator delete(nothrow_t &) noexcept;");
7750   verifyFormat("void operator delete(foo &) noexcept;");
7751   verifyFormat("void operator delete(foo) noexcept;");
7752   verifyFormat("void operator delete(int) noexcept;");
7753   verifyFormat("void operator delete(int &) noexcept;");
7754   verifyFormat("void operator delete(int &) volatile noexcept;");
7755   verifyFormat("void operator delete(int &) const");
7756   verifyFormat("void operator delete(int &) = default");
7757   verifyFormat("void operator delete(int &) = delete");
7758   verifyFormat("void operator delete(int &) [[noreturn]]");
7759   verifyFormat("void operator delete(int &) throw();");
7760   verifyFormat("void operator delete(int &) throw(int);");
7761   verifyFormat("auto operator delete(int &) -> int;");
7762   verifyFormat("auto operator delete(int &) override");
7763   verifyFormat("auto operator delete(int &) final");
7764 
7765   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
7766                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
7767   // FIXME: The indentation here is not ideal.
7768   verifyFormat(
7769       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7770       "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
7771       "        [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
7772 }
7773 
7774 TEST_F(FormatTest, FormatsFunctionTypes) {
7775   verifyFormat("A<bool()> a;");
7776   verifyFormat("A<SomeType()> a;");
7777   verifyFormat("A<void (*)(int, std::string)> a;");
7778   verifyFormat("A<void *(int)>;");
7779   verifyFormat("void *(*a)(int *, SomeType *);");
7780   verifyFormat("int (*func)(void *);");
7781   verifyFormat("void f() { int (*func)(void *); }");
7782   verifyFormat("template <class CallbackClass>\n"
7783                "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
7784 
7785   verifyGoogleFormat("A<void*(int*, SomeType*)>;");
7786   verifyGoogleFormat("void* (*a)(int);");
7787   verifyGoogleFormat(
7788       "template <class CallbackClass>\n"
7789       "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
7790 
7791   // Other constructs can look somewhat like function types:
7792   verifyFormat("A<sizeof(*x)> a;");
7793   verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
7794   verifyFormat("some_var = function(*some_pointer_var)[0];");
7795   verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
7796   verifyFormat("int x = f(&h)();");
7797   verifyFormat("returnsFunction(&param1, &param2)(param);");
7798   verifyFormat("std::function<\n"
7799                "    LooooooooooongTemplatedType<\n"
7800                "        SomeType>*(\n"
7801                "        LooooooooooooooooongType type)>\n"
7802                "    function;",
7803                getGoogleStyleWithColumns(40));
7804 }
7805 
7806 TEST_F(FormatTest, FormatsPointersToArrayTypes) {
7807   verifyFormat("A (*foo_)[6];");
7808   verifyFormat("vector<int> (*foo_)[6];");
7809 }
7810 
7811 TEST_F(FormatTest, BreaksLongVariableDeclarations) {
7812   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7813                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
7814   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
7815                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
7816   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7817                "    *LoooooooooooooooooooooooooooooooooooooooongVariable;");
7818 
7819   // Different ways of ()-initializiation.
7820   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7821                "    LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
7822   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7823                "    LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
7824   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7825                "    LoooooooooooooooooooooooooooooooooooooooongVariable({});");
7826   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7827                "    LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
7828 
7829   // Lambdas should not confuse the variable declaration heuristic.
7830   verifyFormat("LooooooooooooooooongType\n"
7831                "    variable(nullptr, [](A *a) {});",
7832                getLLVMStyleWithColumns(40));
7833 }
7834 
7835 TEST_F(FormatTest, BreaksLongDeclarations) {
7836   verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
7837                "    AnotherNameForTheLongType;");
7838   verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
7839                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7840   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7841                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
7842   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
7843                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
7844   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7845                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7846   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
7847                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7848   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
7849                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7850   verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
7851                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7852   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7853                "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
7854   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7855                "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
7856   FormatStyle Indented = getLLVMStyle();
7857   Indented.IndentWrappedFunctionNames = true;
7858   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7859                "    LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
7860                Indented);
7861   verifyFormat(
7862       "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7863       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
7864       Indented);
7865   verifyFormat(
7866       "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
7867       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
7868       Indented);
7869   verifyFormat(
7870       "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
7871       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
7872       Indented);
7873 
7874   // FIXME: Without the comment, this breaks after "(".
7875   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType  // break\n"
7876                "    (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
7877                getGoogleStyle());
7878 
7879   verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
7880                "                  int LoooooooooooooooooooongParam2) {}");
7881   verifyFormat(
7882       "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
7883       "                                   SourceLocation L, IdentifierIn *II,\n"
7884       "                                   Type *T) {}");
7885   verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
7886                "ReallyReaaallyLongFunctionName(\n"
7887                "    const std::string &SomeParameter,\n"
7888                "    const SomeType<string, SomeOtherTemplateParameter>\n"
7889                "        &ReallyReallyLongParameterName,\n"
7890                "    const SomeType<string, SomeOtherTemplateParameter>\n"
7891                "        &AnotherLongParameterName) {}");
7892   verifyFormat("template <typename A>\n"
7893                "SomeLoooooooooooooooooooooongType<\n"
7894                "    typename some_namespace::SomeOtherType<A>::Type>\n"
7895                "Function() {}");
7896 
7897   verifyGoogleFormat(
7898       "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
7899       "    aaaaaaaaaaaaaaaaaaaaaaa;");
7900   verifyGoogleFormat(
7901       "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
7902       "                                   SourceLocation L) {}");
7903   verifyGoogleFormat(
7904       "some_namespace::LongReturnType\n"
7905       "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
7906       "    int first_long_parameter, int second_parameter) {}");
7907 
7908   verifyGoogleFormat("template <typename T>\n"
7909                      "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
7910                      "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
7911   verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7912                      "                   int aaaaaaaaaaaaaaaaaaaaaaa);");
7913 
7914   verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
7915                "    const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7916                "        *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7917   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7918                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
7919                "        aaaaaaaaaaaaaaaaaaaaaaaa);");
7920   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7921                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
7922                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
7923                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7924 
7925   verifyFormat("template <typename T> // Templates on own line.\n"
7926                "static int            // Some comment.\n"
7927                "MyFunction(int a);",
7928                getLLVMStyle());
7929 }
7930 
7931 TEST_F(FormatTest, FormatsArrays) {
7932   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
7933                "                         [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
7934   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
7935                "                         [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
7936   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
7937                "    aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
7938   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7939                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
7940   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7941                "    [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
7942   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7943                "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
7944                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
7945   verifyFormat(
7946       "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
7947       "             << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
7948       "                                  [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
7949   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
7950                "    .aaaaaaaaaaaaaaaaaaaaaa();");
7951 
7952   verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
7953                      "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
7954   verifyFormat(
7955       "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
7956       "                                  .aaaaaaa[0]\n"
7957       "                                  .aaaaaaaaaaaaaaaaaaaaaa();");
7958   verifyFormat("a[::b::c];");
7959 
7960   verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
7961 
7962   FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
7963   verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
7964 }
7965 
7966 TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
7967   verifyFormat("(a)->b();");
7968   verifyFormat("--a;");
7969 }
7970 
7971 TEST_F(FormatTest, HandlesIncludeDirectives) {
7972   verifyFormat("#include <string>\n"
7973                "#include <a/b/c.h>\n"
7974                "#include \"a/b/string\"\n"
7975                "#include \"string.h\"\n"
7976                "#include \"string.h\"\n"
7977                "#include <a-a>\n"
7978                "#include < path with space >\n"
7979                "#include_next <test.h>"
7980                "#include \"abc.h\" // this is included for ABC\n"
7981                "#include \"some long include\" // with a comment\n"
7982                "#include \"some very long include path\"\n"
7983                "#include <some/very/long/include/path>\n",
7984                getLLVMStyleWithColumns(35));
7985   EXPECT_EQ("#include \"a.h\"", format("#include  \"a.h\""));
7986   EXPECT_EQ("#include <a>", format("#include<a>"));
7987 
7988   verifyFormat("#import <string>");
7989   verifyFormat("#import <a/b/c.h>");
7990   verifyFormat("#import \"a/b/string\"");
7991   verifyFormat("#import \"string.h\"");
7992   verifyFormat("#import \"string.h\"");
7993   verifyFormat("#if __has_include(<strstream>)\n"
7994                "#include <strstream>\n"
7995                "#endif");
7996 
7997   verifyFormat("#define MY_IMPORT <a/b>");
7998 
7999   verifyFormat("#if __has_include(<a/b>)");
8000   verifyFormat("#if __has_include_next(<a/b>)");
8001   verifyFormat("#define F __has_include(<a/b>)");
8002   verifyFormat("#define F __has_include_next(<a/b>)");
8003 
8004   // Protocol buffer definition or missing "#".
8005   verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
8006                getLLVMStyleWithColumns(30));
8007 
8008   FormatStyle Style = getLLVMStyle();
8009   Style.AlwaysBreakBeforeMultilineStrings = true;
8010   Style.ColumnLimit = 0;
8011   verifyFormat("#import \"abc.h\"", Style);
8012 
8013   // But 'import' might also be a regular C++ namespace.
8014   verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8015                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
8016 }
8017 
8018 //===----------------------------------------------------------------------===//
8019 // Error recovery tests.
8020 //===----------------------------------------------------------------------===//
8021 
8022 TEST_F(FormatTest, IncompleteParameterLists) {
8023   FormatStyle NoBinPacking = getLLVMStyle();
8024   NoBinPacking.BinPackParameters = false;
8025   verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
8026                "                        double *min_x,\n"
8027                "                        double *max_x,\n"
8028                "                        double *min_y,\n"
8029                "                        double *max_y,\n"
8030                "                        double *min_z,\n"
8031                "                        double *max_z, ) {}",
8032                NoBinPacking);
8033 }
8034 
8035 TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
8036   verifyFormat("void f() { return; }\n42");
8037   verifyFormat("void f() {\n"
8038                "  if (0)\n"
8039                "    return;\n"
8040                "}\n"
8041                "42");
8042   verifyFormat("void f() { return }\n42");
8043   verifyFormat("void f() {\n"
8044                "  if (0)\n"
8045                "    return\n"
8046                "}\n"
8047                "42");
8048 }
8049 
8050 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
8051   EXPECT_EQ("void f() { return }", format("void  f ( )  {  return  }"));
8052   EXPECT_EQ("void f() {\n"
8053             "  if (a)\n"
8054             "    return\n"
8055             "}",
8056             format("void  f  (  )  {  if  ( a )  return  }"));
8057   EXPECT_EQ("namespace N {\n"
8058             "void f()\n"
8059             "}",
8060             format("namespace  N  {  void f()  }"));
8061   EXPECT_EQ("namespace N {\n"
8062             "void f() {}\n"
8063             "void g()\n"
8064             "} // namespace N",
8065             format("namespace N  { void f( ) { } void g( ) }"));
8066 }
8067 
8068 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
8069   verifyFormat("int aaaaaaaa =\n"
8070                "    // Overlylongcomment\n"
8071                "    b;",
8072                getLLVMStyleWithColumns(20));
8073   verifyFormat("function(\n"
8074                "    ShortArgument,\n"
8075                "    LoooooooooooongArgument);\n",
8076                getLLVMStyleWithColumns(20));
8077 }
8078 
8079 TEST_F(FormatTest, IncorrectAccessSpecifier) {
8080   verifyFormat("public:");
8081   verifyFormat("class A {\n"
8082                "public\n"
8083                "  void f() {}\n"
8084                "};");
8085   verifyFormat("public\n"
8086                "int qwerty;");
8087   verifyFormat("public\n"
8088                "B {}");
8089   verifyFormat("public\n"
8090                "{}");
8091   verifyFormat("public\n"
8092                "B { int x; }");
8093 }
8094 
8095 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
8096   verifyFormat("{");
8097   verifyFormat("#})");
8098   verifyNoCrash("(/**/[:!] ?[).");
8099 }
8100 
8101 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) {
8102   // Found by oss-fuzz:
8103   // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212
8104   FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
8105   Style.ColumnLimit = 60;
8106   verifyNoCrash(
8107       "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20"
8108       "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20"
8109       "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a",
8110       Style);
8111 }
8112 
8113 TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
8114   verifyFormat("do {\n}");
8115   verifyFormat("do {\n}\n"
8116                "f();");
8117   verifyFormat("do {\n}\n"
8118                "wheeee(fun);");
8119   verifyFormat("do {\n"
8120                "  f();\n"
8121                "}");
8122 }
8123 
8124 TEST_F(FormatTest, IncorrectCodeMissingParens) {
8125   verifyFormat("if {\n  foo;\n  foo();\n}");
8126   verifyFormat("switch {\n  foo;\n  foo();\n}");
8127   verifyIncompleteFormat("for {\n  foo;\n  foo();\n}");
8128   verifyFormat("while {\n  foo;\n  foo();\n}");
8129   verifyFormat("do {\n  foo;\n  foo();\n} while;");
8130 }
8131 
8132 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
8133   verifyIncompleteFormat("namespace {\n"
8134                          "class Foo { Foo (\n"
8135                          "};\n"
8136                          "} // namespace");
8137 }
8138 
8139 TEST_F(FormatTest, IncorrectCodeErrorDetection) {
8140   EXPECT_EQ("{\n  {}\n", format("{\n{\n}\n"));
8141   EXPECT_EQ("{\n  {}\n", format("{\n  {\n}\n"));
8142   EXPECT_EQ("{\n  {}\n", format("{\n  {\n  }\n"));
8143   EXPECT_EQ("{\n  {}\n}\n}\n", format("{\n  {\n    }\n  }\n}\n"));
8144 
8145   EXPECT_EQ("{\n"
8146             "  {\n"
8147             "    breakme(\n"
8148             "        qwe);\n"
8149             "  }\n",
8150             format("{\n"
8151                    "    {\n"
8152                    " breakme(qwe);\n"
8153                    "}\n",
8154                    getLLVMStyleWithColumns(10)));
8155 }
8156 
8157 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
8158   verifyFormat("int x = {\n"
8159                "    avariable,\n"
8160                "    b(alongervariable)};",
8161                getLLVMStyleWithColumns(25));
8162 }
8163 
8164 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
8165   verifyFormat("return (a)(b){1, 2, 3};");
8166 }
8167 
8168 TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
8169   verifyFormat("vector<int> x{1, 2, 3, 4};");
8170   verifyFormat("vector<int> x{\n"
8171                "    1,\n"
8172                "    2,\n"
8173                "    3,\n"
8174                "    4,\n"
8175                "};");
8176   verifyFormat("vector<T> x{{}, {}, {}, {}};");
8177   verifyFormat("f({1, 2});");
8178   verifyFormat("auto v = Foo{-1};");
8179   verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
8180   verifyFormat("Class::Class : member{1, 2, 3} {}");
8181   verifyFormat("new vector<int>{1, 2, 3};");
8182   verifyFormat("new int[3]{1, 2, 3};");
8183   verifyFormat("new int{1};");
8184   verifyFormat("return {arg1, arg2};");
8185   verifyFormat("return {arg1, SomeType{parameter}};");
8186   verifyFormat("int count = set<int>{f(), g(), h()}.size();");
8187   verifyFormat("new T{arg1, arg2};");
8188   verifyFormat("f(MyMap[{composite, key}]);");
8189   verifyFormat("class Class {\n"
8190                "  T member = {arg1, arg2};\n"
8191                "};");
8192   verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
8193   verifyFormat("const struct A a = {.a = 1, .b = 2};");
8194   verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
8195   verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
8196   verifyFormat("int a = std::is_integral<int>{} + 0;");
8197 
8198   verifyFormat("int foo(int i) { return fo1{}(i); }");
8199   verifyFormat("int foo(int i) { return fo1{}(i); }");
8200   verifyFormat("auto i = decltype(x){};");
8201   verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
8202   verifyFormat("Node n{1, Node{1000}, //\n"
8203                "       2};");
8204   verifyFormat("Aaaa aaaaaaa{\n"
8205                "    {\n"
8206                "        aaaa,\n"
8207                "    },\n"
8208                "};");
8209   verifyFormat("class C : public D {\n"
8210                "  SomeClass SC{2};\n"
8211                "};");
8212   verifyFormat("class C : public A {\n"
8213                "  class D : public B {\n"
8214                "    void f() { int i{2}; }\n"
8215                "  };\n"
8216                "};");
8217   verifyFormat("#define A {a, a},");
8218 
8219   // Avoid breaking between equal sign and opening brace
8220   FormatStyle AvoidBreakingFirstArgument = getLLVMStyle();
8221   AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200;
8222   verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n"
8223                "    {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n"
8224                "     {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n"
8225                "     {\"ccccccccccccccccccccc\", 2}};",
8226                AvoidBreakingFirstArgument);
8227 
8228   // Binpacking only if there is no trailing comma
8229   verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
8230                "                      cccccccccc, dddddddddd};",
8231                getLLVMStyleWithColumns(50));
8232   verifyFormat("const Aaaaaa aaaaa = {\n"
8233                "    aaaaaaaaaaa,\n"
8234                "    bbbbbbbbbbb,\n"
8235                "    ccccccccccc,\n"
8236                "    ddddddddddd,\n"
8237                "};",
8238                getLLVMStyleWithColumns(50));
8239 
8240   // Cases where distinguising braced lists and blocks is hard.
8241   verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
8242   verifyFormat("void f() {\n"
8243                "  return; // comment\n"
8244                "}\n"
8245                "SomeType t;");
8246   verifyFormat("void f() {\n"
8247                "  if (a) {\n"
8248                "    f();\n"
8249                "  }\n"
8250                "}\n"
8251                "SomeType t;");
8252 
8253   // In combination with BinPackArguments = false.
8254   FormatStyle NoBinPacking = getLLVMStyle();
8255   NoBinPacking.BinPackArguments = false;
8256   verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
8257                "                      bbbbb,\n"
8258                "                      ccccc,\n"
8259                "                      ddddd,\n"
8260                "                      eeeee,\n"
8261                "                      ffffff,\n"
8262                "                      ggggg,\n"
8263                "                      hhhhhh,\n"
8264                "                      iiiiii,\n"
8265                "                      jjjjjj,\n"
8266                "                      kkkkkk};",
8267                NoBinPacking);
8268   verifyFormat("const Aaaaaa aaaaa = {\n"
8269                "    aaaaa,\n"
8270                "    bbbbb,\n"
8271                "    ccccc,\n"
8272                "    ddddd,\n"
8273                "    eeeee,\n"
8274                "    ffffff,\n"
8275                "    ggggg,\n"
8276                "    hhhhhh,\n"
8277                "    iiiiii,\n"
8278                "    jjjjjj,\n"
8279                "    kkkkkk,\n"
8280                "};",
8281                NoBinPacking);
8282   verifyFormat(
8283       "const Aaaaaa aaaaa = {\n"
8284       "    aaaaa,  bbbbb,  ccccc,  ddddd,  eeeee,  ffffff, ggggg, hhhhhh,\n"
8285       "    iiiiii, jjjjjj, kkkkkk, aaaaa,  bbbbb,  ccccc,  ddddd, eeeee,\n"
8286       "    ffffff, ggggg,  hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
8287       "};",
8288       NoBinPacking);
8289 
8290   NoBinPacking.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8291   EXPECT_EQ("static uint8 CddDp83848Reg[] = {\n"
8292             "    CDDDP83848_BMCR_REGISTER,\n"
8293             "    CDDDP83848_BMSR_REGISTER,\n"
8294             "    CDDDP83848_RBR_REGISTER};",
8295             format("static uint8 CddDp83848Reg[] = {CDDDP83848_BMCR_REGISTER,\n"
8296                    "                                CDDDP83848_BMSR_REGISTER,\n"
8297                    "                                CDDDP83848_RBR_REGISTER};",
8298                    NoBinPacking));
8299 
8300   // FIXME: The alignment of these trailing comments might be bad. Then again,
8301   // this might be utterly useless in real code.
8302   verifyFormat("Constructor::Constructor()\n"
8303                "    : some_value{         //\n"
8304                "                 aaaaaaa, //\n"
8305                "                 bbbbbbb} {}");
8306 
8307   // In braced lists, the first comment is always assumed to belong to the
8308   // first element. Thus, it can be moved to the next or previous line as
8309   // appropriate.
8310   EXPECT_EQ("function({// First element:\n"
8311             "          1,\n"
8312             "          // Second element:\n"
8313             "          2});",
8314             format("function({\n"
8315                    "    // First element:\n"
8316                    "    1,\n"
8317                    "    // Second element:\n"
8318                    "    2});"));
8319   EXPECT_EQ("std::vector<int> MyNumbers{\n"
8320             "    // First element:\n"
8321             "    1,\n"
8322             "    // Second element:\n"
8323             "    2};",
8324             format("std::vector<int> MyNumbers{// First element:\n"
8325                    "                           1,\n"
8326                    "                           // Second element:\n"
8327                    "                           2};",
8328                    getLLVMStyleWithColumns(30)));
8329   // A trailing comma should still lead to an enforced line break and no
8330   // binpacking.
8331   EXPECT_EQ("vector<int> SomeVector = {\n"
8332             "    // aaa\n"
8333             "    1,\n"
8334             "    2,\n"
8335             "};",
8336             format("vector<int> SomeVector = { // aaa\n"
8337                    "    1, 2, };"));
8338 
8339   FormatStyle ExtraSpaces = getLLVMStyle();
8340   ExtraSpaces.Cpp11BracedListStyle = false;
8341   ExtraSpaces.ColumnLimit = 75;
8342   verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
8343   verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
8344   verifyFormat("f({ 1, 2 });", ExtraSpaces);
8345   verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
8346   verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
8347   verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
8348   verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
8349   verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
8350   verifyFormat("return { arg1, arg2 };", ExtraSpaces);
8351   verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
8352   verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
8353   verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
8354   verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
8355   verifyFormat("class Class {\n"
8356                "  T member = { arg1, arg2 };\n"
8357                "};",
8358                ExtraSpaces);
8359   verifyFormat(
8360       "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8361       "                                 aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
8362       "                  : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
8363       "                                 bbbbbbbbbbbbbbbbbbbb, bbbbb };",
8364       ExtraSpaces);
8365   verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
8366   verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
8367                ExtraSpaces);
8368   verifyFormat(
8369       "someFunction(OtherParam,\n"
8370       "             BracedList{ // comment 1 (Forcing interesting break)\n"
8371       "                         param1, param2,\n"
8372       "                         // comment 2\n"
8373       "                         param3, param4 });",
8374       ExtraSpaces);
8375   verifyFormat(
8376       "std::this_thread::sleep_for(\n"
8377       "    std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
8378       ExtraSpaces);
8379   verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
8380                "    aaaaaaa,\n"
8381                "    aaaaaaaaaa,\n"
8382                "    aaaaa,\n"
8383                "    aaaaaaaaaaaaaaa,\n"
8384                "    aaa,\n"
8385                "    aaaaaaaaaa,\n"
8386                "    a,\n"
8387                "    aaaaaaaaaaaaaaaaaaaaa,\n"
8388                "    aaaaaaaaaaaa,\n"
8389                "    aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
8390                "    aaaaaaa,\n"
8391                "    a};");
8392   verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
8393   verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
8394   verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
8395 
8396   // Avoid breaking between initializer/equal sign and opening brace
8397   ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200;
8398   verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n"
8399                "  { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
8400                "  { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
8401                "  { \"ccccccccccccccccccccc\", 2 }\n"
8402                "};",
8403                ExtraSpaces);
8404   verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n"
8405                "  { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
8406                "  { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
8407                "  { \"ccccccccccccccccccccc\", 2 }\n"
8408                "};",
8409                ExtraSpaces);
8410 
8411   FormatStyle SpaceBeforeBrace = getLLVMStyle();
8412   SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true;
8413   verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace);
8414   verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace);
8415 
8416   FormatStyle SpaceBetweenBraces = getLLVMStyle();
8417   SpaceBetweenBraces.SpacesInAngles = true;
8418   SpaceBetweenBraces.SpacesInParentheses = true;
8419   SpaceBetweenBraces.SpacesInSquareBrackets = true;
8420   verifyFormat("vector< int > x{ 1, 2, 3, 4 };", SpaceBetweenBraces);
8421   verifyFormat("f( {}, { {}, {} }, MyMap[ { k, v } ] );", SpaceBetweenBraces);
8422   verifyFormat("vector< int > x{ // comment 1\n"
8423                "                 1, 2, 3, 4 };",
8424                SpaceBetweenBraces);
8425   SpaceBetweenBraces.ColumnLimit = 20;
8426   EXPECT_EQ("vector< int > x{\n"
8427             "    1, 2, 3, 4 };",
8428             format("vector<int>x{1,2,3,4};", SpaceBetweenBraces));
8429   SpaceBetweenBraces.ColumnLimit = 24;
8430   EXPECT_EQ("vector< int > x{ 1, 2,\n"
8431             "                 3, 4 };",
8432             format("vector<int>x{1,2,3,4};", SpaceBetweenBraces));
8433   EXPECT_EQ("vector< int > x{\n"
8434             "    1,\n"
8435             "    2,\n"
8436             "    3,\n"
8437             "    4,\n"
8438             "};",
8439             format("vector<int>x{1,2,3,4,};", SpaceBetweenBraces));
8440   verifyFormat("vector< int > x{};", SpaceBetweenBraces);
8441   SpaceBetweenBraces.SpaceInEmptyParentheses = true;
8442   verifyFormat("vector< int > x{ };", SpaceBetweenBraces);
8443 }
8444 
8445 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
8446   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8447                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8448                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8449                "                 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};");
8452   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
8453                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8454                "                 1, 22, 333, 4444, 55555, //\n"
8455                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8456                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
8457   verifyFormat(
8458       "vector<int> x = {1,       22, 333, 4444, 55555, 666666, 7777777,\n"
8459       "                 1,       22, 333, 4444, 55555, 666666, 7777777,\n"
8460       "                 1,       22, 333, 4444, 55555, 666666, // comment\n"
8461       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
8462       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
8463       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
8464       "                 7777777};");
8465   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
8466                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
8467                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
8468   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
8469                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
8470                "    // Separating comment.\n"
8471                "    X86::R8, X86::R9, X86::R10, X86::R11, 0};");
8472   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
8473                "    // Leading comment\n"
8474                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
8475                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
8476   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
8477                "                 1, 1, 1, 1};",
8478                getLLVMStyleWithColumns(39));
8479   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
8480                "                 1, 1, 1, 1};",
8481                getLLVMStyleWithColumns(38));
8482   verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
8483                "    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
8484                getLLVMStyleWithColumns(43));
8485   verifyFormat(
8486       "static unsigned SomeValues[10][3] = {\n"
8487       "    {1, 4, 0},  {4, 9, 0},  {4, 5, 9},  {8, 5, 4}, {1, 8, 4},\n"
8488       "    {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
8489   verifyFormat("static auto fields = new vector<string>{\n"
8490                "    \"aaaaaaaaaaaaa\",\n"
8491                "    \"aaaaaaaaaaaaa\",\n"
8492                "    \"aaaaaaaaaaaa\",\n"
8493                "    \"aaaaaaaaaaaaaa\",\n"
8494                "    \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
8495                "    \"aaaaaaaaaaaa\",\n"
8496                "    \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
8497                "};");
8498   verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
8499   verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
8500                "                 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
8501                "                 3, cccccccccccccccccccccc};",
8502                getLLVMStyleWithColumns(60));
8503 
8504   // Trailing commas.
8505   verifyFormat("vector<int> x = {\n"
8506                "    1, 1, 1, 1, 1, 1, 1, 1,\n"
8507                "};",
8508                getLLVMStyleWithColumns(39));
8509   verifyFormat("vector<int> x = {\n"
8510                "    1, 1, 1, 1, 1, 1, 1, 1, //\n"
8511                "};",
8512                getLLVMStyleWithColumns(39));
8513   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
8514                "                 1, 1, 1, 1,\n"
8515                "                 /**/ /**/};",
8516                getLLVMStyleWithColumns(39));
8517 
8518   // Trailing comment in the first line.
8519   verifyFormat("vector<int> iiiiiiiiiiiiiii = {                      //\n"
8520                "    1111111111, 2222222222, 33333333333, 4444444444, //\n"
8521                "    111111111,  222222222,  3333333333,  444444444,  //\n"
8522                "    11111111,   22222222,   333333333,   44444444};");
8523   // Trailing comment in the last line.
8524   verifyFormat("int aaaaa[] = {\n"
8525                "    1, 2, 3, // comment\n"
8526                "    4, 5, 6  // comment\n"
8527                "};");
8528 
8529   // With nested lists, we should either format one item per line or all nested
8530   // lists one on line.
8531   // FIXME: For some nested lists, we can do better.
8532   verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
8533                "        {aaaaaaaaaaaaaaaaaaa},\n"
8534                "        {aaaaaaaaaaaaaaaaaaaaa},\n"
8535                "        {aaaaaaaaaaaaaaaaa}};",
8536                getLLVMStyleWithColumns(60));
8537   verifyFormat(
8538       "SomeStruct my_struct_array = {\n"
8539       "    {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
8540       "     aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
8541       "    {aaa, aaa},\n"
8542       "    {aaa, aaa},\n"
8543       "    {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
8544       "    {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
8545       "     aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
8546 
8547   // No column layout should be used here.
8548   verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
8549                "                   bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
8550 
8551   verifyNoCrash("a<,");
8552 
8553   // No braced initializer here.
8554   verifyFormat("void f() {\n"
8555                "  struct Dummy {};\n"
8556                "  f(v);\n"
8557                "}");
8558 
8559   // Long lists should be formatted in columns even if they are nested.
8560   verifyFormat(
8561       "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8562       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8563       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8564       "                          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});");
8567 
8568   // Allow "single-column" layout even if that violates the column limit. There
8569   // isn't going to be a better way.
8570   verifyFormat("std::vector<int> a = {\n"
8571                "    aaaaaaaa,\n"
8572                "    aaaaaaaa,\n"
8573                "    aaaaaaaa,\n"
8574                "    aaaaaaaa,\n"
8575                "    aaaaaaaaaa,\n"
8576                "    aaaaaaaa,\n"
8577                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
8578                getLLVMStyleWithColumns(30));
8579   verifyFormat("vector<int> aaaa = {\n"
8580                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8581                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8582                "    aaaaaa.aaaaaaa,\n"
8583                "    aaaaaa.aaaaaaa,\n"
8584                "    aaaaaa.aaaaaaa,\n"
8585                "    aaaaaa.aaaaaaa,\n"
8586                "};");
8587 
8588   // Don't create hanging lists.
8589   verifyFormat("someFunction(Param, {List1, List2,\n"
8590                "                     List3});",
8591                getLLVMStyleWithColumns(35));
8592   verifyFormat("someFunction(Param, Param,\n"
8593                "             {List1, List2,\n"
8594                "              List3});",
8595                getLLVMStyleWithColumns(35));
8596   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
8597                "                               aaaaaaaaaaaaaaaaaaaaaaa);");
8598 }
8599 
8600 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
8601   FormatStyle DoNotMerge = getLLVMStyle();
8602   DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
8603 
8604   verifyFormat("void f() { return 42; }");
8605   verifyFormat("void f() {\n"
8606                "  return 42;\n"
8607                "}",
8608                DoNotMerge);
8609   verifyFormat("void f() {\n"
8610                "  // Comment\n"
8611                "}");
8612   verifyFormat("{\n"
8613                "#error {\n"
8614                "  int a;\n"
8615                "}");
8616   verifyFormat("{\n"
8617                "  int a;\n"
8618                "#error {\n"
8619                "}");
8620   verifyFormat("void f() {} // comment");
8621   verifyFormat("void f() { int a; } // comment");
8622   verifyFormat("void f() {\n"
8623                "} // comment",
8624                DoNotMerge);
8625   verifyFormat("void f() {\n"
8626                "  int a;\n"
8627                "} // comment",
8628                DoNotMerge);
8629   verifyFormat("void f() {\n"
8630                "} // comment",
8631                getLLVMStyleWithColumns(15));
8632 
8633   verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
8634   verifyFormat("void f() {\n  return 42;\n}", getLLVMStyleWithColumns(22));
8635 
8636   verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
8637   verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
8638   verifyFormat("class C {\n"
8639                "  C()\n"
8640                "      : iiiiiiii(nullptr),\n"
8641                "        kkkkkkk(nullptr),\n"
8642                "        mmmmmmm(nullptr),\n"
8643                "        nnnnnnn(nullptr) {}\n"
8644                "};",
8645                getGoogleStyle());
8646 
8647   FormatStyle NoColumnLimit = getLLVMStyle();
8648   NoColumnLimit.ColumnLimit = 0;
8649   EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
8650   EXPECT_EQ("class C {\n"
8651             "  A() : b(0) {}\n"
8652             "};",
8653             format("class C{A():b(0){}};", NoColumnLimit));
8654   EXPECT_EQ("A()\n"
8655             "    : b(0) {\n"
8656             "}",
8657             format("A()\n:b(0)\n{\n}", NoColumnLimit));
8658 
8659   FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
8660   DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
8661       FormatStyle::SFS_None;
8662   EXPECT_EQ("A()\n"
8663             "    : b(0) {\n"
8664             "}",
8665             format("A():b(0){}", DoNotMergeNoColumnLimit));
8666   EXPECT_EQ("A()\n"
8667             "    : b(0) {\n"
8668             "}",
8669             format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
8670 
8671   verifyFormat("#define A          \\\n"
8672                "  void f() {       \\\n"
8673                "    int i;         \\\n"
8674                "  }",
8675                getLLVMStyleWithColumns(20));
8676   verifyFormat("#define A           \\\n"
8677                "  void f() { int i; }",
8678                getLLVMStyleWithColumns(21));
8679   verifyFormat("#define A            \\\n"
8680                "  void f() {         \\\n"
8681                "    int i;           \\\n"
8682                "  }                  \\\n"
8683                "  int j;",
8684                getLLVMStyleWithColumns(22));
8685   verifyFormat("#define A             \\\n"
8686                "  void f() { int i; } \\\n"
8687                "  int j;",
8688                getLLVMStyleWithColumns(23));
8689 }
8690 
8691 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
8692   FormatStyle MergeEmptyOnly = getLLVMStyle();
8693   MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
8694   verifyFormat("class C {\n"
8695                "  int f() {}\n"
8696                "};",
8697                MergeEmptyOnly);
8698   verifyFormat("class C {\n"
8699                "  int f() {\n"
8700                "    return 42;\n"
8701                "  }\n"
8702                "};",
8703                MergeEmptyOnly);
8704   verifyFormat("int f() {}", MergeEmptyOnly);
8705   verifyFormat("int f() {\n"
8706                "  return 42;\n"
8707                "}",
8708                MergeEmptyOnly);
8709 
8710   // Also verify behavior when BraceWrapping.AfterFunction = true
8711   MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
8712   MergeEmptyOnly.BraceWrapping.AfterFunction = true;
8713   verifyFormat("int f() {}", MergeEmptyOnly);
8714   verifyFormat("class C {\n"
8715                "  int f() {}\n"
8716                "};",
8717                MergeEmptyOnly);
8718 }
8719 
8720 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
8721   FormatStyle MergeInlineOnly = getLLVMStyle();
8722   MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
8723   verifyFormat("class C {\n"
8724                "  int f() { return 42; }\n"
8725                "};",
8726                MergeInlineOnly);
8727   verifyFormat("int f() {\n"
8728                "  return 42;\n"
8729                "}",
8730                MergeInlineOnly);
8731 
8732   // SFS_Inline implies SFS_Empty
8733   verifyFormat("class C {\n"
8734                "  int f() {}\n"
8735                "};",
8736                MergeInlineOnly);
8737   verifyFormat("int f() {}", MergeInlineOnly);
8738 
8739   // Also verify behavior when BraceWrapping.AfterFunction = true
8740   MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
8741   MergeInlineOnly.BraceWrapping.AfterFunction = true;
8742   verifyFormat("class C {\n"
8743                "  int f() { return 42; }\n"
8744                "};",
8745                MergeInlineOnly);
8746   verifyFormat("int f()\n"
8747                "{\n"
8748                "  return 42;\n"
8749                "}",
8750                MergeInlineOnly);
8751 
8752   // SFS_Inline implies SFS_Empty
8753   verifyFormat("int f() {}", MergeInlineOnly);
8754   verifyFormat("class C {\n"
8755                "  int f() {}\n"
8756                "};",
8757                MergeInlineOnly);
8758 }
8759 
8760 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
8761   FormatStyle MergeInlineOnly = getLLVMStyle();
8762   MergeInlineOnly.AllowShortFunctionsOnASingleLine =
8763       FormatStyle::SFS_InlineOnly;
8764   verifyFormat("class C {\n"
8765                "  int f() { return 42; }\n"
8766                "};",
8767                MergeInlineOnly);
8768   verifyFormat("int f() {\n"
8769                "  return 42;\n"
8770                "}",
8771                MergeInlineOnly);
8772 
8773   // SFS_InlineOnly does not imply SFS_Empty
8774   verifyFormat("class C {\n"
8775                "  int f() {}\n"
8776                "};",
8777                MergeInlineOnly);
8778   verifyFormat("int f() {\n"
8779                "}",
8780                MergeInlineOnly);
8781 
8782   // Also verify behavior when BraceWrapping.AfterFunction = true
8783   MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
8784   MergeInlineOnly.BraceWrapping.AfterFunction = true;
8785   verifyFormat("class C {\n"
8786                "  int f() { return 42; }\n"
8787                "};",
8788                MergeInlineOnly);
8789   verifyFormat("int f()\n"
8790                "{\n"
8791                "  return 42;\n"
8792                "}",
8793                MergeInlineOnly);
8794 
8795   // SFS_InlineOnly does not imply SFS_Empty
8796   verifyFormat("int f()\n"
8797                "{\n"
8798                "}",
8799                MergeInlineOnly);
8800   verifyFormat("class C {\n"
8801                "  int f() {}\n"
8802                "};",
8803                MergeInlineOnly);
8804 }
8805 
8806 TEST_F(FormatTest, SplitEmptyFunction) {
8807   FormatStyle Style = getLLVMStyle();
8808   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
8809   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8810   Style.BraceWrapping.AfterFunction = true;
8811   Style.BraceWrapping.SplitEmptyFunction = false;
8812   Style.ColumnLimit = 40;
8813 
8814   verifyFormat("int f()\n"
8815                "{}",
8816                Style);
8817   verifyFormat("int f()\n"
8818                "{\n"
8819                "  return 42;\n"
8820                "}",
8821                Style);
8822   verifyFormat("int f()\n"
8823                "{\n"
8824                "  // some comment\n"
8825                "}",
8826                Style);
8827 
8828   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
8829   verifyFormat("int f() {}", Style);
8830   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8831                "{}",
8832                Style);
8833   verifyFormat("int f()\n"
8834                "{\n"
8835                "  return 0;\n"
8836                "}",
8837                Style);
8838 
8839   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
8840   verifyFormat("class Foo {\n"
8841                "  int f() {}\n"
8842                "};\n",
8843                Style);
8844   verifyFormat("class Foo {\n"
8845                "  int f() { return 0; }\n"
8846                "};\n",
8847                Style);
8848   verifyFormat("class Foo {\n"
8849                "  int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8850                "  {}\n"
8851                "};\n",
8852                Style);
8853   verifyFormat("class Foo {\n"
8854                "  int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8855                "  {\n"
8856                "    return 0;\n"
8857                "  }\n"
8858                "};\n",
8859                Style);
8860 
8861   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
8862   verifyFormat("int f() {}", Style);
8863   verifyFormat("int f() { return 0; }", Style);
8864   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8865                "{}",
8866                Style);
8867   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8868                "{\n"
8869                "  return 0;\n"
8870                "}",
8871                Style);
8872 }
8873 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
8874   FormatStyle Style = getLLVMStyle();
8875   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
8876   verifyFormat("#ifdef A\n"
8877                "int f() {}\n"
8878                "#else\n"
8879                "int g() {}\n"
8880                "#endif",
8881                Style);
8882 }
8883 
8884 TEST_F(FormatTest, SplitEmptyClass) {
8885   FormatStyle Style = getLLVMStyle();
8886   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8887   Style.BraceWrapping.AfterClass = true;
8888   Style.BraceWrapping.SplitEmptyRecord = false;
8889 
8890   verifyFormat("class Foo\n"
8891                "{};",
8892                Style);
8893   verifyFormat("/* something */ class Foo\n"
8894                "{};",
8895                Style);
8896   verifyFormat("template <typename X> class Foo\n"
8897                "{};",
8898                Style);
8899   verifyFormat("class Foo\n"
8900                "{\n"
8901                "  Foo();\n"
8902                "};",
8903                Style);
8904   verifyFormat("typedef class Foo\n"
8905                "{\n"
8906                "} Foo_t;",
8907                Style);
8908 }
8909 
8910 TEST_F(FormatTest, SplitEmptyStruct) {
8911   FormatStyle Style = getLLVMStyle();
8912   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8913   Style.BraceWrapping.AfterStruct = true;
8914   Style.BraceWrapping.SplitEmptyRecord = false;
8915 
8916   verifyFormat("struct Foo\n"
8917                "{};",
8918                Style);
8919   verifyFormat("/* something */ struct Foo\n"
8920                "{};",
8921                Style);
8922   verifyFormat("template <typename X> struct Foo\n"
8923                "{};",
8924                Style);
8925   verifyFormat("struct Foo\n"
8926                "{\n"
8927                "  Foo();\n"
8928                "};",
8929                Style);
8930   verifyFormat("typedef struct Foo\n"
8931                "{\n"
8932                "} Foo_t;",
8933                Style);
8934   // typedef struct Bar {} Bar_t;
8935 }
8936 
8937 TEST_F(FormatTest, SplitEmptyUnion) {
8938   FormatStyle Style = getLLVMStyle();
8939   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8940   Style.BraceWrapping.AfterUnion = true;
8941   Style.BraceWrapping.SplitEmptyRecord = false;
8942 
8943   verifyFormat("union Foo\n"
8944                "{};",
8945                Style);
8946   verifyFormat("/* something */ union Foo\n"
8947                "{};",
8948                Style);
8949   verifyFormat("union Foo\n"
8950                "{\n"
8951                "  A,\n"
8952                "};",
8953                Style);
8954   verifyFormat("typedef union Foo\n"
8955                "{\n"
8956                "} Foo_t;",
8957                Style);
8958 }
8959 
8960 TEST_F(FormatTest, SplitEmptyNamespace) {
8961   FormatStyle Style = getLLVMStyle();
8962   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8963   Style.BraceWrapping.AfterNamespace = true;
8964   Style.BraceWrapping.SplitEmptyNamespace = false;
8965 
8966   verifyFormat("namespace Foo\n"
8967                "{};",
8968                Style);
8969   verifyFormat("/* something */ namespace Foo\n"
8970                "{};",
8971                Style);
8972   verifyFormat("inline namespace Foo\n"
8973                "{};",
8974                Style);
8975   verifyFormat("/* something */ inline namespace Foo\n"
8976                "{};",
8977                Style);
8978   verifyFormat("export namespace Foo\n"
8979                "{};",
8980                Style);
8981   verifyFormat("namespace Foo\n"
8982                "{\n"
8983                "void Bar();\n"
8984                "};",
8985                Style);
8986 }
8987 
8988 TEST_F(FormatTest, NeverMergeShortRecords) {
8989   FormatStyle Style = getLLVMStyle();
8990 
8991   verifyFormat("class Foo {\n"
8992                "  Foo();\n"
8993                "};",
8994                Style);
8995   verifyFormat("typedef class Foo {\n"
8996                "  Foo();\n"
8997                "} Foo_t;",
8998                Style);
8999   verifyFormat("struct Foo {\n"
9000                "  Foo();\n"
9001                "};",
9002                Style);
9003   verifyFormat("typedef struct Foo {\n"
9004                "  Foo();\n"
9005                "} Foo_t;",
9006                Style);
9007   verifyFormat("union Foo {\n"
9008                "  A,\n"
9009                "};",
9010                Style);
9011   verifyFormat("typedef union Foo {\n"
9012                "  A,\n"
9013                "} Foo_t;",
9014                Style);
9015   verifyFormat("namespace Foo {\n"
9016                "void Bar();\n"
9017                "};",
9018                Style);
9019 
9020   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9021   Style.BraceWrapping.AfterClass = true;
9022   Style.BraceWrapping.AfterStruct = true;
9023   Style.BraceWrapping.AfterUnion = true;
9024   Style.BraceWrapping.AfterNamespace = true;
9025   verifyFormat("class Foo\n"
9026                "{\n"
9027                "  Foo();\n"
9028                "};",
9029                Style);
9030   verifyFormat("typedef class Foo\n"
9031                "{\n"
9032                "  Foo();\n"
9033                "} Foo_t;",
9034                Style);
9035   verifyFormat("struct Foo\n"
9036                "{\n"
9037                "  Foo();\n"
9038                "};",
9039                Style);
9040   verifyFormat("typedef struct Foo\n"
9041                "{\n"
9042                "  Foo();\n"
9043                "} Foo_t;",
9044                Style);
9045   verifyFormat("union Foo\n"
9046                "{\n"
9047                "  A,\n"
9048                "};",
9049                Style);
9050   verifyFormat("typedef union Foo\n"
9051                "{\n"
9052                "  A,\n"
9053                "} Foo_t;",
9054                Style);
9055   verifyFormat("namespace Foo\n"
9056                "{\n"
9057                "void Bar();\n"
9058                "};",
9059                Style);
9060 }
9061 
9062 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
9063   // Elaborate type variable declarations.
9064   verifyFormat("struct foo a = {bar};\nint n;");
9065   verifyFormat("class foo a = {bar};\nint n;");
9066   verifyFormat("union foo a = {bar};\nint n;");
9067 
9068   // Elaborate types inside function definitions.
9069   verifyFormat("struct foo f() {}\nint n;");
9070   verifyFormat("class foo f() {}\nint n;");
9071   verifyFormat("union foo f() {}\nint n;");
9072 
9073   // Templates.
9074   verifyFormat("template <class X> void f() {}\nint n;");
9075   verifyFormat("template <struct X> void f() {}\nint n;");
9076   verifyFormat("template <union X> void f() {}\nint n;");
9077 
9078   // Actual definitions...
9079   verifyFormat("struct {\n} n;");
9080   verifyFormat(
9081       "template <template <class T, class Y>, class Z> class X {\n} n;");
9082   verifyFormat("union Z {\n  int n;\n} x;");
9083   verifyFormat("class MACRO Z {\n} n;");
9084   verifyFormat("class MACRO(X) Z {\n} n;");
9085   verifyFormat("class __attribute__(X) Z {\n} n;");
9086   verifyFormat("class __declspec(X) Z {\n} n;");
9087   verifyFormat("class A##B##C {\n} n;");
9088   verifyFormat("class alignas(16) Z {\n} n;");
9089   verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
9090   verifyFormat("class MACROA MACRO(X) Z {\n} n;");
9091 
9092   // Redefinition from nested context:
9093   verifyFormat("class A::B::C {\n} n;");
9094 
9095   // Template definitions.
9096   verifyFormat(
9097       "template <typename F>\n"
9098       "Matcher(const Matcher<F> &Other,\n"
9099       "        typename enable_if_c<is_base_of<F, T>::value &&\n"
9100       "                             !is_same<F, T>::value>::type * = 0)\n"
9101       "    : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
9102 
9103   // FIXME: This is still incorrectly handled at the formatter side.
9104   verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
9105   verifyFormat("int i = SomeFunction(a<b, a> b);");
9106 
9107   // FIXME:
9108   // This now gets parsed incorrectly as class definition.
9109   // verifyFormat("class A<int> f() {\n}\nint n;");
9110 
9111   // Elaborate types where incorrectly parsing the structural element would
9112   // break the indent.
9113   verifyFormat("if (true)\n"
9114                "  class X x;\n"
9115                "else\n"
9116                "  f();\n");
9117 
9118   // This is simply incomplete. Formatting is not important, but must not crash.
9119   verifyFormat("class A:");
9120 }
9121 
9122 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
9123   EXPECT_EQ("#error Leave     all         white!!!!! space* alone!\n",
9124             format("#error Leave     all         white!!!!! space* alone!\n"));
9125   EXPECT_EQ(
9126       "#warning Leave     all         white!!!!! space* alone!\n",
9127       format("#warning Leave     all         white!!!!! space* alone!\n"));
9128   EXPECT_EQ("#error 1", format("  #  error   1"));
9129   EXPECT_EQ("#warning 1", format("  #  warning 1"));
9130 }
9131 
9132 TEST_F(FormatTest, FormatHashIfExpressions) {
9133   verifyFormat("#if AAAA && BBBB");
9134   verifyFormat("#if (AAAA && BBBB)");
9135   verifyFormat("#elif (AAAA && BBBB)");
9136   // FIXME: Come up with a better indentation for #elif.
9137   verifyFormat(
9138       "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) &&  \\\n"
9139       "    defined(BBBBBBBB)\n"
9140       "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) &&  \\\n"
9141       "    defined(BBBBBBBB)\n"
9142       "#endif",
9143       getLLVMStyleWithColumns(65));
9144 }
9145 
9146 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
9147   FormatStyle AllowsMergedIf = getGoogleStyle();
9148   AllowsMergedIf.AllowShortIfStatementsOnASingleLine =
9149       FormatStyle::SIS_WithoutElse;
9150   verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
9151   verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
9152   verifyFormat("if (true)\n#error E\n  return 42;", AllowsMergedIf);
9153   EXPECT_EQ("if (true) return 42;",
9154             format("if (true)\nreturn 42;", AllowsMergedIf));
9155   FormatStyle ShortMergedIf = AllowsMergedIf;
9156   ShortMergedIf.ColumnLimit = 25;
9157   verifyFormat("#define A \\\n"
9158                "  if (true) return 42;",
9159                ShortMergedIf);
9160   verifyFormat("#define A \\\n"
9161                "  f();    \\\n"
9162                "  if (true)\n"
9163                "#define B",
9164                ShortMergedIf);
9165   verifyFormat("#define A \\\n"
9166                "  f();    \\\n"
9167                "  if (true)\n"
9168                "g();",
9169                ShortMergedIf);
9170   verifyFormat("{\n"
9171                "#ifdef A\n"
9172                "  // Comment\n"
9173                "  if (true) continue;\n"
9174                "#endif\n"
9175                "  // Comment\n"
9176                "  if (true) continue;\n"
9177                "}",
9178                ShortMergedIf);
9179   ShortMergedIf.ColumnLimit = 33;
9180   verifyFormat("#define A \\\n"
9181                "  if constexpr (true) return 42;",
9182                ShortMergedIf);
9183   verifyFormat("#define A \\\n"
9184                "  if CONSTEXPR (true) return 42;",
9185                ShortMergedIf);
9186   ShortMergedIf.ColumnLimit = 29;
9187   verifyFormat("#define A                   \\\n"
9188                "  if (aaaaaaaaaa) return 1; \\\n"
9189                "  return 2;",
9190                ShortMergedIf);
9191   ShortMergedIf.ColumnLimit = 28;
9192   verifyFormat("#define A         \\\n"
9193                "  if (aaaaaaaaaa) \\\n"
9194                "    return 1;     \\\n"
9195                "  return 2;",
9196                ShortMergedIf);
9197   verifyFormat("#define A                \\\n"
9198                "  if constexpr (aaaaaaa) \\\n"
9199                "    return 1;            \\\n"
9200                "  return 2;",
9201                ShortMergedIf);
9202   verifyFormat("#define A                \\\n"
9203                "  if CONSTEXPR (aaaaaaa) \\\n"
9204                "    return 1;            \\\n"
9205                "  return 2;",
9206                ShortMergedIf);
9207 }
9208 
9209 TEST_F(FormatTest, FormatStarDependingOnContext) {
9210   verifyFormat("void f(int *a);");
9211   verifyFormat("void f() { f(fint * b); }");
9212   verifyFormat("class A {\n  void f(int *a);\n};");
9213   verifyFormat("class A {\n  int *a;\n};");
9214   verifyFormat("namespace a {\n"
9215                "namespace b {\n"
9216                "class A {\n"
9217                "  void f() {}\n"
9218                "  int *a;\n"
9219                "};\n"
9220                "} // namespace b\n"
9221                "} // namespace a");
9222 }
9223 
9224 TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
9225   verifyFormat("while");
9226   verifyFormat("operator");
9227 }
9228 
9229 TEST_F(FormatTest, SkipsDeeplyNestedLines) {
9230   // This code would be painfully slow to format if we didn't skip it.
9231   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
9232                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
9233                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
9234                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
9235                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
9236                    "A(1, 1)\n"
9237                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
9238                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9239                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9240                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
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   // Deeply nested part is untouched, rest is formatted.
9248   EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
9249             format(std::string("int    i;\n") + Code + "int    j;\n",
9250                    getLLVMStyle(), SC_ExpectIncomplete));
9251 }
9252 
9253 //===----------------------------------------------------------------------===//
9254 // Objective-C tests.
9255 //===----------------------------------------------------------------------===//
9256 
9257 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
9258   verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
9259   EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
9260             format("-(NSUInteger)indexOfObject:(id)anObject;"));
9261   EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
9262   EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
9263   EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
9264             format("-(NSInteger)Method3:(id)anObject;"));
9265   EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
9266             format("-(NSInteger)Method4:(id)anObject;"));
9267   EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
9268             format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
9269   EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
9270             format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
9271   EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
9272             "forAllCells:(BOOL)flag;",
9273             format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
9274                    "forAllCells:(BOOL)flag;"));
9275 
9276   // Very long objectiveC method declaration.
9277   verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
9278                "    (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
9279   verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
9280                "                    inRange:(NSRange)range\n"
9281                "                   outRange:(NSRange)out_range\n"
9282                "                  outRange1:(NSRange)out_range1\n"
9283                "                  outRange2:(NSRange)out_range2\n"
9284                "                  outRange3:(NSRange)out_range3\n"
9285                "                  outRange4:(NSRange)out_range4\n"
9286                "                  outRange5:(NSRange)out_range5\n"
9287                "                  outRange6:(NSRange)out_range6\n"
9288                "                  outRange7:(NSRange)out_range7\n"
9289                "                  outRange8:(NSRange)out_range8\n"
9290                "                  outRange9:(NSRange)out_range9;");
9291 
9292   // When the function name has to be wrapped.
9293   FormatStyle Style = getLLVMStyle();
9294   // ObjC ignores IndentWrappedFunctionNames when wrapping methods
9295   // and always indents instead.
9296   Style.IndentWrappedFunctionNames = false;
9297   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
9298                "    veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
9299                "               anotherName:(NSString)bbbbbbbbbbbbbb {\n"
9300                "}",
9301                Style);
9302   Style.IndentWrappedFunctionNames = true;
9303   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
9304                "    veryLooooooooooongName:(NSString)cccccccccccccc\n"
9305                "               anotherName:(NSString)dddddddddddddd {\n"
9306                "}",
9307                Style);
9308 
9309   verifyFormat("- (int)sum:(vector<int>)numbers;");
9310   verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
9311   // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
9312   // protocol lists (but not for template classes):
9313   // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
9314 
9315   verifyFormat("- (int (*)())foo:(int (*)())f;");
9316   verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
9317 
9318   // If there's no return type (very rare in practice!), LLVM and Google style
9319   // agree.
9320   verifyFormat("- foo;");
9321   verifyFormat("- foo:(int)f;");
9322   verifyGoogleFormat("- foo:(int)foo;");
9323 }
9324 
9325 TEST_F(FormatTest, BreaksStringLiterals) {
9326   EXPECT_EQ("\"some text \"\n"
9327             "\"other\";",
9328             format("\"some text other\";", getLLVMStyleWithColumns(12)));
9329   EXPECT_EQ("\"some text \"\n"
9330             "\"other\";",
9331             format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
9332   EXPECT_EQ(
9333       "#define A  \\\n"
9334       "  \"some \"  \\\n"
9335       "  \"text \"  \\\n"
9336       "  \"other\";",
9337       format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
9338   EXPECT_EQ(
9339       "#define A  \\\n"
9340       "  \"so \"    \\\n"
9341       "  \"text \"  \\\n"
9342       "  \"other\";",
9343       format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
9344 
9345   EXPECT_EQ("\"some text\"",
9346             format("\"some text\"", getLLVMStyleWithColumns(1)));
9347   EXPECT_EQ("\"some text\"",
9348             format("\"some text\"", getLLVMStyleWithColumns(11)));
9349   EXPECT_EQ("\"some \"\n"
9350             "\"text\"",
9351             format("\"some text\"", getLLVMStyleWithColumns(10)));
9352   EXPECT_EQ("\"some \"\n"
9353             "\"text\"",
9354             format("\"some text\"", getLLVMStyleWithColumns(7)));
9355   EXPECT_EQ("\"some\"\n"
9356             "\" tex\"\n"
9357             "\"t\"",
9358             format("\"some text\"", getLLVMStyleWithColumns(6)));
9359   EXPECT_EQ("\"some\"\n"
9360             "\" tex\"\n"
9361             "\" and\"",
9362             format("\"some tex and\"", getLLVMStyleWithColumns(6)));
9363   EXPECT_EQ("\"some\"\n"
9364             "\"/tex\"\n"
9365             "\"/and\"",
9366             format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
9367 
9368   EXPECT_EQ("variable =\n"
9369             "    \"long string \"\n"
9370             "    \"literal\";",
9371             format("variable = \"long string literal\";",
9372                    getLLVMStyleWithColumns(20)));
9373 
9374   EXPECT_EQ("variable = f(\n"
9375             "    \"long string \"\n"
9376             "    \"literal\",\n"
9377             "    short,\n"
9378             "    loooooooooooooooooooong);",
9379             format("variable = f(\"long string literal\", short, "
9380                    "loooooooooooooooooooong);",
9381                    getLLVMStyleWithColumns(20)));
9382 
9383   EXPECT_EQ(
9384       "f(g(\"long string \"\n"
9385       "    \"literal\"),\n"
9386       "  b);",
9387       format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
9388   EXPECT_EQ("f(g(\"long string \"\n"
9389             "    \"literal\",\n"
9390             "    a),\n"
9391             "  b);",
9392             format("f(g(\"long string literal\", a), b);",
9393                    getLLVMStyleWithColumns(20)));
9394   EXPECT_EQ(
9395       "f(\"one two\".split(\n"
9396       "    variable));",
9397       format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
9398   EXPECT_EQ("f(\"one two three four five six \"\n"
9399             "  \"seven\".split(\n"
9400             "      really_looooong_variable));",
9401             format("f(\"one two three four five six seven\"."
9402                    "split(really_looooong_variable));",
9403                    getLLVMStyleWithColumns(33)));
9404 
9405   EXPECT_EQ("f(\"some \"\n"
9406             "  \"text\",\n"
9407             "  other);",
9408             format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
9409 
9410   // Only break as a last resort.
9411   verifyFormat(
9412       "aaaaaaaaaaaaaaaaaaaa(\n"
9413       "    aaaaaaaaaaaaaaaaaaaa,\n"
9414       "    aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
9415 
9416   EXPECT_EQ("\"splitmea\"\n"
9417             "\"trandomp\"\n"
9418             "\"oint\"",
9419             format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
9420 
9421   EXPECT_EQ("\"split/\"\n"
9422             "\"pathat/\"\n"
9423             "\"slashes\"",
9424             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
9425 
9426   EXPECT_EQ("\"split/\"\n"
9427             "\"pathat/\"\n"
9428             "\"slashes\"",
9429             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
9430   EXPECT_EQ("\"split at \"\n"
9431             "\"spaces/at/\"\n"
9432             "\"slashes.at.any$\"\n"
9433             "\"non-alphanumeric%\"\n"
9434             "\"1111111111characte\"\n"
9435             "\"rs\"",
9436             format("\"split at "
9437                    "spaces/at/"
9438                    "slashes.at."
9439                    "any$non-"
9440                    "alphanumeric%"
9441                    "1111111111characte"
9442                    "rs\"",
9443                    getLLVMStyleWithColumns(20)));
9444 
9445   // Verify that splitting the strings understands
9446   // Style::AlwaysBreakBeforeMultilineStrings.
9447   EXPECT_EQ("aaaaaaaaaaaa(\n"
9448             "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
9449             "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
9450             format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
9451                    "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
9452                    "aaaaaaaaaaaaaaaaaaaaaa\");",
9453                    getGoogleStyle()));
9454   EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
9455             "       \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
9456             format("return \"aaaaaaaaaaaaaaaaaaaaaa "
9457                    "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
9458                    "aaaaaaaaaaaaaaaaaaaaaa\";",
9459                    getGoogleStyle()));
9460   EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
9461             "                \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
9462             format("llvm::outs() << "
9463                    "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
9464                    "aaaaaaaaaaaaaaaaaaa\";"));
9465   EXPECT_EQ("ffff(\n"
9466             "    {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
9467             "     \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
9468             format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
9469                    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
9470                    getGoogleStyle()));
9471 
9472   FormatStyle Style = getLLVMStyleWithColumns(12);
9473   Style.BreakStringLiterals = false;
9474   EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
9475 
9476   FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
9477   AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
9478   EXPECT_EQ("#define A \\\n"
9479             "  \"some \" \\\n"
9480             "  \"text \" \\\n"
9481             "  \"other\";",
9482             format("#define A \"some text other\";", AlignLeft));
9483 }
9484 
9485 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) {
9486   EXPECT_EQ("C a = \"some more \"\n"
9487             "      \"text\";",
9488             format("C a = \"some more text\";", getLLVMStyleWithColumns(18)));
9489 }
9490 
9491 TEST_F(FormatTest, FullyRemoveEmptyLines) {
9492   FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
9493   NoEmptyLines.MaxEmptyLinesToKeep = 0;
9494   EXPECT_EQ("int i = a(b());",
9495             format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
9496 }
9497 
9498 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
9499   EXPECT_EQ(
9500       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9501       "(\n"
9502       "    \"x\t\");",
9503       format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9504              "aaaaaaa("
9505              "\"x\t\");"));
9506 }
9507 
9508 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
9509   EXPECT_EQ(
9510       "u8\"utf8 string \"\n"
9511       "u8\"literal\";",
9512       format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
9513   EXPECT_EQ(
9514       "u\"utf16 string \"\n"
9515       "u\"literal\";",
9516       format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
9517   EXPECT_EQ(
9518       "U\"utf32 string \"\n"
9519       "U\"literal\";",
9520       format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
9521   EXPECT_EQ("L\"wide string \"\n"
9522             "L\"literal\";",
9523             format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
9524   EXPECT_EQ("@\"NSString \"\n"
9525             "@\"literal\";",
9526             format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
9527   verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
9528 
9529   // This input makes clang-format try to split the incomplete unicode escape
9530   // sequence, which used to lead to a crasher.
9531   verifyNoCrash(
9532       "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
9533       getLLVMStyleWithColumns(60));
9534 }
9535 
9536 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
9537   FormatStyle Style = getGoogleStyleWithColumns(15);
9538   EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
9539   EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
9540   EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
9541   EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
9542   EXPECT_EQ("u8R\"x(raw literal)x\";",
9543             format("u8R\"x(raw literal)x\";", Style));
9544 }
9545 
9546 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
9547   FormatStyle Style = getLLVMStyleWithColumns(20);
9548   EXPECT_EQ(
9549       "_T(\"aaaaaaaaaaaaaa\")\n"
9550       "_T(\"aaaaaaaaaaaaaa\")\n"
9551       "_T(\"aaaaaaaaaaaa\")",
9552       format("  _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
9553   EXPECT_EQ("f(x,\n"
9554             "  _T(\"aaaaaaaaaaaa\")\n"
9555             "  _T(\"aaa\"),\n"
9556             "  z);",
9557             format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
9558 
9559   // FIXME: Handle embedded spaces in one iteration.
9560   //  EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
9561   //            "_T(\"aaaaaaaaaaaaa\")\n"
9562   //            "_T(\"aaaaaaaaaaaaa\")\n"
9563   //            "_T(\"a\")",
9564   //            format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
9565   //                   getLLVMStyleWithColumns(20)));
9566   EXPECT_EQ(
9567       "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
9568       format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
9569   EXPECT_EQ("f(\n"
9570             "#if !TEST\n"
9571             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
9572             "#endif\n"
9573             ");",
9574             format("f(\n"
9575                    "#if !TEST\n"
9576                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
9577                    "#endif\n"
9578                    ");"));
9579   EXPECT_EQ("f(\n"
9580             "\n"
9581             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
9582             format("f(\n"
9583                    "\n"
9584                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
9585 }
9586 
9587 TEST_F(FormatTest, BreaksStringLiteralOperands) {
9588   // In a function call with two operands, the second can be broken with no line
9589   // break before it.
9590   EXPECT_EQ(
9591       "func(a, \"long long \"\n"
9592       "        \"long long\");",
9593       format("func(a, \"long long long long\");", getLLVMStyleWithColumns(24)));
9594   // In a function call with three operands, the second must be broken with a
9595   // line break before it.
9596   EXPECT_EQ("func(a,\n"
9597             "     \"long long long \"\n"
9598             "     \"long\",\n"
9599             "     c);",
9600             format("func(a, \"long long long long\", c);",
9601                    getLLVMStyleWithColumns(24)));
9602   // In a function call with three operands, the third must be broken with a
9603   // line break before it.
9604   EXPECT_EQ("func(a, b,\n"
9605             "     \"long long long \"\n"
9606             "     \"long\");",
9607             format("func(a, b, \"long long long long\");",
9608                    getLLVMStyleWithColumns(24)));
9609   // In a function call with three operands, both the second and the third must
9610   // be broken with a line break before them.
9611   EXPECT_EQ("func(a,\n"
9612             "     \"long long long \"\n"
9613             "     \"long\",\n"
9614             "     \"long long long \"\n"
9615             "     \"long\");",
9616             format("func(a, \"long long long long\", \"long long long long\");",
9617                    getLLVMStyleWithColumns(24)));
9618   // In a chain of << with two operands, the second can be broken with no line
9619   // break before it.
9620   EXPECT_EQ("a << \"line line \"\n"
9621             "     \"line\";",
9622             format("a << \"line line line\";", getLLVMStyleWithColumns(20)));
9623   // In a chain of << with three operands, the second can be broken with no line
9624   // break before it.
9625   EXPECT_EQ(
9626       "abcde << \"line \"\n"
9627       "         \"line line\"\n"
9628       "      << c;",
9629       format("abcde << \"line line line\" << c;", getLLVMStyleWithColumns(20)));
9630   // In a chain of << with three operands, the third must be broken with a line
9631   // break before it.
9632   EXPECT_EQ(
9633       "a << b\n"
9634       "  << \"line line \"\n"
9635       "     \"line\";",
9636       format("a << b << \"line line line\";", getLLVMStyleWithColumns(20)));
9637   // In a chain of << with three operands, the second can be broken with no line
9638   // break before it and the third must be broken with a line break before it.
9639   EXPECT_EQ("abcd << \"line line \"\n"
9640             "        \"line\"\n"
9641             "     << \"line line \"\n"
9642             "        \"line\";",
9643             format("abcd << \"line line line\" << \"line line line\";",
9644                    getLLVMStyleWithColumns(20)));
9645   // In a chain of binary operators with two operands, the second can be broken
9646   // with no line break before it.
9647   EXPECT_EQ(
9648       "abcd + \"line line \"\n"
9649       "       \"line line\";",
9650       format("abcd + \"line line line line\";", getLLVMStyleWithColumns(20)));
9651   // In a chain of binary operators with three operands, the second must be
9652   // broken with a line break before it.
9653   EXPECT_EQ("abcd +\n"
9654             "    \"line line \"\n"
9655             "    \"line line\" +\n"
9656             "    e;",
9657             format("abcd + \"line line line line\" + e;",
9658                    getLLVMStyleWithColumns(20)));
9659   // In a function call with two operands, with AlignAfterOpenBracket enabled,
9660   // the first must be broken with a line break before it.
9661   FormatStyle Style = getLLVMStyleWithColumns(25);
9662   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
9663   EXPECT_EQ("someFunction(\n"
9664             "    \"long long long \"\n"
9665             "    \"long\",\n"
9666             "    a);",
9667             format("someFunction(\"long long long long\", a);", Style));
9668 }
9669 
9670 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
9671   EXPECT_EQ(
9672       "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
9673       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
9674       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
9675       format("aaaaaaaaaaa  =  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
9676              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
9677              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
9678 }
9679 
9680 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
9681   EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
9682             format("f(g(R\"x(raw literal)x\",   a), b);", getGoogleStyle()));
9683   EXPECT_EQ("fffffffffff(g(R\"x(\n"
9684             "multiline raw string literal xxxxxxxxxxxxxx\n"
9685             ")x\",\n"
9686             "              a),\n"
9687             "            b);",
9688             format("fffffffffff(g(R\"x(\n"
9689                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9690                    ")x\", a), b);",
9691                    getGoogleStyleWithColumns(20)));
9692   EXPECT_EQ("fffffffffff(\n"
9693             "    g(R\"x(qqq\n"
9694             "multiline raw string literal xxxxxxxxxxxxxx\n"
9695             ")x\",\n"
9696             "      a),\n"
9697             "    b);",
9698             format("fffffffffff(g(R\"x(qqq\n"
9699                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9700                    ")x\", a), b);",
9701                    getGoogleStyleWithColumns(20)));
9702 
9703   EXPECT_EQ("fffffffffff(R\"x(\n"
9704             "multiline raw string literal xxxxxxxxxxxxxx\n"
9705             ")x\");",
9706             format("fffffffffff(R\"x(\n"
9707                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9708                    ")x\");",
9709                    getGoogleStyleWithColumns(20)));
9710   EXPECT_EQ("fffffffffff(R\"x(\n"
9711             "multiline raw string literal xxxxxxxxxxxxxx\n"
9712             ")x\" + bbbbbb);",
9713             format("fffffffffff(R\"x(\n"
9714                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9715                    ")x\" +   bbbbbb);",
9716                    getGoogleStyleWithColumns(20)));
9717   EXPECT_EQ("fffffffffff(\n"
9718             "    R\"x(\n"
9719             "multiline raw string literal xxxxxxxxxxxxxx\n"
9720             ")x\" +\n"
9721             "    bbbbbb);",
9722             format("fffffffffff(\n"
9723                    " R\"x(\n"
9724                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9725                    ")x\" + bbbbbb);",
9726                    getGoogleStyleWithColumns(20)));
9727   EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);",
9728             format("fffffffffff(\n"
9729                    " R\"(single line raw string)\" + bbbbbb);"));
9730 }
9731 
9732 TEST_F(FormatTest, SkipsUnknownStringLiterals) {
9733   verifyFormat("string a = \"unterminated;");
9734   EXPECT_EQ("function(\"unterminated,\n"
9735             "         OtherParameter);",
9736             format("function(  \"unterminated,\n"
9737                    "    OtherParameter);"));
9738 }
9739 
9740 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
9741   FormatStyle Style = getLLVMStyle();
9742   Style.Standard = FormatStyle::LS_Cpp03;
9743   EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
9744             format("#define x(_a) printf(\"foo\"_a);", Style));
9745 }
9746 
9747 TEST_F(FormatTest, CppLexVersion) {
9748   FormatStyle Style = getLLVMStyle();
9749   // Formatting of x * y differs if x is a type.
9750   verifyFormat("void foo() { MACRO(a * b); }", Style);
9751   verifyFormat("void foo() { MACRO(int *b); }", Style);
9752 
9753   // LLVM style uses latest lexer.
9754   verifyFormat("void foo() { MACRO(char8_t *b); }", Style);
9755   Style.Standard = FormatStyle::LS_Cpp17;
9756   // But in c++17, char8_t isn't a keyword.
9757   verifyFormat("void foo() { MACRO(char8_t * b); }", Style);
9758 }
9759 
9760 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
9761 
9762 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
9763   EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
9764             "             \"ddeeefff\");",
9765             format("someFunction(\"aaabbbcccdddeeefff\");",
9766                    getLLVMStyleWithColumns(25)));
9767   EXPECT_EQ("someFunction1234567890(\n"
9768             "    \"aaabbbcccdddeeefff\");",
9769             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
9770                    getLLVMStyleWithColumns(26)));
9771   EXPECT_EQ("someFunction1234567890(\n"
9772             "    \"aaabbbcccdddeeeff\"\n"
9773             "    \"f\");",
9774             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
9775                    getLLVMStyleWithColumns(25)));
9776   EXPECT_EQ("someFunction1234567890(\n"
9777             "    \"aaabbbcccdddeeeff\"\n"
9778             "    \"f\");",
9779             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
9780                    getLLVMStyleWithColumns(24)));
9781   EXPECT_EQ("someFunction(\n"
9782             "    \"aaabbbcc ddde \"\n"
9783             "    \"efff\");",
9784             format("someFunction(\"aaabbbcc ddde efff\");",
9785                    getLLVMStyleWithColumns(25)));
9786   EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
9787             "             \"ddeeefff\");",
9788             format("someFunction(\"aaabbbccc ddeeefff\");",
9789                    getLLVMStyleWithColumns(25)));
9790   EXPECT_EQ("someFunction1234567890(\n"
9791             "    \"aaabb \"\n"
9792             "    \"cccdddeeefff\");",
9793             format("someFunction1234567890(\"aaabb cccdddeeefff\");",
9794                    getLLVMStyleWithColumns(25)));
9795   EXPECT_EQ("#define A          \\\n"
9796             "  string s =       \\\n"
9797             "      \"123456789\"  \\\n"
9798             "      \"0\";         \\\n"
9799             "  int i;",
9800             format("#define A string s = \"1234567890\"; int i;",
9801                    getLLVMStyleWithColumns(20)));
9802   EXPECT_EQ("someFunction(\n"
9803             "    \"aaabbbcc \"\n"
9804             "    \"dddeeefff\");",
9805             format("someFunction(\"aaabbbcc dddeeefff\");",
9806                    getLLVMStyleWithColumns(25)));
9807 }
9808 
9809 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
9810   EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
9811   EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
9812   EXPECT_EQ("\"test\"\n"
9813             "\"\\n\"",
9814             format("\"test\\n\"", getLLVMStyleWithColumns(7)));
9815   EXPECT_EQ("\"tes\\\\\"\n"
9816             "\"n\"",
9817             format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
9818   EXPECT_EQ("\"\\\\\\\\\"\n"
9819             "\"\\n\"",
9820             format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
9821   EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
9822   EXPECT_EQ("\"\\uff01\"\n"
9823             "\"test\"",
9824             format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
9825   EXPECT_EQ("\"\\Uff01ff02\"",
9826             format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
9827   EXPECT_EQ("\"\\x000000000001\"\n"
9828             "\"next\"",
9829             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
9830   EXPECT_EQ("\"\\x000000000001next\"",
9831             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
9832   EXPECT_EQ("\"\\x000000000001\"",
9833             format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
9834   EXPECT_EQ("\"test\"\n"
9835             "\"\\000000\"\n"
9836             "\"000001\"",
9837             format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
9838   EXPECT_EQ("\"test\\000\"\n"
9839             "\"00000000\"\n"
9840             "\"1\"",
9841             format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
9842 }
9843 
9844 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
9845   verifyFormat("void f() {\n"
9846                "  return g() {}\n"
9847                "  void h() {}");
9848   verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
9849                "g();\n"
9850                "}");
9851 }
9852 
9853 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
9854   verifyFormat(
9855       "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
9856 }
9857 
9858 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
9859   verifyFormat("class X {\n"
9860                "  void f() {\n"
9861                "  }\n"
9862                "};",
9863                getLLVMStyleWithColumns(12));
9864 }
9865 
9866 TEST_F(FormatTest, ConfigurableIndentWidth) {
9867   FormatStyle EightIndent = getLLVMStyleWithColumns(18);
9868   EightIndent.IndentWidth = 8;
9869   EightIndent.ContinuationIndentWidth = 8;
9870   verifyFormat("void f() {\n"
9871                "        someFunction();\n"
9872                "        if (true) {\n"
9873                "                f();\n"
9874                "        }\n"
9875                "}",
9876                EightIndent);
9877   verifyFormat("class X {\n"
9878                "        void f() {\n"
9879                "        }\n"
9880                "};",
9881                EightIndent);
9882   verifyFormat("int x[] = {\n"
9883                "        call(),\n"
9884                "        call()};",
9885                EightIndent);
9886 }
9887 
9888 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
9889   verifyFormat("double\n"
9890                "f();",
9891                getLLVMStyleWithColumns(8));
9892 }
9893 
9894 TEST_F(FormatTest, ConfigurableUseOfTab) {
9895   FormatStyle Tab = getLLVMStyleWithColumns(42);
9896   Tab.IndentWidth = 8;
9897   Tab.UseTab = FormatStyle::UT_Always;
9898   Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
9899 
9900   EXPECT_EQ("if (aaaaaaaa && // q\n"
9901             "    bb)\t\t// w\n"
9902             "\t;",
9903             format("if (aaaaaaaa &&// q\n"
9904                    "bb)// w\n"
9905                    ";",
9906                    Tab));
9907   EXPECT_EQ("if (aaa && bbb) // w\n"
9908             "\t;",
9909             format("if(aaa&&bbb)// w\n"
9910                    ";",
9911                    Tab));
9912 
9913   verifyFormat("class X {\n"
9914                "\tvoid f() {\n"
9915                "\t\tsomeFunction(parameter1,\n"
9916                "\t\t\t     parameter2);\n"
9917                "\t}\n"
9918                "};",
9919                Tab);
9920   verifyFormat("#define A                        \\\n"
9921                "\tvoid f() {               \\\n"
9922                "\t\tsomeFunction(    \\\n"
9923                "\t\t    parameter1,  \\\n"
9924                "\t\t    parameter2); \\\n"
9925                "\t}",
9926                Tab);
9927   verifyFormat("int a;\t      // x\n"
9928                "int bbbbbbbb; // x\n",
9929                Tab);
9930 
9931   Tab.TabWidth = 4;
9932   Tab.IndentWidth = 8;
9933   verifyFormat("class TabWidth4Indent8 {\n"
9934                "\t\tvoid f() {\n"
9935                "\t\t\t\tsomeFunction(parameter1,\n"
9936                "\t\t\t\t\t\t\t parameter2);\n"
9937                "\t\t}\n"
9938                "};",
9939                Tab);
9940 
9941   Tab.TabWidth = 4;
9942   Tab.IndentWidth = 4;
9943   verifyFormat("class TabWidth4Indent4 {\n"
9944                "\tvoid f() {\n"
9945                "\t\tsomeFunction(parameter1,\n"
9946                "\t\t\t\t\t parameter2);\n"
9947                "\t}\n"
9948                "};",
9949                Tab);
9950 
9951   Tab.TabWidth = 8;
9952   Tab.IndentWidth = 4;
9953   verifyFormat("class TabWidth8Indent4 {\n"
9954                "    void f() {\n"
9955                "\tsomeFunction(parameter1,\n"
9956                "\t\t     parameter2);\n"
9957                "    }\n"
9958                "};",
9959                Tab);
9960 
9961   Tab.TabWidth = 8;
9962   Tab.IndentWidth = 8;
9963   EXPECT_EQ("/*\n"
9964             "\t      a\t\tcomment\n"
9965             "\t      in multiple lines\n"
9966             "       */",
9967             format("   /*\t \t \n"
9968                    " \t \t a\t\tcomment\t \t\n"
9969                    " \t \t in multiple lines\t\n"
9970                    " \t  */",
9971                    Tab));
9972 
9973   Tab.UseTab = FormatStyle::UT_ForIndentation;
9974   verifyFormat("{\n"
9975                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9976                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9977                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9978                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9979                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9980                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9981                "};",
9982                Tab);
9983   verifyFormat("enum AA {\n"
9984                "\ta1, // Force multiple lines\n"
9985                "\ta2,\n"
9986                "\ta3\n"
9987                "};",
9988                Tab);
9989   EXPECT_EQ("if (aaaaaaaa && // q\n"
9990             "    bb)         // w\n"
9991             "\t;",
9992             format("if (aaaaaaaa &&// q\n"
9993                    "bb)// w\n"
9994                    ";",
9995                    Tab));
9996   verifyFormat("class X {\n"
9997                "\tvoid f() {\n"
9998                "\t\tsomeFunction(parameter1,\n"
9999                "\t\t             parameter2);\n"
10000                "\t}\n"
10001                "};",
10002                Tab);
10003   verifyFormat("{\n"
10004                "\tQ(\n"
10005                "\t    {\n"
10006                "\t\t    int a;\n"
10007                "\t\t    someFunction(aaaaaaaa,\n"
10008                "\t\t                 bbbbbbb);\n"
10009                "\t    },\n"
10010                "\t    p);\n"
10011                "}",
10012                Tab);
10013   EXPECT_EQ("{\n"
10014             "\t/* aaaa\n"
10015             "\t   bbbb */\n"
10016             "}",
10017             format("{\n"
10018                    "/* aaaa\n"
10019                    "   bbbb */\n"
10020                    "}",
10021                    Tab));
10022   EXPECT_EQ("{\n"
10023             "\t/*\n"
10024             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10025             "\t  bbbbbbbbbbbbb\n"
10026             "\t*/\n"
10027             "}",
10028             format("{\n"
10029                    "/*\n"
10030                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10031                    "*/\n"
10032                    "}",
10033                    Tab));
10034   EXPECT_EQ("{\n"
10035             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10036             "\t// bbbbbbbbbbbbb\n"
10037             "}",
10038             format("{\n"
10039                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10040                    "}",
10041                    Tab));
10042   EXPECT_EQ("{\n"
10043             "\t/*\n"
10044             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10045             "\t  bbbbbbbbbbbbb\n"
10046             "\t*/\n"
10047             "}",
10048             format("{\n"
10049                    "\t/*\n"
10050                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10051                    "\t*/\n"
10052                    "}",
10053                    Tab));
10054   EXPECT_EQ("{\n"
10055             "\t/*\n"
10056             "\n"
10057             "\t*/\n"
10058             "}",
10059             format("{\n"
10060                    "\t/*\n"
10061                    "\n"
10062                    "\t*/\n"
10063                    "}",
10064                    Tab));
10065   EXPECT_EQ("{\n"
10066             "\t/*\n"
10067             " asdf\n"
10068             "\t*/\n"
10069             "}",
10070             format("{\n"
10071                    "\t/*\n"
10072                    " asdf\n"
10073                    "\t*/\n"
10074                    "}",
10075                    Tab));
10076 
10077   Tab.UseTab = FormatStyle::UT_Never;
10078   EXPECT_EQ("/*\n"
10079             "              a\t\tcomment\n"
10080             "              in multiple lines\n"
10081             "       */",
10082             format("   /*\t \t \n"
10083                    " \t \t a\t\tcomment\t \t\n"
10084                    " \t \t in multiple lines\t\n"
10085                    " \t  */",
10086                    Tab));
10087   EXPECT_EQ("/* some\n"
10088             "   comment */",
10089             format(" \t \t /* some\n"
10090                    " \t \t    comment */",
10091                    Tab));
10092   EXPECT_EQ("int a; /* some\n"
10093             "   comment */",
10094             format(" \t \t int a; /* some\n"
10095                    " \t \t    comment */",
10096                    Tab));
10097 
10098   EXPECT_EQ("int a; /* some\n"
10099             "comment */",
10100             format(" \t \t int\ta; /* some\n"
10101                    " \t \t    comment */",
10102                    Tab));
10103   EXPECT_EQ("f(\"\t\t\"); /* some\n"
10104             "    comment */",
10105             format(" \t \t f(\"\t\t\"); /* some\n"
10106                    " \t \t    comment */",
10107                    Tab));
10108   EXPECT_EQ("{\n"
10109             "  /*\n"
10110             "   * Comment\n"
10111             "   */\n"
10112             "  int i;\n"
10113             "}",
10114             format("{\n"
10115                    "\t/*\n"
10116                    "\t * Comment\n"
10117                    "\t */\n"
10118                    "\t int i;\n"
10119                    "}"));
10120 
10121   Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
10122   Tab.TabWidth = 8;
10123   Tab.IndentWidth = 8;
10124   EXPECT_EQ("if (aaaaaaaa && // q\n"
10125             "    bb)         // w\n"
10126             "\t;",
10127             format("if (aaaaaaaa &&// q\n"
10128                    "bb)// w\n"
10129                    ";",
10130                    Tab));
10131   EXPECT_EQ("if (aaa && bbb) // w\n"
10132             "\t;",
10133             format("if(aaa&&bbb)// w\n"
10134                    ";",
10135                    Tab));
10136   verifyFormat("class X {\n"
10137                "\tvoid f() {\n"
10138                "\t\tsomeFunction(parameter1,\n"
10139                "\t\t\t     parameter2);\n"
10140                "\t}\n"
10141                "};",
10142                Tab);
10143   verifyFormat("#define A                        \\\n"
10144                "\tvoid f() {               \\\n"
10145                "\t\tsomeFunction(    \\\n"
10146                "\t\t    parameter1,  \\\n"
10147                "\t\t    parameter2); \\\n"
10148                "\t}",
10149                Tab);
10150   Tab.TabWidth = 4;
10151   Tab.IndentWidth = 8;
10152   verifyFormat("class TabWidth4Indent8 {\n"
10153                "\t\tvoid f() {\n"
10154                "\t\t\t\tsomeFunction(parameter1,\n"
10155                "\t\t\t\t\t\t\t parameter2);\n"
10156                "\t\t}\n"
10157                "};",
10158                Tab);
10159   Tab.TabWidth = 4;
10160   Tab.IndentWidth = 4;
10161   verifyFormat("class TabWidth4Indent4 {\n"
10162                "\tvoid f() {\n"
10163                "\t\tsomeFunction(parameter1,\n"
10164                "\t\t\t\t\t parameter2);\n"
10165                "\t}\n"
10166                "};",
10167                Tab);
10168   Tab.TabWidth = 8;
10169   Tab.IndentWidth = 4;
10170   verifyFormat("class TabWidth8Indent4 {\n"
10171                "    void f() {\n"
10172                "\tsomeFunction(parameter1,\n"
10173                "\t\t     parameter2);\n"
10174                "    }\n"
10175                "};",
10176                Tab);
10177   Tab.TabWidth = 8;
10178   Tab.IndentWidth = 8;
10179   EXPECT_EQ("/*\n"
10180             "\t      a\t\tcomment\n"
10181             "\t      in multiple lines\n"
10182             "       */",
10183             format("   /*\t \t \n"
10184                    " \t \t a\t\tcomment\t \t\n"
10185                    " \t \t in multiple lines\t\n"
10186                    " \t  */",
10187                    Tab));
10188   verifyFormat("{\n"
10189                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10190                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10191                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10192                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10193                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10194                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10195                "};",
10196                Tab);
10197   verifyFormat("enum AA {\n"
10198                "\ta1, // Force multiple lines\n"
10199                "\ta2,\n"
10200                "\ta3\n"
10201                "};",
10202                Tab);
10203   EXPECT_EQ("if (aaaaaaaa && // q\n"
10204             "    bb)         // w\n"
10205             "\t;",
10206             format("if (aaaaaaaa &&// q\n"
10207                    "bb)// w\n"
10208                    ";",
10209                    Tab));
10210   verifyFormat("class X {\n"
10211                "\tvoid f() {\n"
10212                "\t\tsomeFunction(parameter1,\n"
10213                "\t\t\t     parameter2);\n"
10214                "\t}\n"
10215                "};",
10216                Tab);
10217   verifyFormat("{\n"
10218                "\tQ(\n"
10219                "\t    {\n"
10220                "\t\t    int a;\n"
10221                "\t\t    someFunction(aaaaaaaa,\n"
10222                "\t\t\t\t bbbbbbb);\n"
10223                "\t    },\n"
10224                "\t    p);\n"
10225                "}",
10226                Tab);
10227   EXPECT_EQ("{\n"
10228             "\t/* aaaa\n"
10229             "\t   bbbb */\n"
10230             "}",
10231             format("{\n"
10232                    "/* aaaa\n"
10233                    "   bbbb */\n"
10234                    "}",
10235                    Tab));
10236   EXPECT_EQ("{\n"
10237             "\t/*\n"
10238             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10239             "\t  bbbbbbbbbbbbb\n"
10240             "\t*/\n"
10241             "}",
10242             format("{\n"
10243                    "/*\n"
10244                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10245                    "*/\n"
10246                    "}",
10247                    Tab));
10248   EXPECT_EQ("{\n"
10249             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10250             "\t// bbbbbbbbbbbbb\n"
10251             "}",
10252             format("{\n"
10253                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10254                    "}",
10255                    Tab));
10256   EXPECT_EQ("{\n"
10257             "\t/*\n"
10258             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10259             "\t  bbbbbbbbbbbbb\n"
10260             "\t*/\n"
10261             "}",
10262             format("{\n"
10263                    "\t/*\n"
10264                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10265                    "\t*/\n"
10266                    "}",
10267                    Tab));
10268   EXPECT_EQ("{\n"
10269             "\t/*\n"
10270             "\n"
10271             "\t*/\n"
10272             "}",
10273             format("{\n"
10274                    "\t/*\n"
10275                    "\n"
10276                    "\t*/\n"
10277                    "}",
10278                    Tab));
10279   EXPECT_EQ("{\n"
10280             "\t/*\n"
10281             " asdf\n"
10282             "\t*/\n"
10283             "}",
10284             format("{\n"
10285                    "\t/*\n"
10286                    " asdf\n"
10287                    "\t*/\n"
10288                    "}",
10289                    Tab));
10290   EXPECT_EQ("/*\n"
10291             "\t      a\t\tcomment\n"
10292             "\t      in multiple lines\n"
10293             "       */",
10294             format("   /*\t \t \n"
10295                    " \t \t a\t\tcomment\t \t\n"
10296                    " \t \t in multiple lines\t\n"
10297                    " \t  */",
10298                    Tab));
10299   EXPECT_EQ("/* some\n"
10300             "   comment */",
10301             format(" \t \t /* some\n"
10302                    " \t \t    comment */",
10303                    Tab));
10304   EXPECT_EQ("int a; /* some\n"
10305             "   comment */",
10306             format(" \t \t int a; /* some\n"
10307                    " \t \t    comment */",
10308                    Tab));
10309   EXPECT_EQ("int a; /* some\n"
10310             "comment */",
10311             format(" \t \t int\ta; /* some\n"
10312                    " \t \t    comment */",
10313                    Tab));
10314   EXPECT_EQ("f(\"\t\t\"); /* some\n"
10315             "    comment */",
10316             format(" \t \t f(\"\t\t\"); /* some\n"
10317                    " \t \t    comment */",
10318                    Tab));
10319   EXPECT_EQ("{\n"
10320             "  /*\n"
10321             "   * Comment\n"
10322             "   */\n"
10323             "  int i;\n"
10324             "}",
10325             format("{\n"
10326                    "\t/*\n"
10327                    "\t * Comment\n"
10328                    "\t */\n"
10329                    "\t int i;\n"
10330                    "}"));
10331   Tab.AlignConsecutiveAssignments = true;
10332   Tab.AlignConsecutiveDeclarations = true;
10333   Tab.TabWidth = 4;
10334   Tab.IndentWidth = 4;
10335   verifyFormat("class Assign {\n"
10336                "\tvoid f() {\n"
10337                "\t\tint         x      = 123;\n"
10338                "\t\tint         random = 4;\n"
10339                "\t\tstd::string alphabet =\n"
10340                "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
10341                "\t}\n"
10342                "};",
10343                Tab);
10344 }
10345 
10346 TEST_F(FormatTest, ZeroTabWidth) {
10347   FormatStyle Tab = getLLVMStyleWithColumns(42);
10348   Tab.IndentWidth = 8;
10349   Tab.UseTab = FormatStyle::UT_Never;
10350   Tab.TabWidth = 0;
10351   EXPECT_EQ("void a(){\n"
10352             "    // line starts with '\t'\n"
10353             "};",
10354             format("void a(){\n"
10355                    "\t// line starts with '\t'\n"
10356                    "};",
10357                    Tab));
10358 
10359   EXPECT_EQ("void a(){\n"
10360             "    // line starts with '\t'\n"
10361             "};",
10362             format("void a(){\n"
10363                    "\t\t// line starts with '\t'\n"
10364                    "};",
10365                    Tab));
10366 
10367   Tab.UseTab = FormatStyle::UT_ForIndentation;
10368   EXPECT_EQ("void a(){\n"
10369             "    // line starts with '\t'\n"
10370             "};",
10371             format("void a(){\n"
10372                    "\t// line starts with '\t'\n"
10373                    "};",
10374                    Tab));
10375 
10376   EXPECT_EQ("void a(){\n"
10377             "    // line starts with '\t'\n"
10378             "};",
10379             format("void a(){\n"
10380                    "\t\t// line starts with '\t'\n"
10381                    "};",
10382                    Tab));
10383 
10384   Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
10385   EXPECT_EQ("void a(){\n"
10386             "    // line starts with '\t'\n"
10387             "};",
10388             format("void a(){\n"
10389                    "\t// line starts with '\t'\n"
10390                    "};",
10391                    Tab));
10392 
10393   EXPECT_EQ("void a(){\n"
10394             "    // line starts with '\t'\n"
10395             "};",
10396             format("void a(){\n"
10397                    "\t\t// line starts with '\t'\n"
10398                    "};",
10399                    Tab));
10400 
10401   Tab.UseTab = FormatStyle::UT_Always;
10402   EXPECT_EQ("void a(){\n"
10403             "// line starts with '\t'\n"
10404             "};",
10405             format("void a(){\n"
10406                    "\t// line starts with '\t'\n"
10407                    "};",
10408                    Tab));
10409 
10410   EXPECT_EQ("void a(){\n"
10411             "// line starts with '\t'\n"
10412             "};",
10413             format("void a(){\n"
10414                    "\t\t// line starts with '\t'\n"
10415                    "};",
10416                    Tab));
10417 }
10418 
10419 TEST_F(FormatTest, CalculatesOriginalColumn) {
10420   EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
10421             "q\"; /* some\n"
10422             "       comment */",
10423             format("  \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
10424                    "q\"; /* some\n"
10425                    "       comment */",
10426                    getLLVMStyle()));
10427   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
10428             "/* some\n"
10429             "   comment */",
10430             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
10431                    " /* some\n"
10432                    "    comment */",
10433                    getLLVMStyle()));
10434   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
10435             "qqq\n"
10436             "/* some\n"
10437             "   comment */",
10438             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
10439                    "qqq\n"
10440                    " /* some\n"
10441                    "    comment */",
10442                    getLLVMStyle()));
10443   EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
10444             "wwww; /* some\n"
10445             "         comment */",
10446             format("  inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
10447                    "wwww; /* some\n"
10448                    "         comment */",
10449                    getLLVMStyle()));
10450 }
10451 
10452 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
10453   FormatStyle NoSpace = getLLVMStyle();
10454   NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
10455 
10456   verifyFormat("while(true)\n"
10457                "  continue;",
10458                NoSpace);
10459   verifyFormat("for(;;)\n"
10460                "  continue;",
10461                NoSpace);
10462   verifyFormat("if(true)\n"
10463                "  f();\n"
10464                "else if(true)\n"
10465                "  f();",
10466                NoSpace);
10467   verifyFormat("do {\n"
10468                "  do_something();\n"
10469                "} while(something());",
10470                NoSpace);
10471   verifyFormat("switch(x) {\n"
10472                "default:\n"
10473                "  break;\n"
10474                "}",
10475                NoSpace);
10476   verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
10477   verifyFormat("size_t x = sizeof(x);", NoSpace);
10478   verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
10479   verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
10480   verifyFormat("alignas(128) char a[128];", NoSpace);
10481   verifyFormat("size_t x = alignof(MyType);", NoSpace);
10482   verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
10483   verifyFormat("int f() throw(Deprecated);", NoSpace);
10484   verifyFormat("typedef void (*cb)(int);", NoSpace);
10485   verifyFormat("T A::operator()();", NoSpace);
10486   verifyFormat("X A::operator++(T);", NoSpace);
10487   verifyFormat("auto lambda = []() { return 0; };", NoSpace);
10488 
10489   FormatStyle Space = getLLVMStyle();
10490   Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
10491 
10492   verifyFormat("int f ();", Space);
10493   verifyFormat("void f (int a, T b) {\n"
10494                "  while (true)\n"
10495                "    continue;\n"
10496                "}",
10497                Space);
10498   verifyFormat("if (true)\n"
10499                "  f ();\n"
10500                "else if (true)\n"
10501                "  f ();",
10502                Space);
10503   verifyFormat("do {\n"
10504                "  do_something ();\n"
10505                "} while (something ());",
10506                Space);
10507   verifyFormat("switch (x) {\n"
10508                "default:\n"
10509                "  break;\n"
10510                "}",
10511                Space);
10512   verifyFormat("A::A () : a (1) {}", Space);
10513   verifyFormat("void f () __attribute__ ((asdf));", Space);
10514   verifyFormat("*(&a + 1);\n"
10515                "&((&a)[1]);\n"
10516                "a[(b + c) * d];\n"
10517                "(((a + 1) * 2) + 3) * 4;",
10518                Space);
10519   verifyFormat("#define A(x) x", Space);
10520   verifyFormat("#define A (x) x", Space);
10521   verifyFormat("#if defined(x)\n"
10522                "#endif",
10523                Space);
10524   verifyFormat("auto i = std::make_unique<int> (5);", Space);
10525   verifyFormat("size_t x = sizeof (x);", Space);
10526   verifyFormat("auto f (int x) -> decltype (x);", Space);
10527   verifyFormat("int f (T x) noexcept (x.create ());", Space);
10528   verifyFormat("alignas (128) char a[128];", Space);
10529   verifyFormat("size_t x = alignof (MyType);", Space);
10530   verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
10531   verifyFormat("int f () throw (Deprecated);", Space);
10532   verifyFormat("typedef void (*cb) (int);", Space);
10533   verifyFormat("T A::operator() ();", Space);
10534   verifyFormat("X A::operator++ (T);", Space);
10535   verifyFormat("auto lambda = [] () { return 0; };", Space);
10536   verifyFormat("int x = int (y);", Space);
10537 
10538   FormatStyle SomeSpace = getLLVMStyle();
10539   SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses;
10540 
10541   verifyFormat("[]() -> float {}", SomeSpace);
10542   verifyFormat("[] (auto foo) {}", SomeSpace);
10543   verifyFormat("[foo]() -> int {}", SomeSpace);
10544   verifyFormat("int f();", SomeSpace);
10545   verifyFormat("void f (int a, T b) {\n"
10546                "  while (true)\n"
10547                "    continue;\n"
10548                "}",
10549                SomeSpace);
10550   verifyFormat("if (true)\n"
10551                "  f();\n"
10552                "else if (true)\n"
10553                "  f();",
10554                SomeSpace);
10555   verifyFormat("do {\n"
10556                "  do_something();\n"
10557                "} while (something());",
10558                SomeSpace);
10559   verifyFormat("switch (x) {\n"
10560                "default:\n"
10561                "  break;\n"
10562                "}",
10563                SomeSpace);
10564   verifyFormat("A::A() : a (1) {}", SomeSpace);
10565   verifyFormat("void f() __attribute__ ((asdf));", SomeSpace);
10566   verifyFormat("*(&a + 1);\n"
10567                "&((&a)[1]);\n"
10568                "a[(b + c) * d];\n"
10569                "(((a + 1) * 2) + 3) * 4;",
10570                SomeSpace);
10571   verifyFormat("#define A(x) x", SomeSpace);
10572   verifyFormat("#define A (x) x", SomeSpace);
10573   verifyFormat("#if defined(x)\n"
10574                "#endif",
10575                SomeSpace);
10576   verifyFormat("auto i = std::make_unique<int> (5);", SomeSpace);
10577   verifyFormat("size_t x = sizeof (x);", SomeSpace);
10578   verifyFormat("auto f (int x) -> decltype (x);", SomeSpace);
10579   verifyFormat("int f (T x) noexcept (x.create());", SomeSpace);
10580   verifyFormat("alignas (128) char a[128];", SomeSpace);
10581   verifyFormat("size_t x = alignof (MyType);", SomeSpace);
10582   verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");",
10583                SomeSpace);
10584   verifyFormat("int f() throw (Deprecated);", SomeSpace);
10585   verifyFormat("typedef void (*cb) (int);", SomeSpace);
10586   verifyFormat("T A::operator()();", SomeSpace);
10587   verifyFormat("X A::operator++ (T);", SomeSpace);
10588   verifyFormat("int x = int (y);", SomeSpace);
10589   verifyFormat("auto lambda = []() { return 0; };", SomeSpace);
10590 }
10591 
10592 TEST_F(FormatTest, SpaceAfterLogicalNot) {
10593   FormatStyle Spaces = getLLVMStyle();
10594   Spaces.SpaceAfterLogicalNot = true;
10595 
10596   verifyFormat("bool x = ! y", Spaces);
10597   verifyFormat("if (! isFailure())", Spaces);
10598   verifyFormat("if (! (a && b))", Spaces);
10599   verifyFormat("\"Error!\"", Spaces);
10600   verifyFormat("! ! x", Spaces);
10601 }
10602 
10603 TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
10604   FormatStyle Spaces = getLLVMStyle();
10605 
10606   Spaces.SpacesInParentheses = true;
10607   verifyFormat("do_something( ::globalVar );", Spaces);
10608   verifyFormat("call( x, y, z );", Spaces);
10609   verifyFormat("call();", Spaces);
10610   verifyFormat("std::function<void( int, int )> callback;", Spaces);
10611   verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
10612                Spaces);
10613   verifyFormat("while ( (bool)1 )\n"
10614                "  continue;",
10615                Spaces);
10616   verifyFormat("for ( ;; )\n"
10617                "  continue;",
10618                Spaces);
10619   verifyFormat("if ( true )\n"
10620                "  f();\n"
10621                "else if ( true )\n"
10622                "  f();",
10623                Spaces);
10624   verifyFormat("do {\n"
10625                "  do_something( (int)i );\n"
10626                "} while ( something() );",
10627                Spaces);
10628   verifyFormat("switch ( x ) {\n"
10629                "default:\n"
10630                "  break;\n"
10631                "}",
10632                Spaces);
10633 
10634   Spaces.SpacesInParentheses = false;
10635   Spaces.SpacesInCStyleCastParentheses = true;
10636   verifyFormat("Type *A = ( Type * )P;", Spaces);
10637   verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
10638   verifyFormat("x = ( int32 )y;", Spaces);
10639   verifyFormat("int a = ( int )(2.0f);", Spaces);
10640   verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
10641   verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
10642   verifyFormat("#define x (( int )-1)", Spaces);
10643 
10644   // Run the first set of tests again with:
10645   Spaces.SpacesInParentheses = false;
10646   Spaces.SpaceInEmptyParentheses = true;
10647   Spaces.SpacesInCStyleCastParentheses = true;
10648   verifyFormat("call(x, y, z);", Spaces);
10649   verifyFormat("call( );", Spaces);
10650   verifyFormat("std::function<void(int, int)> callback;", Spaces);
10651   verifyFormat("while (( bool )1)\n"
10652                "  continue;",
10653                Spaces);
10654   verifyFormat("for (;;)\n"
10655                "  continue;",
10656                Spaces);
10657   verifyFormat("if (true)\n"
10658                "  f( );\n"
10659                "else if (true)\n"
10660                "  f( );",
10661                Spaces);
10662   verifyFormat("do {\n"
10663                "  do_something(( int )i);\n"
10664                "} while (something( ));",
10665                Spaces);
10666   verifyFormat("switch (x) {\n"
10667                "default:\n"
10668                "  break;\n"
10669                "}",
10670                Spaces);
10671 
10672   // Run the first set of tests again with:
10673   Spaces.SpaceAfterCStyleCast = true;
10674   verifyFormat("call(x, y, z);", Spaces);
10675   verifyFormat("call( );", Spaces);
10676   verifyFormat("std::function<void(int, int)> callback;", Spaces);
10677   verifyFormat("while (( bool ) 1)\n"
10678                "  continue;",
10679                Spaces);
10680   verifyFormat("for (;;)\n"
10681                "  continue;",
10682                Spaces);
10683   verifyFormat("if (true)\n"
10684                "  f( );\n"
10685                "else if (true)\n"
10686                "  f( );",
10687                Spaces);
10688   verifyFormat("do {\n"
10689                "  do_something(( int ) i);\n"
10690                "} while (something( ));",
10691                Spaces);
10692   verifyFormat("switch (x) {\n"
10693                "default:\n"
10694                "  break;\n"
10695                "}",
10696                Spaces);
10697 
10698   // Run subset of tests again with:
10699   Spaces.SpacesInCStyleCastParentheses = false;
10700   Spaces.SpaceAfterCStyleCast = true;
10701   verifyFormat("while ((bool) 1)\n"
10702                "  continue;",
10703                Spaces);
10704   verifyFormat("do {\n"
10705                "  do_something((int) i);\n"
10706                "} while (something( ));",
10707                Spaces);
10708 }
10709 
10710 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
10711   verifyFormat("int a[5];");
10712   verifyFormat("a[3] += 42;");
10713 
10714   FormatStyle Spaces = getLLVMStyle();
10715   Spaces.SpacesInSquareBrackets = true;
10716   // Not lambdas.
10717   verifyFormat("int a[ 5 ];", Spaces);
10718   verifyFormat("a[ 3 ] += 42;", Spaces);
10719   verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
10720   verifyFormat("double &operator[](int i) { return 0; }\n"
10721                "int i;",
10722                Spaces);
10723   verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
10724   verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
10725   verifyFormat("int i = (*b)[ a ]->f();", Spaces);
10726   // Lambdas.
10727   verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
10728   verifyFormat("return [ i, args... ] {};", Spaces);
10729   verifyFormat("int foo = [ &bar ]() {};", Spaces);
10730   verifyFormat("int foo = [ = ]() {};", Spaces);
10731   verifyFormat("int foo = [ & ]() {};", Spaces);
10732   verifyFormat("int foo = [ =, &bar ]() {};", Spaces);
10733   verifyFormat("int foo = [ &bar, = ]() {};", Spaces);
10734 }
10735 
10736 TEST_F(FormatTest, ConfigurableSpaceBeforeBrackets) {
10737   FormatStyle NoSpaceStyle = getLLVMStyle();
10738   verifyFormat("int a[5];", NoSpaceStyle);
10739   verifyFormat("a[3] += 42;", NoSpaceStyle);
10740 
10741   verifyFormat("int a[1];", NoSpaceStyle);
10742   verifyFormat("int 1 [a];", NoSpaceStyle);
10743   verifyFormat("int a[1][2];", NoSpaceStyle);
10744   verifyFormat("a[7] = 5;", NoSpaceStyle);
10745   verifyFormat("int a = (f())[23];", NoSpaceStyle);
10746   verifyFormat("f([] {})", NoSpaceStyle);
10747 
10748   FormatStyle Space = getLLVMStyle();
10749   Space.SpaceBeforeSquareBrackets = true;
10750   verifyFormat("int c = []() -> int { return 2; }();\n", Space);
10751   verifyFormat("return [i, args...] {};", Space);
10752 
10753   verifyFormat("int a [5];", Space);
10754   verifyFormat("a [3] += 42;", Space);
10755   verifyFormat("constexpr char hello []{\"hello\"};", Space);
10756   verifyFormat("double &operator[](int i) { return 0; }\n"
10757                "int i;",
10758                Space);
10759   verifyFormat("std::unique_ptr<int []> foo() {}", Space);
10760   verifyFormat("int i = a [a][a]->f();", Space);
10761   verifyFormat("int i = (*b) [a]->f();", Space);
10762 
10763   verifyFormat("int a [1];", Space);
10764   verifyFormat("int 1 [a];", Space);
10765   verifyFormat("int a [1][2];", Space);
10766   verifyFormat("a [7] = 5;", Space);
10767   verifyFormat("int a = (f()) [23];", Space);
10768   verifyFormat("f([] {})", Space);
10769 }
10770 
10771 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
10772   verifyFormat("int a = 5;");
10773   verifyFormat("a += 42;");
10774   verifyFormat("a or_eq 8;");
10775 
10776   FormatStyle Spaces = getLLVMStyle();
10777   Spaces.SpaceBeforeAssignmentOperators = false;
10778   verifyFormat("int a= 5;", Spaces);
10779   verifyFormat("a+= 42;", Spaces);
10780   verifyFormat("a or_eq 8;", Spaces);
10781 }
10782 
10783 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
10784   verifyFormat("class Foo : public Bar {};");
10785   verifyFormat("Foo::Foo() : foo(1) {}");
10786   verifyFormat("for (auto a : b) {\n}");
10787   verifyFormat("int x = a ? b : c;");
10788   verifyFormat("{\n"
10789                "label0:\n"
10790                "  int x = 0;\n"
10791                "}");
10792   verifyFormat("switch (x) {\n"
10793                "case 1:\n"
10794                "default:\n"
10795                "}");
10796 
10797   FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30);
10798   CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false;
10799   verifyFormat("class Foo : public Bar {};", CtorInitializerStyle);
10800   verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle);
10801   verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle);
10802   verifyFormat("int x = a ? b : c;", CtorInitializerStyle);
10803   verifyFormat("{\n"
10804                "label1:\n"
10805                "  int x = 0;\n"
10806                "}",
10807                CtorInitializerStyle);
10808   verifyFormat("switch (x) {\n"
10809                "case 1:\n"
10810                "default:\n"
10811                "}",
10812                CtorInitializerStyle);
10813   CtorInitializerStyle.BreakConstructorInitializers =
10814       FormatStyle::BCIS_AfterColon;
10815   verifyFormat("Fooooooooooo::Fooooooooooo():\n"
10816                "    aaaaaaaaaaaaaaaa(1),\n"
10817                "    bbbbbbbbbbbbbbbb(2) {}",
10818                CtorInitializerStyle);
10819   CtorInitializerStyle.BreakConstructorInitializers =
10820       FormatStyle::BCIS_BeforeComma;
10821   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
10822                "    : aaaaaaaaaaaaaaaa(1)\n"
10823                "    , bbbbbbbbbbbbbbbb(2) {}",
10824                CtorInitializerStyle);
10825   CtorInitializerStyle.BreakConstructorInitializers =
10826       FormatStyle::BCIS_BeforeColon;
10827   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
10828                "    : aaaaaaaaaaaaaaaa(1),\n"
10829                "      bbbbbbbbbbbbbbbb(2) {}",
10830                CtorInitializerStyle);
10831   CtorInitializerStyle.ConstructorInitializerIndentWidth = 0;
10832   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
10833                ": aaaaaaaaaaaaaaaa(1),\n"
10834                "  bbbbbbbbbbbbbbbb(2) {}",
10835                CtorInitializerStyle);
10836 
10837   FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30);
10838   InheritanceStyle.SpaceBeforeInheritanceColon = false;
10839   verifyFormat("class Foo: public Bar {};", InheritanceStyle);
10840   verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle);
10841   verifyFormat("for (auto a : b) {\n}", InheritanceStyle);
10842   verifyFormat("int x = a ? b : c;", InheritanceStyle);
10843   verifyFormat("{\n"
10844                "label2:\n"
10845                "  int x = 0;\n"
10846                "}",
10847                InheritanceStyle);
10848   verifyFormat("switch (x) {\n"
10849                "case 1:\n"
10850                "default:\n"
10851                "}",
10852                InheritanceStyle);
10853   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon;
10854   verifyFormat("class Foooooooooooooooooooooo:\n"
10855                "    public aaaaaaaaaaaaaaaaaa,\n"
10856                "    public bbbbbbbbbbbbbbbbbb {\n"
10857                "}",
10858                InheritanceStyle);
10859   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
10860   verifyFormat("class Foooooooooooooooooooooo\n"
10861                "    : public aaaaaaaaaaaaaaaaaa\n"
10862                "    , public bbbbbbbbbbbbbbbbbb {\n"
10863                "}",
10864                InheritanceStyle);
10865   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
10866   verifyFormat("class Foooooooooooooooooooooo\n"
10867                "    : public aaaaaaaaaaaaaaaaaa,\n"
10868                "      public bbbbbbbbbbbbbbbbbb {\n"
10869                "}",
10870                InheritanceStyle);
10871   InheritanceStyle.ConstructorInitializerIndentWidth = 0;
10872   verifyFormat("class Foooooooooooooooooooooo\n"
10873                ": public aaaaaaaaaaaaaaaaaa,\n"
10874                "  public bbbbbbbbbbbbbbbbbb {}",
10875                InheritanceStyle);
10876 
10877   FormatStyle ForLoopStyle = getLLVMStyle();
10878   ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false;
10879   verifyFormat("class Foo : public Bar {};", ForLoopStyle);
10880   verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle);
10881   verifyFormat("for (auto a: b) {\n}", ForLoopStyle);
10882   verifyFormat("int x = a ? b : c;", ForLoopStyle);
10883   verifyFormat("{\n"
10884                "label2:\n"
10885                "  int x = 0;\n"
10886                "}",
10887                ForLoopStyle);
10888   verifyFormat("switch (x) {\n"
10889                "case 1:\n"
10890                "default:\n"
10891                "}",
10892                ForLoopStyle);
10893 
10894   FormatStyle NoSpaceStyle = getLLVMStyle();
10895   NoSpaceStyle.SpaceBeforeCtorInitializerColon = false;
10896   NoSpaceStyle.SpaceBeforeInheritanceColon = false;
10897   NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false;
10898   verifyFormat("class Foo: public Bar {};", NoSpaceStyle);
10899   verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle);
10900   verifyFormat("for (auto a: b) {\n}", NoSpaceStyle);
10901   verifyFormat("int x = a ? b : c;", NoSpaceStyle);
10902   verifyFormat("{\n"
10903                "label3:\n"
10904                "  int x = 0;\n"
10905                "}",
10906                NoSpaceStyle);
10907   verifyFormat("switch (x) {\n"
10908                "case 1:\n"
10909                "default:\n"
10910                "}",
10911                NoSpaceStyle);
10912 }
10913 
10914 TEST_F(FormatTest, AlignConsecutiveMacros) {
10915   FormatStyle Style = getLLVMStyle();
10916   Style.AlignConsecutiveAssignments = true;
10917   Style.AlignConsecutiveDeclarations = true;
10918   Style.AlignConsecutiveMacros = false;
10919 
10920   verifyFormat("#define a 3\n"
10921                "#define bbbb 4\n"
10922                "#define ccc (5)",
10923                Style);
10924 
10925   verifyFormat("#define f(x) (x * x)\n"
10926                "#define fff(x, y, z) (x * y + z)\n"
10927                "#define ffff(x, y) (x - y)",
10928                Style);
10929 
10930   verifyFormat("#define foo(x, y) (x + y)\n"
10931                "#define bar (5, 6)(2 + 2)",
10932                Style);
10933 
10934   verifyFormat("#define a 3\n"
10935                "#define bbbb 4\n"
10936                "#define ccc (5)\n"
10937                "#define f(x) (x * x)\n"
10938                "#define fff(x, y, z) (x * y + z)\n"
10939                "#define ffff(x, y) (x - y)",
10940                Style);
10941 
10942   Style.AlignConsecutiveMacros = true;
10943   verifyFormat("#define a    3\n"
10944                "#define bbbb 4\n"
10945                "#define ccc  (5)",
10946                Style);
10947 
10948   verifyFormat("#define f(x)         (x * x)\n"
10949                "#define fff(x, y, z) (x * y + z)\n"
10950                "#define ffff(x, y)   (x - y)",
10951                Style);
10952 
10953   verifyFormat("#define foo(x, y) (x + y)\n"
10954                "#define bar       (5, 6)(2 + 2)",
10955                Style);
10956 
10957   verifyFormat("#define a            3\n"
10958                "#define bbbb         4\n"
10959                "#define ccc          (5)\n"
10960                "#define f(x)         (x * x)\n"
10961                "#define fff(x, y, z) (x * y + z)\n"
10962                "#define ffff(x, y)   (x - y)",
10963                Style);
10964 
10965   verifyFormat("#define a         5\n"
10966                "#define foo(x, y) (x + y)\n"
10967                "#define CCC       (6)\n"
10968                "auto lambda = []() {\n"
10969                "  auto  ii = 0;\n"
10970                "  float j  = 0;\n"
10971                "  return 0;\n"
10972                "};\n"
10973                "int   i  = 0;\n"
10974                "float i2 = 0;\n"
10975                "auto  v  = type{\n"
10976                "    i = 1,   //\n"
10977                "    (i = 2), //\n"
10978                "    i = 3    //\n"
10979                "};",
10980                Style);
10981 
10982   Style.AlignConsecutiveMacros = false;
10983   Style.ColumnLimit = 20;
10984 
10985   verifyFormat("#define a          \\\n"
10986                "  \"aabbbbbbbbbbbb\"\n"
10987                "#define D          \\\n"
10988                "  \"aabbbbbbbbbbbb\" \\\n"
10989                "  \"ccddeeeeeeeee\"\n"
10990                "#define B          \\\n"
10991                "  \"QQQQQQQQQQQQQ\"  \\\n"
10992                "  \"FFFFFFFFFFFFF\"  \\\n"
10993                "  \"LLLLLLLL\"\n",
10994                Style);
10995 
10996   Style.AlignConsecutiveMacros = true;
10997   verifyFormat("#define a          \\\n"
10998                "  \"aabbbbbbbbbbbb\"\n"
10999                "#define D          \\\n"
11000                "  \"aabbbbbbbbbbbb\" \\\n"
11001                "  \"ccddeeeeeeeee\"\n"
11002                "#define B          \\\n"
11003                "  \"QQQQQQQQQQQQQ\"  \\\n"
11004                "  \"FFFFFFFFFFFFF\"  \\\n"
11005                "  \"LLLLLLLL\"\n",
11006                Style);
11007 }
11008 
11009 TEST_F(FormatTest, AlignConsecutiveAssignments) {
11010   FormatStyle Alignment = getLLVMStyle();
11011   Alignment.AlignConsecutiveMacros = true;
11012   Alignment.AlignConsecutiveAssignments = false;
11013   verifyFormat("int a = 5;\n"
11014                "int oneTwoThree = 123;",
11015                Alignment);
11016   verifyFormat("int a = 5;\n"
11017                "int oneTwoThree = 123;",
11018                Alignment);
11019 
11020   Alignment.AlignConsecutiveAssignments = true;
11021   verifyFormat("int a           = 5;\n"
11022                "int oneTwoThree = 123;",
11023                Alignment);
11024   verifyFormat("int a           = method();\n"
11025                "int oneTwoThree = 133;",
11026                Alignment);
11027   verifyFormat("a &= 5;\n"
11028                "bcd *= 5;\n"
11029                "ghtyf += 5;\n"
11030                "dvfvdb -= 5;\n"
11031                "a /= 5;\n"
11032                "vdsvsv %= 5;\n"
11033                "sfdbddfbdfbb ^= 5;\n"
11034                "dvsdsv |= 5;\n"
11035                "int dsvvdvsdvvv = 123;",
11036                Alignment);
11037   verifyFormat("int i = 1, j = 10;\n"
11038                "something = 2000;",
11039                Alignment);
11040   verifyFormat("something = 2000;\n"
11041                "int i = 1, j = 10;\n",
11042                Alignment);
11043   verifyFormat("something = 2000;\n"
11044                "another   = 911;\n"
11045                "int i = 1, j = 10;\n"
11046                "oneMore = 1;\n"
11047                "i       = 2;",
11048                Alignment);
11049   verifyFormat("int a   = 5;\n"
11050                "int one = 1;\n"
11051                "method();\n"
11052                "int oneTwoThree = 123;\n"
11053                "int oneTwo      = 12;",
11054                Alignment);
11055   verifyFormat("int oneTwoThree = 123;\n"
11056                "int oneTwo      = 12;\n"
11057                "method();\n",
11058                Alignment);
11059   verifyFormat("int oneTwoThree = 123; // comment\n"
11060                "int oneTwo      = 12;  // comment",
11061                Alignment);
11062   EXPECT_EQ("int a = 5;\n"
11063             "\n"
11064             "int oneTwoThree = 123;",
11065             format("int a       = 5;\n"
11066                    "\n"
11067                    "int oneTwoThree= 123;",
11068                    Alignment));
11069   EXPECT_EQ("int a   = 5;\n"
11070             "int one = 1;\n"
11071             "\n"
11072             "int oneTwoThree = 123;",
11073             format("int a = 5;\n"
11074                    "int one = 1;\n"
11075                    "\n"
11076                    "int oneTwoThree = 123;",
11077                    Alignment));
11078   EXPECT_EQ("int a   = 5;\n"
11079             "int one = 1;\n"
11080             "\n"
11081             "int oneTwoThree = 123;\n"
11082             "int oneTwo      = 12;",
11083             format("int a = 5;\n"
11084                    "int one = 1;\n"
11085                    "\n"
11086                    "int oneTwoThree = 123;\n"
11087                    "int oneTwo = 12;",
11088                    Alignment));
11089   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
11090   verifyFormat("#define A \\\n"
11091                "  int aaaa       = 12; \\\n"
11092                "  int b          = 23; \\\n"
11093                "  int ccc        = 234; \\\n"
11094                "  int dddddddddd = 2345;",
11095                Alignment);
11096   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
11097   verifyFormat("#define A               \\\n"
11098                "  int aaaa       = 12;  \\\n"
11099                "  int b          = 23;  \\\n"
11100                "  int ccc        = 234; \\\n"
11101                "  int dddddddddd = 2345;",
11102                Alignment);
11103   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
11104   verifyFormat("#define A                                                      "
11105                "                \\\n"
11106                "  int aaaa       = 12;                                         "
11107                "                \\\n"
11108                "  int b          = 23;                                         "
11109                "                \\\n"
11110                "  int ccc        = 234;                                        "
11111                "                \\\n"
11112                "  int dddddddddd = 2345;",
11113                Alignment);
11114   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
11115                "k = 4, int l = 5,\n"
11116                "                  int m = 6) {\n"
11117                "  int j      = 10;\n"
11118                "  otherThing = 1;\n"
11119                "}",
11120                Alignment);
11121   verifyFormat("void SomeFunction(int parameter = 0) {\n"
11122                "  int i   = 1;\n"
11123                "  int j   = 2;\n"
11124                "  int big = 10000;\n"
11125                "}",
11126                Alignment);
11127   verifyFormat("class C {\n"
11128                "public:\n"
11129                "  int i            = 1;\n"
11130                "  virtual void f() = 0;\n"
11131                "};",
11132                Alignment);
11133   verifyFormat("int i = 1;\n"
11134                "if (SomeType t = getSomething()) {\n"
11135                "}\n"
11136                "int j   = 2;\n"
11137                "int big = 10000;",
11138                Alignment);
11139   verifyFormat("int j = 7;\n"
11140                "for (int k = 0; k < N; ++k) {\n"
11141                "}\n"
11142                "int j   = 2;\n"
11143                "int big = 10000;\n"
11144                "}",
11145                Alignment);
11146   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
11147   verifyFormat("int i = 1;\n"
11148                "LooooooooooongType loooooooooooooooooooooongVariable\n"
11149                "    = someLooooooooooooooooongFunction();\n"
11150                "int j = 2;",
11151                Alignment);
11152   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
11153   verifyFormat("int i = 1;\n"
11154                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
11155                "    someLooooooooooooooooongFunction();\n"
11156                "int j = 2;",
11157                Alignment);
11158 
11159   verifyFormat("auto lambda = []() {\n"
11160                "  auto i = 0;\n"
11161                "  return 0;\n"
11162                "};\n"
11163                "int i  = 0;\n"
11164                "auto v = type{\n"
11165                "    i = 1,   //\n"
11166                "    (i = 2), //\n"
11167                "    i = 3    //\n"
11168                "};",
11169                Alignment);
11170 
11171   verifyFormat(
11172       "int i      = 1;\n"
11173       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
11174       "                          loooooooooooooooooooooongParameterB);\n"
11175       "int j      = 2;",
11176       Alignment);
11177 
11178   verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
11179                "          typename B   = very_long_type_name_1,\n"
11180                "          typename T_2 = very_long_type_name_2>\n"
11181                "auto foo() {}\n",
11182                Alignment);
11183   verifyFormat("int a, b = 1;\n"
11184                "int c  = 2;\n"
11185                "int dd = 3;\n",
11186                Alignment);
11187   verifyFormat("int aa       = ((1 > 2) ? 3 : 4);\n"
11188                "float b[1][] = {{3.f}};\n",
11189                Alignment);
11190   verifyFormat("for (int i = 0; i < 1; i++)\n"
11191                "  int x = 1;\n",
11192                Alignment);
11193   verifyFormat("for (i = 0; i < 1; i++)\n"
11194                "  x = 1;\n"
11195                "y = 1;\n",
11196                Alignment);
11197 }
11198 
11199 TEST_F(FormatTest, AlignConsecutiveDeclarations) {
11200   FormatStyle Alignment = getLLVMStyle();
11201   Alignment.AlignConsecutiveMacros = true;
11202   Alignment.AlignConsecutiveDeclarations = false;
11203   verifyFormat("float const a = 5;\n"
11204                "int oneTwoThree = 123;",
11205                Alignment);
11206   verifyFormat("int a = 5;\n"
11207                "float const oneTwoThree = 123;",
11208                Alignment);
11209 
11210   Alignment.AlignConsecutiveDeclarations = true;
11211   verifyFormat("float const a = 5;\n"
11212                "int         oneTwoThree = 123;",
11213                Alignment);
11214   verifyFormat("int         a = method();\n"
11215                "float const oneTwoThree = 133;",
11216                Alignment);
11217   verifyFormat("int i = 1, j = 10;\n"
11218                "something = 2000;",
11219                Alignment);
11220   verifyFormat("something = 2000;\n"
11221                "int i = 1, j = 10;\n",
11222                Alignment);
11223   verifyFormat("float      something = 2000;\n"
11224                "double     another = 911;\n"
11225                "int        i = 1, j = 10;\n"
11226                "const int *oneMore = 1;\n"
11227                "unsigned   i = 2;",
11228                Alignment);
11229   verifyFormat("float a = 5;\n"
11230                "int   one = 1;\n"
11231                "method();\n"
11232                "const double       oneTwoThree = 123;\n"
11233                "const unsigned int oneTwo = 12;",
11234                Alignment);
11235   verifyFormat("int      oneTwoThree{0}; // comment\n"
11236                "unsigned oneTwo;         // comment",
11237                Alignment);
11238   EXPECT_EQ("float const a = 5;\n"
11239             "\n"
11240             "int oneTwoThree = 123;",
11241             format("float const   a = 5;\n"
11242                    "\n"
11243                    "int           oneTwoThree= 123;",
11244                    Alignment));
11245   EXPECT_EQ("float a = 5;\n"
11246             "int   one = 1;\n"
11247             "\n"
11248             "unsigned oneTwoThree = 123;",
11249             format("float    a = 5;\n"
11250                    "int      one = 1;\n"
11251                    "\n"
11252                    "unsigned oneTwoThree = 123;",
11253                    Alignment));
11254   EXPECT_EQ("float a = 5;\n"
11255             "int   one = 1;\n"
11256             "\n"
11257             "unsigned oneTwoThree = 123;\n"
11258             "int      oneTwo = 12;",
11259             format("float    a = 5;\n"
11260                    "int one = 1;\n"
11261                    "\n"
11262                    "unsigned oneTwoThree = 123;\n"
11263                    "int oneTwo = 12;",
11264                    Alignment));
11265   // Function prototype alignment
11266   verifyFormat("int    a();\n"
11267                "double b();",
11268                Alignment);
11269   verifyFormat("int    a(int x);\n"
11270                "double b();",
11271                Alignment);
11272   unsigned OldColumnLimit = Alignment.ColumnLimit;
11273   // We need to set ColumnLimit to zero, in order to stress nested alignments,
11274   // otherwise the function parameters will be re-flowed onto a single line.
11275   Alignment.ColumnLimit = 0;
11276   EXPECT_EQ("int    a(int   x,\n"
11277             "         float y);\n"
11278             "double b(int    x,\n"
11279             "         double y);",
11280             format("int a(int x,\n"
11281                    " float y);\n"
11282                    "double b(int x,\n"
11283                    " double y);",
11284                    Alignment));
11285   // This ensures that function parameters of function declarations are
11286   // correctly indented when their owning functions are indented.
11287   // The failure case here is for 'double y' to not be indented enough.
11288   EXPECT_EQ("double a(int x);\n"
11289             "int    b(int    y,\n"
11290             "         double z);",
11291             format("double a(int x);\n"
11292                    "int b(int y,\n"
11293                    " double z);",
11294                    Alignment));
11295   // Set ColumnLimit low so that we induce wrapping immediately after
11296   // the function name and opening paren.
11297   Alignment.ColumnLimit = 13;
11298   verifyFormat("int function(\n"
11299                "    int  x,\n"
11300                "    bool y);",
11301                Alignment);
11302   Alignment.ColumnLimit = OldColumnLimit;
11303   // Ensure function pointers don't screw up recursive alignment
11304   verifyFormat("int    a(int x, void (*fp)(int y));\n"
11305                "double b();",
11306                Alignment);
11307   Alignment.AlignConsecutiveAssignments = true;
11308   // Ensure recursive alignment is broken by function braces, so that the
11309   // "a = 1" does not align with subsequent assignments inside the function
11310   // body.
11311   verifyFormat("int func(int a = 1) {\n"
11312                "  int b  = 2;\n"
11313                "  int cc = 3;\n"
11314                "}",
11315                Alignment);
11316   verifyFormat("float      something = 2000;\n"
11317                "double     another   = 911;\n"
11318                "int        i = 1, j = 10;\n"
11319                "const int *oneMore = 1;\n"
11320                "unsigned   i       = 2;",
11321                Alignment);
11322   verifyFormat("int      oneTwoThree = {0}; // comment\n"
11323                "unsigned oneTwo      = 0;   // comment",
11324                Alignment);
11325   // Make sure that scope is correctly tracked, in the absence of braces
11326   verifyFormat("for (int i = 0; i < n; i++)\n"
11327                "  j = i;\n"
11328                "double x = 1;\n",
11329                Alignment);
11330   verifyFormat("if (int i = 0)\n"
11331                "  j = i;\n"
11332                "double x = 1;\n",
11333                Alignment);
11334   // Ensure operator[] and operator() are comprehended
11335   verifyFormat("struct test {\n"
11336                "  long long int foo();\n"
11337                "  int           operator[](int a);\n"
11338                "  double        bar();\n"
11339                "};\n",
11340                Alignment);
11341   verifyFormat("struct test {\n"
11342                "  long long int foo();\n"
11343                "  int           operator()(int a);\n"
11344                "  double        bar();\n"
11345                "};\n",
11346                Alignment);
11347   EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
11348             "  int const i   = 1;\n"
11349             "  int *     j   = 2;\n"
11350             "  int       big = 10000;\n"
11351             "\n"
11352             "  unsigned oneTwoThree = 123;\n"
11353             "  int      oneTwo      = 12;\n"
11354             "  method();\n"
11355             "  float k  = 2;\n"
11356             "  int   ll = 10000;\n"
11357             "}",
11358             format("void SomeFunction(int parameter= 0) {\n"
11359                    " int const  i= 1;\n"
11360                    "  int *j=2;\n"
11361                    " int big  =  10000;\n"
11362                    "\n"
11363                    "unsigned oneTwoThree  =123;\n"
11364                    "int oneTwo = 12;\n"
11365                    "  method();\n"
11366                    "float k= 2;\n"
11367                    "int ll=10000;\n"
11368                    "}",
11369                    Alignment));
11370   Alignment.AlignConsecutiveAssignments = false;
11371   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
11372   verifyFormat("#define A \\\n"
11373                "  int       aaaa = 12; \\\n"
11374                "  float     b = 23; \\\n"
11375                "  const int ccc = 234; \\\n"
11376                "  unsigned  dddddddddd = 2345;",
11377                Alignment);
11378   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
11379   verifyFormat("#define A              \\\n"
11380                "  int       aaaa = 12; \\\n"
11381                "  float     b = 23;    \\\n"
11382                "  const int ccc = 234; \\\n"
11383                "  unsigned  dddddddddd = 2345;",
11384                Alignment);
11385   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
11386   Alignment.ColumnLimit = 30;
11387   verifyFormat("#define A                    \\\n"
11388                "  int       aaaa = 12;       \\\n"
11389                "  float     b = 23;          \\\n"
11390                "  const int ccc = 234;       \\\n"
11391                "  int       dddddddddd = 2345;",
11392                Alignment);
11393   Alignment.ColumnLimit = 80;
11394   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
11395                "k = 4, int l = 5,\n"
11396                "                  int m = 6) {\n"
11397                "  const int j = 10;\n"
11398                "  otherThing = 1;\n"
11399                "}",
11400                Alignment);
11401   verifyFormat("void SomeFunction(int parameter = 0) {\n"
11402                "  int const i = 1;\n"
11403                "  int *     j = 2;\n"
11404                "  int       big = 10000;\n"
11405                "}",
11406                Alignment);
11407   verifyFormat("class C {\n"
11408                "public:\n"
11409                "  int          i = 1;\n"
11410                "  virtual void f() = 0;\n"
11411                "};",
11412                Alignment);
11413   verifyFormat("float i = 1;\n"
11414                "if (SomeType t = getSomething()) {\n"
11415                "}\n"
11416                "const unsigned j = 2;\n"
11417                "int            big = 10000;",
11418                Alignment);
11419   verifyFormat("float j = 7;\n"
11420                "for (int k = 0; k < N; ++k) {\n"
11421                "}\n"
11422                "unsigned j = 2;\n"
11423                "int      big = 10000;\n"
11424                "}",
11425                Alignment);
11426   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
11427   verifyFormat("float              i = 1;\n"
11428                "LooooooooooongType loooooooooooooooooooooongVariable\n"
11429                "    = someLooooooooooooooooongFunction();\n"
11430                "int j = 2;",
11431                Alignment);
11432   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
11433   verifyFormat("int                i = 1;\n"
11434                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
11435                "    someLooooooooooooooooongFunction();\n"
11436                "int j = 2;",
11437                Alignment);
11438 
11439   Alignment.AlignConsecutiveAssignments = true;
11440   verifyFormat("auto lambda = []() {\n"
11441                "  auto  ii = 0;\n"
11442                "  float j  = 0;\n"
11443                "  return 0;\n"
11444                "};\n"
11445                "int   i  = 0;\n"
11446                "float i2 = 0;\n"
11447                "auto  v  = type{\n"
11448                "    i = 1,   //\n"
11449                "    (i = 2), //\n"
11450                "    i = 3    //\n"
11451                "};",
11452                Alignment);
11453   Alignment.AlignConsecutiveAssignments = false;
11454 
11455   verifyFormat(
11456       "int      i = 1;\n"
11457       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
11458       "                          loooooooooooooooooooooongParameterB);\n"
11459       "int      j = 2;",
11460       Alignment);
11461 
11462   // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
11463   // We expect declarations and assignments to align, as long as it doesn't
11464   // exceed the column limit, starting a new alignment sequence whenever it
11465   // happens.
11466   Alignment.AlignConsecutiveAssignments = true;
11467   Alignment.ColumnLimit = 30;
11468   verifyFormat("float    ii              = 1;\n"
11469                "unsigned j               = 2;\n"
11470                "int someVerylongVariable = 1;\n"
11471                "AnotherLongType  ll = 123456;\n"
11472                "VeryVeryLongType k  = 2;\n"
11473                "int              myvar = 1;",
11474                Alignment);
11475   Alignment.ColumnLimit = 80;
11476   Alignment.AlignConsecutiveAssignments = false;
11477 
11478   verifyFormat(
11479       "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
11480       "          typename LongType, typename B>\n"
11481       "auto foo() {}\n",
11482       Alignment);
11483   verifyFormat("float a, b = 1;\n"
11484                "int   c = 2;\n"
11485                "int   dd = 3;\n",
11486                Alignment);
11487   verifyFormat("int   aa = ((1 > 2) ? 3 : 4);\n"
11488                "float b[1][] = {{3.f}};\n",
11489                Alignment);
11490   Alignment.AlignConsecutiveAssignments = true;
11491   verifyFormat("float a, b = 1;\n"
11492                "int   c  = 2;\n"
11493                "int   dd = 3;\n",
11494                Alignment);
11495   verifyFormat("int   aa     = ((1 > 2) ? 3 : 4);\n"
11496                "float b[1][] = {{3.f}};\n",
11497                Alignment);
11498   Alignment.AlignConsecutiveAssignments = false;
11499 
11500   Alignment.ColumnLimit = 30;
11501   Alignment.BinPackParameters = false;
11502   verifyFormat("void foo(float     a,\n"
11503                "         float     b,\n"
11504                "         int       c,\n"
11505                "         uint32_t *d) {\n"
11506                "  int *  e = 0;\n"
11507                "  float  f = 0;\n"
11508                "  double g = 0;\n"
11509                "}\n"
11510                "void bar(ino_t     a,\n"
11511                "         int       b,\n"
11512                "         uint32_t *c,\n"
11513                "         bool      d) {}\n",
11514                Alignment);
11515   Alignment.BinPackParameters = true;
11516   Alignment.ColumnLimit = 80;
11517 
11518   // Bug 33507
11519   Alignment.PointerAlignment = FormatStyle::PAS_Middle;
11520   verifyFormat(
11521       "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
11522       "  static const Version verVs2017;\n"
11523       "  return true;\n"
11524       "});\n",
11525       Alignment);
11526   Alignment.PointerAlignment = FormatStyle::PAS_Right;
11527 
11528   // See llvm.org/PR35641
11529   Alignment.AlignConsecutiveDeclarations = true;
11530   verifyFormat("int func() { //\n"
11531                "  int      b;\n"
11532                "  unsigned c;\n"
11533                "}",
11534                Alignment);
11535 
11536   // See PR37175
11537   FormatStyle Style = getMozillaStyle();
11538   Style.AlignConsecutiveDeclarations = true;
11539   EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n"
11540             "foo(int a);",
11541             format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style));
11542 }
11543 
11544 TEST_F(FormatTest, LinuxBraceBreaking) {
11545   FormatStyle LinuxBraceStyle = getLLVMStyle();
11546   LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
11547   verifyFormat("namespace a\n"
11548                "{\n"
11549                "class A\n"
11550                "{\n"
11551                "  void f()\n"
11552                "  {\n"
11553                "    if (true) {\n"
11554                "      a();\n"
11555                "      b();\n"
11556                "    } else {\n"
11557                "      a();\n"
11558                "    }\n"
11559                "  }\n"
11560                "  void g() { return; }\n"
11561                "};\n"
11562                "struct B {\n"
11563                "  int x;\n"
11564                "};\n"
11565                "} // namespace a\n",
11566                LinuxBraceStyle);
11567   verifyFormat("enum X {\n"
11568                "  Y = 0,\n"
11569                "}\n",
11570                LinuxBraceStyle);
11571   verifyFormat("struct S {\n"
11572                "  int Type;\n"
11573                "  union {\n"
11574                "    int x;\n"
11575                "    double y;\n"
11576                "  } Value;\n"
11577                "  class C\n"
11578                "  {\n"
11579                "    MyFavoriteType Value;\n"
11580                "  } Class;\n"
11581                "}\n",
11582                LinuxBraceStyle);
11583 }
11584 
11585 TEST_F(FormatTest, MozillaBraceBreaking) {
11586   FormatStyle MozillaBraceStyle = getLLVMStyle();
11587   MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
11588   MozillaBraceStyle.FixNamespaceComments = false;
11589   verifyFormat("namespace a {\n"
11590                "class A\n"
11591                "{\n"
11592                "  void f()\n"
11593                "  {\n"
11594                "    if (true) {\n"
11595                "      a();\n"
11596                "      b();\n"
11597                "    }\n"
11598                "  }\n"
11599                "  void g() { return; }\n"
11600                "};\n"
11601                "enum E\n"
11602                "{\n"
11603                "  A,\n"
11604                "  // foo\n"
11605                "  B,\n"
11606                "  C\n"
11607                "};\n"
11608                "struct B\n"
11609                "{\n"
11610                "  int x;\n"
11611                "};\n"
11612                "}\n",
11613                MozillaBraceStyle);
11614   verifyFormat("struct S\n"
11615                "{\n"
11616                "  int Type;\n"
11617                "  union\n"
11618                "  {\n"
11619                "    int x;\n"
11620                "    double y;\n"
11621                "  } Value;\n"
11622                "  class C\n"
11623                "  {\n"
11624                "    MyFavoriteType Value;\n"
11625                "  } Class;\n"
11626                "}\n",
11627                MozillaBraceStyle);
11628 }
11629 
11630 TEST_F(FormatTest, StroustrupBraceBreaking) {
11631   FormatStyle StroustrupBraceStyle = getLLVMStyle();
11632   StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
11633   verifyFormat("namespace a {\n"
11634                "class A {\n"
11635                "  void f()\n"
11636                "  {\n"
11637                "    if (true) {\n"
11638                "      a();\n"
11639                "      b();\n"
11640                "    }\n"
11641                "  }\n"
11642                "  void g() { return; }\n"
11643                "};\n"
11644                "struct B {\n"
11645                "  int x;\n"
11646                "};\n"
11647                "} // namespace a\n",
11648                StroustrupBraceStyle);
11649 
11650   verifyFormat("void foo()\n"
11651                "{\n"
11652                "  if (a) {\n"
11653                "    a();\n"
11654                "  }\n"
11655                "  else {\n"
11656                "    b();\n"
11657                "  }\n"
11658                "}\n",
11659                StroustrupBraceStyle);
11660 
11661   verifyFormat("#ifdef _DEBUG\n"
11662                "int foo(int i = 0)\n"
11663                "#else\n"
11664                "int foo(int i = 5)\n"
11665                "#endif\n"
11666                "{\n"
11667                "  return i;\n"
11668                "}",
11669                StroustrupBraceStyle);
11670 
11671   verifyFormat("void foo() {}\n"
11672                "void bar()\n"
11673                "#ifdef _DEBUG\n"
11674                "{\n"
11675                "  foo();\n"
11676                "}\n"
11677                "#else\n"
11678                "{\n"
11679                "}\n"
11680                "#endif",
11681                StroustrupBraceStyle);
11682 
11683   verifyFormat("void foobar() { int i = 5; }\n"
11684                "#ifdef _DEBUG\n"
11685                "void bar() {}\n"
11686                "#else\n"
11687                "void bar() { foobar(); }\n"
11688                "#endif",
11689                StroustrupBraceStyle);
11690 }
11691 
11692 TEST_F(FormatTest, AllmanBraceBreaking) {
11693   FormatStyle AllmanBraceStyle = getLLVMStyle();
11694   AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
11695 
11696   EXPECT_EQ("namespace a\n"
11697             "{\n"
11698             "void f();\n"
11699             "void g();\n"
11700             "} // namespace a\n",
11701             format("namespace a\n"
11702                    "{\n"
11703                    "void f();\n"
11704                    "void g();\n"
11705                    "}\n",
11706                    AllmanBraceStyle));
11707 
11708   verifyFormat("namespace a\n"
11709                "{\n"
11710                "class A\n"
11711                "{\n"
11712                "  void f()\n"
11713                "  {\n"
11714                "    if (true)\n"
11715                "    {\n"
11716                "      a();\n"
11717                "      b();\n"
11718                "    }\n"
11719                "  }\n"
11720                "  void g() { return; }\n"
11721                "};\n"
11722                "struct B\n"
11723                "{\n"
11724                "  int x;\n"
11725                "};\n"
11726                "union C\n"
11727                "{\n"
11728                "};\n"
11729                "} // namespace a",
11730                AllmanBraceStyle);
11731 
11732   verifyFormat("void f()\n"
11733                "{\n"
11734                "  if (true)\n"
11735                "  {\n"
11736                "    a();\n"
11737                "  }\n"
11738                "  else if (false)\n"
11739                "  {\n"
11740                "    b();\n"
11741                "  }\n"
11742                "  else\n"
11743                "  {\n"
11744                "    c();\n"
11745                "  }\n"
11746                "}\n",
11747                AllmanBraceStyle);
11748 
11749   verifyFormat("void f()\n"
11750                "{\n"
11751                "  for (int i = 0; i < 10; ++i)\n"
11752                "  {\n"
11753                "    a();\n"
11754                "  }\n"
11755                "  while (false)\n"
11756                "  {\n"
11757                "    b();\n"
11758                "  }\n"
11759                "  do\n"
11760                "  {\n"
11761                "    c();\n"
11762                "  } while (false)\n"
11763                "}\n",
11764                AllmanBraceStyle);
11765 
11766   verifyFormat("void f(int a)\n"
11767                "{\n"
11768                "  switch (a)\n"
11769                "  {\n"
11770                "  case 0:\n"
11771                "    break;\n"
11772                "  case 1:\n"
11773                "  {\n"
11774                "    break;\n"
11775                "  }\n"
11776                "  case 2:\n"
11777                "  {\n"
11778                "  }\n"
11779                "  break;\n"
11780                "  default:\n"
11781                "    break;\n"
11782                "  }\n"
11783                "}\n",
11784                AllmanBraceStyle);
11785 
11786   verifyFormat("enum X\n"
11787                "{\n"
11788                "  Y = 0,\n"
11789                "}\n",
11790                AllmanBraceStyle);
11791   verifyFormat("enum X\n"
11792                "{\n"
11793                "  Y = 0\n"
11794                "}\n",
11795                AllmanBraceStyle);
11796 
11797   verifyFormat("@interface BSApplicationController ()\n"
11798                "{\n"
11799                "@private\n"
11800                "  id _extraIvar;\n"
11801                "}\n"
11802                "@end\n",
11803                AllmanBraceStyle);
11804 
11805   verifyFormat("#ifdef _DEBUG\n"
11806                "int foo(int i = 0)\n"
11807                "#else\n"
11808                "int foo(int i = 5)\n"
11809                "#endif\n"
11810                "{\n"
11811                "  return i;\n"
11812                "}",
11813                AllmanBraceStyle);
11814 
11815   verifyFormat("void foo() {}\n"
11816                "void bar()\n"
11817                "#ifdef _DEBUG\n"
11818                "{\n"
11819                "  foo();\n"
11820                "}\n"
11821                "#else\n"
11822                "{\n"
11823                "}\n"
11824                "#endif",
11825                AllmanBraceStyle);
11826 
11827   verifyFormat("void foobar() { int i = 5; }\n"
11828                "#ifdef _DEBUG\n"
11829                "void bar() {}\n"
11830                "#else\n"
11831                "void bar() { foobar(); }\n"
11832                "#endif",
11833                AllmanBraceStyle);
11834 
11835   // This shouldn't affect ObjC blocks..
11836   verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
11837                "  // ...\n"
11838                "  int i;\n"
11839                "}];",
11840                AllmanBraceStyle);
11841   verifyFormat("void (^block)(void) = ^{\n"
11842                "  // ...\n"
11843                "  int i;\n"
11844                "};",
11845                AllmanBraceStyle);
11846   // .. or dict literals.
11847   verifyFormat("void f()\n"
11848                "{\n"
11849                "  // ...\n"
11850                "  [object someMethod:@{@\"a\" : @\"b\"}];\n"
11851                "}",
11852                AllmanBraceStyle);
11853   verifyFormat("void f()\n"
11854                "{\n"
11855                "  // ...\n"
11856                "  [object someMethod:@{a : @\"b\"}];\n"
11857                "}",
11858                AllmanBraceStyle);
11859   verifyFormat("int f()\n"
11860                "{ // comment\n"
11861                "  return 42;\n"
11862                "}",
11863                AllmanBraceStyle);
11864 
11865   AllmanBraceStyle.ColumnLimit = 19;
11866   verifyFormat("void f() { int i; }", AllmanBraceStyle);
11867   AllmanBraceStyle.ColumnLimit = 18;
11868   verifyFormat("void f()\n"
11869                "{\n"
11870                "  int i;\n"
11871                "}",
11872                AllmanBraceStyle);
11873   AllmanBraceStyle.ColumnLimit = 80;
11874 
11875   FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
11876   BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine =
11877       FormatStyle::SIS_WithoutElse;
11878   BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
11879   verifyFormat("void f(bool b)\n"
11880                "{\n"
11881                "  if (b)\n"
11882                "  {\n"
11883                "    return;\n"
11884                "  }\n"
11885                "}\n",
11886                BreakBeforeBraceShortIfs);
11887   verifyFormat("void f(bool b)\n"
11888                "{\n"
11889                "  if constexpr (b)\n"
11890                "  {\n"
11891                "    return;\n"
11892                "  }\n"
11893                "}\n",
11894                BreakBeforeBraceShortIfs);
11895   verifyFormat("void f(bool b)\n"
11896                "{\n"
11897                "  if CONSTEXPR (b)\n"
11898                "  {\n"
11899                "    return;\n"
11900                "  }\n"
11901                "}\n",
11902                BreakBeforeBraceShortIfs);
11903   verifyFormat("void f(bool b)\n"
11904                "{\n"
11905                "  if (b) return;\n"
11906                "}\n",
11907                BreakBeforeBraceShortIfs);
11908   verifyFormat("void f(bool b)\n"
11909                "{\n"
11910                "  if constexpr (b) return;\n"
11911                "}\n",
11912                BreakBeforeBraceShortIfs);
11913   verifyFormat("void f(bool b)\n"
11914                "{\n"
11915                "  if CONSTEXPR (b) return;\n"
11916                "}\n",
11917                BreakBeforeBraceShortIfs);
11918   verifyFormat("void f(bool b)\n"
11919                "{\n"
11920                "  while (b)\n"
11921                "  {\n"
11922                "    return;\n"
11923                "  }\n"
11924                "}\n",
11925                BreakBeforeBraceShortIfs);
11926 }
11927 
11928 TEST_F(FormatTest, WhitesmithsBraceBreaking) {
11929   FormatStyle WhitesmithsBraceStyle = getLLVMStyle();
11930   WhitesmithsBraceStyle.BreakBeforeBraces = FormatStyle::BS_Whitesmiths;
11931 
11932   // Make a few changes to the style for testing purposes
11933   WhitesmithsBraceStyle.AllowShortFunctionsOnASingleLine =
11934       FormatStyle::SFS_Empty;
11935   WhitesmithsBraceStyle.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None;
11936   WhitesmithsBraceStyle.ColumnLimit = 0;
11937 
11938   // FIXME: this test case can't decide whether there should be a blank line
11939   // after the ~D() line or not. It adds one if one doesn't exist in the test
11940   // and it removes the line if one exists.
11941   /*
11942   verifyFormat("class A;\n"
11943                "namespace B\n"
11944                "  {\n"
11945                "class C;\n"
11946                "// Comment\n"
11947                "class D\n"
11948                "  {\n"
11949                "public:\n"
11950                "  D();\n"
11951                "  ~D() {}\n"
11952                "private:\n"
11953                "  enum E\n"
11954                "    {\n"
11955                "    F\n"
11956                "    }\n"
11957                "  };\n"
11958                "  } // namespace B\n",
11959                WhitesmithsBraceStyle);
11960   */
11961 
11962   verifyFormat("namespace a\n"
11963                "  {\n"
11964                "class A\n"
11965                "  {\n"
11966                "  void f()\n"
11967                "    {\n"
11968                "    if (true)\n"
11969                "      {\n"
11970                "      a();\n"
11971                "      b();\n"
11972                "      }\n"
11973                "    }\n"
11974                "  void g()\n"
11975                "    {\n"
11976                "    return;\n"
11977                "    }\n"
11978                "  };\n"
11979                "struct B\n"
11980                "  {\n"
11981                "  int x;\n"
11982                "  };\n"
11983                "  } // namespace a",
11984                WhitesmithsBraceStyle);
11985 
11986   verifyFormat("void f()\n"
11987                "  {\n"
11988                "  if (true)\n"
11989                "    {\n"
11990                "    a();\n"
11991                "    }\n"
11992                "  else if (false)\n"
11993                "    {\n"
11994                "    b();\n"
11995                "    }\n"
11996                "  else\n"
11997                "    {\n"
11998                "    c();\n"
11999                "    }\n"
12000                "  }\n",
12001                WhitesmithsBraceStyle);
12002 
12003   verifyFormat("void f()\n"
12004                "  {\n"
12005                "  for (int i = 0; i < 10; ++i)\n"
12006                "    {\n"
12007                "    a();\n"
12008                "    }\n"
12009                "  while (false)\n"
12010                "    {\n"
12011                "    b();\n"
12012                "    }\n"
12013                "  do\n"
12014                "    {\n"
12015                "    c();\n"
12016                "    } while (false)\n"
12017                "  }\n",
12018                WhitesmithsBraceStyle);
12019 
12020   // FIXME: the block and the break under case 2 in this test don't get indented
12021   // correctly
12022   /*
12023   verifyFormat("void switchTest1(int a)\n"
12024                "  {\n"
12025                "  switch (a)\n"
12026                "    {\n"
12027                "    case 2:\n"
12028                "      {\n"
12029                "      }\n"
12030                "      break;\n"
12031                "    }\n"
12032                "  }\n",
12033                WhitesmithsBraceStyle);
12034   */
12035 
12036   // FIXME: the block and the break under case 2 in this test don't get indented
12037   // correctly
12038   /*
12039   verifyFormat("void switchTest2(int a)\n"
12040                "  {\n"
12041                "  switch (a)\n"
12042                "    {\n"
12043                "  case 0:\n"
12044                "    break;\n"
12045                "  case 1:\n"
12046                "    {\n"
12047                "    break;\n"
12048                "    }\n"
12049                "  case 2:\n"
12050                "    {\n"
12051                "    }\n"
12052                "    break;\n"
12053                "  default:\n"
12054                "    break;\n"
12055                "    }\n"
12056                "  }\n",
12057                WhitesmithsBraceStyle);
12058   */
12059 
12060   verifyFormat("enum X\n"
12061                "  {\n"
12062                "  Y = 0, // testing\n"
12063                "  }\n",
12064                WhitesmithsBraceStyle);
12065 
12066   verifyFormat("enum X\n"
12067                "  {\n"
12068                "  Y = 0\n"
12069                "  }\n",
12070                WhitesmithsBraceStyle);
12071   verifyFormat("enum X\n"
12072                "  {\n"
12073                "  Y = 0,\n"
12074                "  Z = 1\n"
12075                "  };\n",
12076                WhitesmithsBraceStyle);
12077 
12078   verifyFormat("@interface BSApplicationController ()\n"
12079                "  {\n"
12080                "@private\n"
12081                "  id _extraIvar;\n"
12082                "  }\n"
12083                "@end\n",
12084                WhitesmithsBraceStyle);
12085 
12086   verifyFormat("#ifdef _DEBUG\n"
12087                "int foo(int i = 0)\n"
12088                "#else\n"
12089                "int foo(int i = 5)\n"
12090                "#endif\n"
12091                "  {\n"
12092                "  return i;\n"
12093                "  }",
12094                WhitesmithsBraceStyle);
12095 
12096   verifyFormat("void foo() {}\n"
12097                "void bar()\n"
12098                "#ifdef _DEBUG\n"
12099                "  {\n"
12100                "  foo();\n"
12101                "  }\n"
12102                "#else\n"
12103                "  {\n"
12104                "  }\n"
12105                "#endif",
12106                WhitesmithsBraceStyle);
12107 
12108   verifyFormat("void foobar()\n"
12109                "  {\n"
12110                "  int i = 5;\n"
12111                "  }\n"
12112                "#ifdef _DEBUG\n"
12113                "void bar()\n"
12114                "  {\n"
12115                "  }\n"
12116                "#else\n"
12117                "void bar()\n"
12118                "  {\n"
12119                "  foobar();\n"
12120                "  }\n"
12121                "#endif",
12122                WhitesmithsBraceStyle);
12123 
12124   // This shouldn't affect ObjC blocks..
12125   verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
12126                "  // ...\n"
12127                "  int i;\n"
12128                "}];",
12129                WhitesmithsBraceStyle);
12130   verifyFormat("void (^block)(void) = ^{\n"
12131                "  // ...\n"
12132                "  int i;\n"
12133                "};",
12134                WhitesmithsBraceStyle);
12135   // .. or dict literals.
12136   verifyFormat("void f()\n"
12137                "  {\n"
12138                "  [object someMethod:@{@\"a\" : @\"b\"}];\n"
12139                "  }",
12140                WhitesmithsBraceStyle);
12141 
12142   verifyFormat("int f()\n"
12143                "  { // comment\n"
12144                "  return 42;\n"
12145                "  }",
12146                WhitesmithsBraceStyle);
12147 
12148   FormatStyle BreakBeforeBraceShortIfs = WhitesmithsBraceStyle;
12149   BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine =
12150       FormatStyle::SIS_Always;
12151   BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
12152   verifyFormat("void f(bool b)\n"
12153                "  {\n"
12154                "  if (b)\n"
12155                "    {\n"
12156                "    return;\n"
12157                "    }\n"
12158                "  }\n",
12159                BreakBeforeBraceShortIfs);
12160   verifyFormat("void f(bool b)\n"
12161                "  {\n"
12162                "  if (b) return;\n"
12163                "  }\n",
12164                BreakBeforeBraceShortIfs);
12165   verifyFormat("void f(bool b)\n"
12166                "  {\n"
12167                "  while (b)\n"
12168                "    {\n"
12169                "    return;\n"
12170                "    }\n"
12171                "  }\n",
12172                BreakBeforeBraceShortIfs);
12173 }
12174 
12175 TEST_F(FormatTest, GNUBraceBreaking) {
12176   FormatStyle GNUBraceStyle = getLLVMStyle();
12177   GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
12178   verifyFormat("namespace a\n"
12179                "{\n"
12180                "class A\n"
12181                "{\n"
12182                "  void f()\n"
12183                "  {\n"
12184                "    int a;\n"
12185                "    {\n"
12186                "      int b;\n"
12187                "    }\n"
12188                "    if (true)\n"
12189                "      {\n"
12190                "        a();\n"
12191                "        b();\n"
12192                "      }\n"
12193                "  }\n"
12194                "  void g() { return; }\n"
12195                "}\n"
12196                "} // namespace a",
12197                GNUBraceStyle);
12198 
12199   verifyFormat("void f()\n"
12200                "{\n"
12201                "  if (true)\n"
12202                "    {\n"
12203                "      a();\n"
12204                "    }\n"
12205                "  else if (false)\n"
12206                "    {\n"
12207                "      b();\n"
12208                "    }\n"
12209                "  else\n"
12210                "    {\n"
12211                "      c();\n"
12212                "    }\n"
12213                "}\n",
12214                GNUBraceStyle);
12215 
12216   verifyFormat("void f()\n"
12217                "{\n"
12218                "  for (int i = 0; i < 10; ++i)\n"
12219                "    {\n"
12220                "      a();\n"
12221                "    }\n"
12222                "  while (false)\n"
12223                "    {\n"
12224                "      b();\n"
12225                "    }\n"
12226                "  do\n"
12227                "    {\n"
12228                "      c();\n"
12229                "    }\n"
12230                "  while (false);\n"
12231                "}\n",
12232                GNUBraceStyle);
12233 
12234   verifyFormat("void f(int a)\n"
12235                "{\n"
12236                "  switch (a)\n"
12237                "    {\n"
12238                "    case 0:\n"
12239                "      break;\n"
12240                "    case 1:\n"
12241                "      {\n"
12242                "        break;\n"
12243                "      }\n"
12244                "    case 2:\n"
12245                "      {\n"
12246                "      }\n"
12247                "      break;\n"
12248                "    default:\n"
12249                "      break;\n"
12250                "    }\n"
12251                "}\n",
12252                GNUBraceStyle);
12253 
12254   verifyFormat("enum X\n"
12255                "{\n"
12256                "  Y = 0,\n"
12257                "}\n",
12258                GNUBraceStyle);
12259 
12260   verifyFormat("@interface BSApplicationController ()\n"
12261                "{\n"
12262                "@private\n"
12263                "  id _extraIvar;\n"
12264                "}\n"
12265                "@end\n",
12266                GNUBraceStyle);
12267 
12268   verifyFormat("#ifdef _DEBUG\n"
12269                "int foo(int i = 0)\n"
12270                "#else\n"
12271                "int foo(int i = 5)\n"
12272                "#endif\n"
12273                "{\n"
12274                "  return i;\n"
12275                "}",
12276                GNUBraceStyle);
12277 
12278   verifyFormat("void foo() {}\n"
12279                "void bar()\n"
12280                "#ifdef _DEBUG\n"
12281                "{\n"
12282                "  foo();\n"
12283                "}\n"
12284                "#else\n"
12285                "{\n"
12286                "}\n"
12287                "#endif",
12288                GNUBraceStyle);
12289 
12290   verifyFormat("void foobar() { int i = 5; }\n"
12291                "#ifdef _DEBUG\n"
12292                "void bar() {}\n"
12293                "#else\n"
12294                "void bar() { foobar(); }\n"
12295                "#endif",
12296                GNUBraceStyle);
12297 }
12298 
12299 TEST_F(FormatTest, WebKitBraceBreaking) {
12300   FormatStyle WebKitBraceStyle = getLLVMStyle();
12301   WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
12302   WebKitBraceStyle.FixNamespaceComments = false;
12303   verifyFormat("namespace a {\n"
12304                "class A {\n"
12305                "  void f()\n"
12306                "  {\n"
12307                "    if (true) {\n"
12308                "      a();\n"
12309                "      b();\n"
12310                "    }\n"
12311                "  }\n"
12312                "  void g() { return; }\n"
12313                "};\n"
12314                "enum E {\n"
12315                "  A,\n"
12316                "  // foo\n"
12317                "  B,\n"
12318                "  C\n"
12319                "};\n"
12320                "struct B {\n"
12321                "  int x;\n"
12322                "};\n"
12323                "}\n",
12324                WebKitBraceStyle);
12325   verifyFormat("struct S {\n"
12326                "  int Type;\n"
12327                "  union {\n"
12328                "    int x;\n"
12329                "    double y;\n"
12330                "  } Value;\n"
12331                "  class C {\n"
12332                "    MyFavoriteType Value;\n"
12333                "  } Class;\n"
12334                "};\n",
12335                WebKitBraceStyle);
12336 }
12337 
12338 TEST_F(FormatTest, CatchExceptionReferenceBinding) {
12339   verifyFormat("void f() {\n"
12340                "  try {\n"
12341                "  } catch (const Exception &e) {\n"
12342                "  }\n"
12343                "}\n",
12344                getLLVMStyle());
12345 }
12346 
12347 TEST_F(FormatTest, UnderstandsPragmas) {
12348   verifyFormat("#pragma omp reduction(| : var)");
12349   verifyFormat("#pragma omp reduction(+ : var)");
12350 
12351   EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
12352             "(including parentheses).",
12353             format("#pragma    mark   Any non-hyphenated or hyphenated string "
12354                    "(including parentheses)."));
12355 }
12356 
12357 TEST_F(FormatTest, UnderstandPragmaOption) {
12358   verifyFormat("#pragma option -C -A");
12359 
12360   EXPECT_EQ("#pragma option -C -A", format("#pragma    option   -C   -A"));
12361 }
12362 
12363 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
12364   FormatStyle Style = getLLVMStyle();
12365   Style.ColumnLimit = 20;
12366 
12367   // See PR41213
12368   EXPECT_EQ("/*\n"
12369             " *\t9012345\n"
12370             " * /8901\n"
12371             " */",
12372             format("/*\n"
12373                    " *\t9012345 /8901\n"
12374                    " */",
12375                    Style));
12376   EXPECT_EQ("/*\n"
12377             " *345678\n"
12378             " *\t/8901\n"
12379             " */",
12380             format("/*\n"
12381                    " *345678\t/8901\n"
12382                    " */",
12383                    Style));
12384 
12385   verifyFormat("int a; // the\n"
12386                "       // comment",
12387                Style);
12388   EXPECT_EQ("int a; /* first line\n"
12389             "        * second\n"
12390             "        * line third\n"
12391             "        * line\n"
12392             "        */",
12393             format("int a; /* first line\n"
12394                    "        * second\n"
12395                    "        * line third\n"
12396                    "        * line\n"
12397                    "        */",
12398                    Style));
12399   EXPECT_EQ("int a; // first line\n"
12400             "       // second\n"
12401             "       // line third\n"
12402             "       // line",
12403             format("int a; // first line\n"
12404                    "       // second line\n"
12405                    "       // third line",
12406                    Style));
12407 
12408   Style.PenaltyExcessCharacter = 90;
12409   verifyFormat("int a; // the comment", Style);
12410   EXPECT_EQ("int a; // the comment\n"
12411             "       // aaa",
12412             format("int a; // the comment aaa", Style));
12413   EXPECT_EQ("int a; /* first line\n"
12414             "        * second line\n"
12415             "        * third line\n"
12416             "        */",
12417             format("int a; /* first line\n"
12418                    "        * second line\n"
12419                    "        * third line\n"
12420                    "        */",
12421                    Style));
12422   EXPECT_EQ("int a; // first line\n"
12423             "       // second line\n"
12424             "       // third line",
12425             format("int a; // first line\n"
12426                    "       // second line\n"
12427                    "       // third line",
12428                    Style));
12429   // FIXME: Investigate why this is not getting the same layout as the test
12430   // above.
12431   EXPECT_EQ("int a; /* first line\n"
12432             "        * second line\n"
12433             "        * third line\n"
12434             "        */",
12435             format("int a; /* first line second line third line"
12436                    "\n*/",
12437                    Style));
12438 
12439   EXPECT_EQ("// foo bar baz bazfoo\n"
12440             "// foo bar foo bar\n",
12441             format("// foo bar baz bazfoo\n"
12442                    "// foo bar foo           bar\n",
12443                    Style));
12444   EXPECT_EQ("// foo bar baz bazfoo\n"
12445             "// foo bar foo bar\n",
12446             format("// foo bar baz      bazfoo\n"
12447                    "// foo            bar foo bar\n",
12448                    Style));
12449 
12450   // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
12451   // next one.
12452   EXPECT_EQ("// foo bar baz bazfoo\n"
12453             "// bar foo bar\n",
12454             format("// foo bar baz      bazfoo bar\n"
12455                    "// foo            bar\n",
12456                    Style));
12457 
12458   EXPECT_EQ("// foo bar baz bazfoo\n"
12459             "// foo bar baz bazfoo\n"
12460             "// bar foo bar\n",
12461             format("// foo bar baz      bazfoo\n"
12462                    "// foo bar baz      bazfoo bar\n"
12463                    "// foo bar\n",
12464                    Style));
12465 
12466   EXPECT_EQ("// foo bar baz bazfoo\n"
12467             "// foo bar baz bazfoo\n"
12468             "// bar foo bar\n",
12469             format("// foo bar baz      bazfoo\n"
12470                    "// foo bar baz      bazfoo bar\n"
12471                    "// foo           bar\n",
12472                    Style));
12473 
12474   // Make sure we do not keep protruding characters if strict mode reflow is
12475   // cheaper than keeping protruding characters.
12476   Style.ColumnLimit = 21;
12477   EXPECT_EQ(
12478       "// foo foo foo foo\n"
12479       "// foo foo foo foo\n"
12480       "// foo foo foo foo\n",
12481       format("// foo foo foo foo foo foo foo foo foo foo foo foo\n", Style));
12482 
12483   EXPECT_EQ("int a = /* long block\n"
12484             "           comment */\n"
12485             "    42;",
12486             format("int a = /* long block comment */ 42;", Style));
12487 }
12488 
12489 #define EXPECT_ALL_STYLES_EQUAL(Styles)                                        \
12490   for (size_t i = 1; i < Styles.size(); ++i)                                   \
12491   EXPECT_EQ(Styles[0], Styles[i])                                              \
12492       << "Style #" << i << " of " << Styles.size() << " differs from Style #0"
12493 
12494 TEST_F(FormatTest, GetsPredefinedStyleByName) {
12495   SmallVector<FormatStyle, 3> Styles;
12496   Styles.resize(3);
12497 
12498   Styles[0] = getLLVMStyle();
12499   EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
12500   EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
12501   EXPECT_ALL_STYLES_EQUAL(Styles);
12502 
12503   Styles[0] = getGoogleStyle();
12504   EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
12505   EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
12506   EXPECT_ALL_STYLES_EQUAL(Styles);
12507 
12508   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
12509   EXPECT_TRUE(
12510       getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
12511   EXPECT_TRUE(
12512       getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
12513   EXPECT_ALL_STYLES_EQUAL(Styles);
12514 
12515   Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
12516   EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
12517   EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
12518   EXPECT_ALL_STYLES_EQUAL(Styles);
12519 
12520   Styles[0] = getMozillaStyle();
12521   EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
12522   EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
12523   EXPECT_ALL_STYLES_EQUAL(Styles);
12524 
12525   Styles[0] = getWebKitStyle();
12526   EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
12527   EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
12528   EXPECT_ALL_STYLES_EQUAL(Styles);
12529 
12530   Styles[0] = getGNUStyle();
12531   EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
12532   EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
12533   EXPECT_ALL_STYLES_EQUAL(Styles);
12534 
12535   EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
12536 }
12537 
12538 TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
12539   SmallVector<FormatStyle, 8> Styles;
12540   Styles.resize(2);
12541 
12542   Styles[0] = getGoogleStyle();
12543   Styles[1] = getLLVMStyle();
12544   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
12545   EXPECT_ALL_STYLES_EQUAL(Styles);
12546 
12547   Styles.resize(5);
12548   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
12549   Styles[1] = getLLVMStyle();
12550   Styles[1].Language = FormatStyle::LK_JavaScript;
12551   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
12552 
12553   Styles[2] = getLLVMStyle();
12554   Styles[2].Language = FormatStyle::LK_JavaScript;
12555   EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
12556                                   "BasedOnStyle: Google",
12557                                   &Styles[2])
12558                    .value());
12559 
12560   Styles[3] = getLLVMStyle();
12561   Styles[3].Language = FormatStyle::LK_JavaScript;
12562   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
12563                                   "Language: JavaScript",
12564                                   &Styles[3])
12565                    .value());
12566 
12567   Styles[4] = getLLVMStyle();
12568   Styles[4].Language = FormatStyle::LK_JavaScript;
12569   EXPECT_EQ(0, parseConfiguration("---\n"
12570                                   "BasedOnStyle: LLVM\n"
12571                                   "IndentWidth: 123\n"
12572                                   "---\n"
12573                                   "BasedOnStyle: Google\n"
12574                                   "Language: JavaScript",
12575                                   &Styles[4])
12576                    .value());
12577   EXPECT_ALL_STYLES_EQUAL(Styles);
12578 }
12579 
12580 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME)                             \
12581   Style.FIELD = false;                                                         \
12582   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value());      \
12583   EXPECT_TRUE(Style.FIELD);                                                    \
12584   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value());     \
12585   EXPECT_FALSE(Style.FIELD);
12586 
12587 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
12588 
12589 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME)              \
12590   Style.STRUCT.FIELD = false;                                                  \
12591   EXPECT_EQ(0,                                                                 \
12592             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": true", &Style)   \
12593                 .value());                                                     \
12594   EXPECT_TRUE(Style.STRUCT.FIELD);                                             \
12595   EXPECT_EQ(0,                                                                 \
12596             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": false", &Style)  \
12597                 .value());                                                     \
12598   EXPECT_FALSE(Style.STRUCT.FIELD);
12599 
12600 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD)                                 \
12601   CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
12602 
12603 #define CHECK_PARSE(TEXT, FIELD, VALUE)                                        \
12604   EXPECT_NE(VALUE, Style.FIELD);                                               \
12605   EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value());                      \
12606   EXPECT_EQ(VALUE, Style.FIELD)
12607 
12608 TEST_F(FormatTest, ParsesConfigurationBools) {
12609   FormatStyle Style = {};
12610   Style.Language = FormatStyle::LK_Cpp;
12611   CHECK_PARSE_BOOL(AlignOperands);
12612   CHECK_PARSE_BOOL(AlignTrailingComments);
12613   CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
12614   CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
12615   CHECK_PARSE_BOOL(AlignConsecutiveMacros);
12616   CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine);
12617   CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine);
12618   CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
12619   CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
12620   CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
12621   CHECK_PARSE_BOOL(BinPackArguments);
12622   CHECK_PARSE_BOOL(BinPackParameters);
12623   CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
12624   CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
12625   CHECK_PARSE_BOOL(BreakStringLiterals);
12626   CHECK_PARSE_BOOL(CompactNamespaces);
12627   CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
12628   CHECK_PARSE_BOOL(DeriveLineEnding);
12629   CHECK_PARSE_BOOL(DerivePointerAlignment);
12630   CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
12631   CHECK_PARSE_BOOL(DisableFormat);
12632   CHECK_PARSE_BOOL(IndentCaseLabels);
12633   CHECK_PARSE_BOOL(IndentCaseBlocks);
12634   CHECK_PARSE_BOOL(IndentGotoLabels);
12635   CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
12636   CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
12637   CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
12638   CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
12639   CHECK_PARSE_BOOL(Cpp11BracedListStyle);
12640   CHECK_PARSE_BOOL(ReflowComments);
12641   CHECK_PARSE_BOOL(SortIncludes);
12642   CHECK_PARSE_BOOL(SortUsingDeclarations);
12643   CHECK_PARSE_BOOL(SpacesInParentheses);
12644   CHECK_PARSE_BOOL(SpacesInSquareBrackets);
12645   CHECK_PARSE_BOOL(SpacesInAngles);
12646   CHECK_PARSE_BOOL(SpacesInConditionalStatement);
12647   CHECK_PARSE_BOOL(SpaceInEmptyBlock);
12648   CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
12649   CHECK_PARSE_BOOL(SpacesInContainerLiterals);
12650   CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
12651   CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
12652   CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
12653   CHECK_PARSE_BOOL(SpaceAfterLogicalNot);
12654   CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
12655   CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList);
12656   CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon);
12657   CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon);
12658   CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon);
12659   CHECK_PARSE_BOOL(SpaceBeforeSquareBrackets);
12660   CHECK_PARSE_BOOL(UseCRLF);
12661 
12662   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel);
12663   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
12664   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
12665   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
12666   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
12667   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
12668   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
12669   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
12670   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
12671   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
12672   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
12673   CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
12674   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
12675   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
12676   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
12677 }
12678 
12679 #undef CHECK_PARSE_BOOL
12680 
12681 TEST_F(FormatTest, ParsesConfiguration) {
12682   FormatStyle Style = {};
12683   Style.Language = FormatStyle::LK_Cpp;
12684   CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
12685   CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
12686               ConstructorInitializerIndentWidth, 1234u);
12687   CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
12688   CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
12689   CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
12690   CHECK_PARSE("PenaltyBreakAssignment: 1234", PenaltyBreakAssignment, 1234u);
12691   CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
12692               PenaltyBreakBeforeFirstCallParameter, 1234u);
12693   CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234",
12694               PenaltyBreakTemplateDeclaration, 1234u);
12695   CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
12696   CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
12697               PenaltyReturnTypeOnItsOwnLine, 1234u);
12698   CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
12699               SpacesBeforeTrailingComments, 1234u);
12700   CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
12701   CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
12702   CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
12703 
12704   Style.PointerAlignment = FormatStyle::PAS_Middle;
12705   CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
12706               FormatStyle::PAS_Left);
12707   CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
12708               FormatStyle::PAS_Right);
12709   CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
12710               FormatStyle::PAS_Middle);
12711   // For backward compatibility:
12712   CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
12713               FormatStyle::PAS_Left);
12714   CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
12715               FormatStyle::PAS_Right);
12716   CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
12717               FormatStyle::PAS_Middle);
12718 
12719   Style.Standard = FormatStyle::LS_Auto;
12720   CHECK_PARSE("Standard: c++03", Standard, FormatStyle::LS_Cpp03);
12721   CHECK_PARSE("Standard: c++11", Standard, FormatStyle::LS_Cpp11);
12722   CHECK_PARSE("Standard: c++14", Standard, FormatStyle::LS_Cpp14);
12723   CHECK_PARSE("Standard: c++17", Standard, FormatStyle::LS_Cpp17);
12724   CHECK_PARSE("Standard: c++20", Standard, FormatStyle::LS_Cpp20);
12725   CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
12726   CHECK_PARSE("Standard: Latest", Standard, FormatStyle::LS_Latest);
12727   // Legacy aliases:
12728   CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
12729   CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Latest);
12730   CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
12731   CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
12732 
12733   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
12734   CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
12735               BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
12736   CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
12737               FormatStyle::BOS_None);
12738   CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
12739               FormatStyle::BOS_All);
12740   // For backward compatibility:
12741   CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
12742               FormatStyle::BOS_None);
12743   CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
12744               FormatStyle::BOS_All);
12745 
12746   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
12747   CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
12748               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
12749   CHECK_PARSE("BreakConstructorInitializers: AfterColon",
12750               BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
12751   CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
12752               BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
12753   // For backward compatibility:
12754   CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
12755               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
12756 
12757   Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
12758   CHECK_PARSE("BreakInheritanceList: BeforeComma", BreakInheritanceList,
12759               FormatStyle::BILS_BeforeComma);
12760   CHECK_PARSE("BreakInheritanceList: AfterColon", BreakInheritanceList,
12761               FormatStyle::BILS_AfterColon);
12762   CHECK_PARSE("BreakInheritanceList: BeforeColon", BreakInheritanceList,
12763               FormatStyle::BILS_BeforeColon);
12764   // For backward compatibility:
12765   CHECK_PARSE("BreakBeforeInheritanceComma: true", BreakInheritanceList,
12766               FormatStyle::BILS_BeforeComma);
12767 
12768   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
12769   CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
12770               FormatStyle::BAS_Align);
12771   CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
12772               FormatStyle::BAS_DontAlign);
12773   CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
12774               FormatStyle::BAS_AlwaysBreak);
12775   // For backward compatibility:
12776   CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
12777               FormatStyle::BAS_DontAlign);
12778   CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
12779               FormatStyle::BAS_Align);
12780 
12781   Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
12782   CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
12783               FormatStyle::ENAS_DontAlign);
12784   CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
12785               FormatStyle::ENAS_Left);
12786   CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
12787               FormatStyle::ENAS_Right);
12788   // For backward compatibility:
12789   CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
12790               FormatStyle::ENAS_Left);
12791   CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
12792               FormatStyle::ENAS_Right);
12793 
12794   Style.UseTab = FormatStyle::UT_ForIndentation;
12795   CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
12796   CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
12797   CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
12798   CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
12799               FormatStyle::UT_ForContinuationAndIndentation);
12800   // For backward compatibility:
12801   CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
12802   CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
12803 
12804   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty;
12805   CHECK_PARSE("AllowShortBlocksOnASingleLine: Never",
12806               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never);
12807   CHECK_PARSE("AllowShortBlocksOnASingleLine: Empty",
12808               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Empty);
12809   CHECK_PARSE("AllowShortBlocksOnASingleLine: Always",
12810               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always);
12811   // For backward compatibility:
12812   CHECK_PARSE("AllowShortBlocksOnASingleLine: false",
12813               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never);
12814   CHECK_PARSE("AllowShortBlocksOnASingleLine: true",
12815               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always);
12816 
12817   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
12818   CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
12819               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
12820   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
12821               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
12822   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
12823               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
12824   CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
12825               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
12826   // For backward compatibility:
12827   CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
12828               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
12829   CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
12830               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
12831 
12832   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
12833   CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
12834               FormatStyle::SBPO_Never);
12835   CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
12836               FormatStyle::SBPO_Always);
12837   CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
12838               FormatStyle::SBPO_ControlStatements);
12839   CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens,
12840               FormatStyle::SBPO_NonEmptyParentheses);
12841   // For backward compatibility:
12842   CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
12843               FormatStyle::SBPO_Never);
12844   CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
12845               FormatStyle::SBPO_ControlStatements);
12846 
12847   Style.ColumnLimit = 123;
12848   FormatStyle BaseStyle = getLLVMStyle();
12849   CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
12850   CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
12851 
12852   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
12853   CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
12854               FormatStyle::BS_Attach);
12855   CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
12856               FormatStyle::BS_Linux);
12857   CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
12858               FormatStyle::BS_Mozilla);
12859   CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
12860               FormatStyle::BS_Stroustrup);
12861   CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
12862               FormatStyle::BS_Allman);
12863   CHECK_PARSE("BreakBeforeBraces: Whitesmiths", BreakBeforeBraces,
12864               FormatStyle::BS_Whitesmiths);
12865   CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
12866   CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
12867               FormatStyle::BS_WebKit);
12868   CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
12869               FormatStyle::BS_Custom);
12870 
12871   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Never;
12872   CHECK_PARSE("BraceWrapping:\n"
12873               "  AfterControlStatement: MultiLine",
12874               BraceWrapping.AfterControlStatement,
12875               FormatStyle::BWACS_MultiLine);
12876   CHECK_PARSE("BraceWrapping:\n"
12877               "  AfterControlStatement: Always",
12878               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always);
12879   CHECK_PARSE("BraceWrapping:\n"
12880               "  AfterControlStatement: Never",
12881               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never);
12882   // For backward compatibility:
12883   CHECK_PARSE("BraceWrapping:\n"
12884               "  AfterControlStatement: true",
12885               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always);
12886   CHECK_PARSE("BraceWrapping:\n"
12887               "  AfterControlStatement: false",
12888               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never);
12889 
12890   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
12891   CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
12892               FormatStyle::RTBS_None);
12893   CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
12894               FormatStyle::RTBS_All);
12895   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
12896               AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
12897   CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
12898               AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
12899   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
12900               AlwaysBreakAfterReturnType,
12901               FormatStyle::RTBS_TopLevelDefinitions);
12902 
12903   Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
12904   CHECK_PARSE("AlwaysBreakTemplateDeclarations: No",
12905               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_No);
12906   CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine",
12907               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine);
12908   CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes",
12909               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes);
12910   CHECK_PARSE("AlwaysBreakTemplateDeclarations: false",
12911               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine);
12912   CHECK_PARSE("AlwaysBreakTemplateDeclarations: true",
12913               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes);
12914 
12915   Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
12916   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
12917               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
12918   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
12919               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
12920   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
12921               AlwaysBreakAfterDefinitionReturnType,
12922               FormatStyle::DRTBS_TopLevel);
12923 
12924   Style.NamespaceIndentation = FormatStyle::NI_All;
12925   CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
12926               FormatStyle::NI_None);
12927   CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
12928               FormatStyle::NI_Inner);
12929   CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
12930               FormatStyle::NI_All);
12931 
12932   Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always;
12933   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never",
12934               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
12935   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse",
12936               AllowShortIfStatementsOnASingleLine,
12937               FormatStyle::SIS_WithoutElse);
12938   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always",
12939               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always);
12940   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false",
12941               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
12942   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true",
12943               AllowShortIfStatementsOnASingleLine,
12944               FormatStyle::SIS_WithoutElse);
12945 
12946   // FIXME: This is required because parsing a configuration simply overwrites
12947   // the first N elements of the list instead of resetting it.
12948   Style.ForEachMacros.clear();
12949   std::vector<std::string> BoostForeach;
12950   BoostForeach.push_back("BOOST_FOREACH");
12951   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
12952   std::vector<std::string> BoostAndQForeach;
12953   BoostAndQForeach.push_back("BOOST_FOREACH");
12954   BoostAndQForeach.push_back("Q_FOREACH");
12955   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
12956               BoostAndQForeach);
12957 
12958   Style.StatementMacros.clear();
12959   CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros,
12960               std::vector<std::string>{"QUNUSED"});
12961   CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros,
12962               std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"}));
12963 
12964   Style.NamespaceMacros.clear();
12965   CHECK_PARSE("NamespaceMacros: [TESTSUITE]", NamespaceMacros,
12966               std::vector<std::string>{"TESTSUITE"});
12967   CHECK_PARSE("NamespaceMacros: [TESTSUITE, SUITE]", NamespaceMacros,
12968               std::vector<std::string>({"TESTSUITE", "SUITE"}));
12969 
12970   Style.IncludeStyle.IncludeCategories.clear();
12971   std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = {
12972       {"abc/.*", 2, 0}, {".*", 1, 0}};
12973   CHECK_PARSE("IncludeCategories:\n"
12974               "  - Regex: abc/.*\n"
12975               "    Priority: 2\n"
12976               "  - Regex: .*\n"
12977               "    Priority: 1",
12978               IncludeStyle.IncludeCategories, ExpectedCategories);
12979   CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex,
12980               "abc$");
12981   CHECK_PARSE("IncludeIsMainSourceRegex: 'abc$'",
12982               IncludeStyle.IncludeIsMainSourceRegex, "abc$");
12983 
12984   Style.RawStringFormats.clear();
12985   std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
12986       {
12987           FormatStyle::LK_TextProto,
12988           {"pb", "proto"},
12989           {"PARSE_TEXT_PROTO"},
12990           /*CanonicalDelimiter=*/"",
12991           "llvm",
12992       },
12993       {
12994           FormatStyle::LK_Cpp,
12995           {"cc", "cpp"},
12996           {"C_CODEBLOCK", "CPPEVAL"},
12997           /*CanonicalDelimiter=*/"cc",
12998           /*BasedOnStyle=*/"",
12999       },
13000   };
13001 
13002   CHECK_PARSE("RawStringFormats:\n"
13003               "  - Language: TextProto\n"
13004               "    Delimiters:\n"
13005               "      - 'pb'\n"
13006               "      - 'proto'\n"
13007               "    EnclosingFunctions:\n"
13008               "      - 'PARSE_TEXT_PROTO'\n"
13009               "    BasedOnStyle: llvm\n"
13010               "  - Language: Cpp\n"
13011               "    Delimiters:\n"
13012               "      - 'cc'\n"
13013               "      - 'cpp'\n"
13014               "    EnclosingFunctions:\n"
13015               "      - 'C_CODEBLOCK'\n"
13016               "      - 'CPPEVAL'\n"
13017               "    CanonicalDelimiter: 'cc'",
13018               RawStringFormats, ExpectedRawStringFormats);
13019 }
13020 
13021 TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
13022   FormatStyle Style = {};
13023   Style.Language = FormatStyle::LK_Cpp;
13024   CHECK_PARSE("Language: Cpp\n"
13025               "IndentWidth: 12",
13026               IndentWidth, 12u);
13027   EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
13028                                "IndentWidth: 34",
13029                                &Style),
13030             ParseError::Unsuitable);
13031   EXPECT_EQ(12u, Style.IndentWidth);
13032   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
13033   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
13034 
13035   Style.Language = FormatStyle::LK_JavaScript;
13036   CHECK_PARSE("Language: JavaScript\n"
13037               "IndentWidth: 12",
13038               IndentWidth, 12u);
13039   CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
13040   EXPECT_EQ(parseConfiguration("Language: Cpp\n"
13041                                "IndentWidth: 34",
13042                                &Style),
13043             ParseError::Unsuitable);
13044   EXPECT_EQ(23u, Style.IndentWidth);
13045   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
13046   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
13047 
13048   CHECK_PARSE("BasedOnStyle: LLVM\n"
13049               "IndentWidth: 67",
13050               IndentWidth, 67u);
13051 
13052   CHECK_PARSE("---\n"
13053               "Language: JavaScript\n"
13054               "IndentWidth: 12\n"
13055               "---\n"
13056               "Language: Cpp\n"
13057               "IndentWidth: 34\n"
13058               "...\n",
13059               IndentWidth, 12u);
13060 
13061   Style.Language = FormatStyle::LK_Cpp;
13062   CHECK_PARSE("---\n"
13063               "Language: JavaScript\n"
13064               "IndentWidth: 12\n"
13065               "---\n"
13066               "Language: Cpp\n"
13067               "IndentWidth: 34\n"
13068               "...\n",
13069               IndentWidth, 34u);
13070   CHECK_PARSE("---\n"
13071               "IndentWidth: 78\n"
13072               "---\n"
13073               "Language: JavaScript\n"
13074               "IndentWidth: 56\n"
13075               "...\n",
13076               IndentWidth, 78u);
13077 
13078   Style.ColumnLimit = 123;
13079   Style.IndentWidth = 234;
13080   Style.BreakBeforeBraces = FormatStyle::BS_Linux;
13081   Style.TabWidth = 345;
13082   EXPECT_FALSE(parseConfiguration("---\n"
13083                                   "IndentWidth: 456\n"
13084                                   "BreakBeforeBraces: Allman\n"
13085                                   "---\n"
13086                                   "Language: JavaScript\n"
13087                                   "IndentWidth: 111\n"
13088                                   "TabWidth: 111\n"
13089                                   "---\n"
13090                                   "Language: Cpp\n"
13091                                   "BreakBeforeBraces: Stroustrup\n"
13092                                   "TabWidth: 789\n"
13093                                   "...\n",
13094                                   &Style));
13095   EXPECT_EQ(123u, Style.ColumnLimit);
13096   EXPECT_EQ(456u, Style.IndentWidth);
13097   EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
13098   EXPECT_EQ(789u, Style.TabWidth);
13099 
13100   EXPECT_EQ(parseConfiguration("---\n"
13101                                "Language: JavaScript\n"
13102                                "IndentWidth: 56\n"
13103                                "---\n"
13104                                "IndentWidth: 78\n"
13105                                "...\n",
13106                                &Style),
13107             ParseError::Error);
13108   EXPECT_EQ(parseConfiguration("---\n"
13109                                "Language: JavaScript\n"
13110                                "IndentWidth: 56\n"
13111                                "---\n"
13112                                "Language: JavaScript\n"
13113                                "IndentWidth: 78\n"
13114                                "...\n",
13115                                &Style),
13116             ParseError::Error);
13117 
13118   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
13119 }
13120 
13121 #undef CHECK_PARSE
13122 
13123 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
13124   FormatStyle Style = {};
13125   Style.Language = FormatStyle::LK_JavaScript;
13126   Style.BreakBeforeTernaryOperators = true;
13127   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
13128   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
13129 
13130   Style.BreakBeforeTernaryOperators = true;
13131   EXPECT_EQ(0, parseConfiguration("---\n"
13132                                   "BasedOnStyle: Google\n"
13133                                   "---\n"
13134                                   "Language: JavaScript\n"
13135                                   "IndentWidth: 76\n"
13136                                   "...\n",
13137                                   &Style)
13138                    .value());
13139   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
13140   EXPECT_EQ(76u, Style.IndentWidth);
13141   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
13142 }
13143 
13144 TEST_F(FormatTest, ConfigurationRoundTripTest) {
13145   FormatStyle Style = getLLVMStyle();
13146   std::string YAML = configurationAsText(Style);
13147   FormatStyle ParsedStyle = {};
13148   ParsedStyle.Language = FormatStyle::LK_Cpp;
13149   EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
13150   EXPECT_EQ(Style, ParsedStyle);
13151 }
13152 
13153 TEST_F(FormatTest, WorksFor8bitEncodings) {
13154   EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
13155             "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
13156             "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
13157             "\"\xef\xee\xf0\xf3...\"",
13158             format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
13159                    "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
13160                    "\xef\xee\xf0\xf3...\"",
13161                    getLLVMStyleWithColumns(12)));
13162 }
13163 
13164 TEST_F(FormatTest, HandlesUTF8BOM) {
13165   EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
13166   EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
13167             format("\xef\xbb\xbf#include <iostream>"));
13168   EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
13169             format("\xef\xbb\xbf\n#include <iostream>"));
13170 }
13171 
13172 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
13173 #if !defined(_MSC_VER)
13174 
13175 TEST_F(FormatTest, CountsUTF8CharactersProperly) {
13176   verifyFormat("\"Однажды в студёную зимнюю пору...\"",
13177                getLLVMStyleWithColumns(35));
13178   verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
13179                getLLVMStyleWithColumns(31));
13180   verifyFormat("// Однажды в студёную зимнюю пору...",
13181                getLLVMStyleWithColumns(36));
13182   verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
13183   verifyFormat("/* Однажды в студёную зимнюю пору... */",
13184                getLLVMStyleWithColumns(39));
13185   verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
13186                getLLVMStyleWithColumns(35));
13187 }
13188 
13189 TEST_F(FormatTest, SplitsUTF8Strings) {
13190   // Non-printable characters' width is currently considered to be the length in
13191   // bytes in UTF8. The characters can be displayed in very different manner
13192   // (zero-width, single width with a substitution glyph, expanded to their code
13193   // (e.g. "<8d>"), so there's no single correct way to handle them.
13194   EXPECT_EQ("\"aaaaÄ\"\n"
13195             "\"\xc2\x8d\";",
13196             format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
13197   EXPECT_EQ("\"aaaaaaaÄ\"\n"
13198             "\"\xc2\x8d\";",
13199             format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
13200   EXPECT_EQ("\"Однажды, в \"\n"
13201             "\"студёную \"\n"
13202             "\"зимнюю \"\n"
13203             "\"пору,\"",
13204             format("\"Однажды, в студёную зимнюю пору,\"",
13205                    getLLVMStyleWithColumns(13)));
13206   EXPECT_EQ(
13207       "\"一 二 三 \"\n"
13208       "\"四 五六 \"\n"
13209       "\"七 八 九 \"\n"
13210       "\"十\"",
13211       format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
13212   EXPECT_EQ("\"一\t\"\n"
13213             "\"二 \t\"\n"
13214             "\"三 四 \"\n"
13215             "\"五\t\"\n"
13216             "\"六 \t\"\n"
13217             "\"七 \"\n"
13218             "\"八九十\tqq\"",
13219             format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
13220                    getLLVMStyleWithColumns(11)));
13221 
13222   // UTF8 character in an escape sequence.
13223   EXPECT_EQ("\"aaaaaa\"\n"
13224             "\"\\\xC2\x8D\"",
13225             format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
13226 }
13227 
13228 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
13229   EXPECT_EQ("const char *sssss =\n"
13230             "    \"一二三四五六七八\\\n"
13231             " 九 十\";",
13232             format("const char *sssss = \"一二三四五六七八\\\n"
13233                    " 九 十\";",
13234                    getLLVMStyleWithColumns(30)));
13235 }
13236 
13237 TEST_F(FormatTest, SplitsUTF8LineComments) {
13238   EXPECT_EQ("// aaaaÄ\xc2\x8d",
13239             format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
13240   EXPECT_EQ("// Я из лесу\n"
13241             "// вышел; был\n"
13242             "// сильный\n"
13243             "// мороз.",
13244             format("// Я из лесу вышел; был сильный мороз.",
13245                    getLLVMStyleWithColumns(13)));
13246   EXPECT_EQ("// 一二三\n"
13247             "// 四五六七\n"
13248             "// 八  九\n"
13249             "// 十",
13250             format("// 一二三 四五六七 八  九 十", getLLVMStyleWithColumns(9)));
13251 }
13252 
13253 TEST_F(FormatTest, SplitsUTF8BlockComments) {
13254   EXPECT_EQ("/* Гляжу,\n"
13255             " * поднимается\n"
13256             " * медленно в\n"
13257             " * гору\n"
13258             " * Лошадка,\n"
13259             " * везущая\n"
13260             " * хворосту\n"
13261             " * воз. */",
13262             format("/* Гляжу, поднимается медленно в гору\n"
13263                    " * Лошадка, везущая хворосту воз. */",
13264                    getLLVMStyleWithColumns(13)));
13265   EXPECT_EQ(
13266       "/* 一二三\n"
13267       " * 四五六七\n"
13268       " * 八  九\n"
13269       " * 十  */",
13270       format("/* 一二三 四五六七 八  九 十  */", getLLVMStyleWithColumns(9)));
13271   EXPECT_EQ("/* �������� ��������\n"
13272             " * ��������\n"
13273             " * ������-�� */",
13274             format("/* �������� �������� �������� ������-�� */", getLLVMStyleWithColumns(12)));
13275 }
13276 
13277 #endif // _MSC_VER
13278 
13279 TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
13280   FormatStyle Style = getLLVMStyle();
13281 
13282   Style.ConstructorInitializerIndentWidth = 4;
13283   verifyFormat(
13284       "SomeClass::Constructor()\n"
13285       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
13286       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
13287       Style);
13288 
13289   Style.ConstructorInitializerIndentWidth = 2;
13290   verifyFormat(
13291       "SomeClass::Constructor()\n"
13292       "  : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
13293       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
13294       Style);
13295 
13296   Style.ConstructorInitializerIndentWidth = 0;
13297   verifyFormat(
13298       "SomeClass::Constructor()\n"
13299       ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
13300       "  aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
13301       Style);
13302   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
13303   verifyFormat(
13304       "SomeLongTemplateVariableName<\n"
13305       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
13306       Style);
13307   verifyFormat("bool smaller = 1 < "
13308                "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
13309                "                       "
13310                "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
13311                Style);
13312 
13313   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
13314   verifyFormat("SomeClass::Constructor() :\n"
13315                "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n"
13316                "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}",
13317                Style);
13318 }
13319 
13320 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
13321   FormatStyle Style = getLLVMStyle();
13322   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
13323   Style.ConstructorInitializerIndentWidth = 4;
13324   verifyFormat("SomeClass::Constructor()\n"
13325                "    : a(a)\n"
13326                "    , b(b)\n"
13327                "    , c(c) {}",
13328                Style);
13329   verifyFormat("SomeClass::Constructor()\n"
13330                "    : a(a) {}",
13331                Style);
13332 
13333   Style.ColumnLimit = 0;
13334   verifyFormat("SomeClass::Constructor()\n"
13335                "    : a(a) {}",
13336                Style);
13337   verifyFormat("SomeClass::Constructor() noexcept\n"
13338                "    : a(a) {}",
13339                Style);
13340   verifyFormat("SomeClass::Constructor()\n"
13341                "    : a(a)\n"
13342                "    , b(b)\n"
13343                "    , c(c) {}",
13344                Style);
13345   verifyFormat("SomeClass::Constructor()\n"
13346                "    : a(a) {\n"
13347                "  foo();\n"
13348                "  bar();\n"
13349                "}",
13350                Style);
13351 
13352   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
13353   verifyFormat("SomeClass::Constructor()\n"
13354                "    : a(a)\n"
13355                "    , b(b)\n"
13356                "    , c(c) {\n}",
13357                Style);
13358   verifyFormat("SomeClass::Constructor()\n"
13359                "    : a(a) {\n}",
13360                Style);
13361 
13362   Style.ColumnLimit = 80;
13363   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
13364   Style.ConstructorInitializerIndentWidth = 2;
13365   verifyFormat("SomeClass::Constructor()\n"
13366                "  : a(a)\n"
13367                "  , b(b)\n"
13368                "  , c(c) {}",
13369                Style);
13370 
13371   Style.ConstructorInitializerIndentWidth = 0;
13372   verifyFormat("SomeClass::Constructor()\n"
13373                ": a(a)\n"
13374                ", b(b)\n"
13375                ", c(c) {}",
13376                Style);
13377 
13378   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
13379   Style.ConstructorInitializerIndentWidth = 4;
13380   verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
13381   verifyFormat(
13382       "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
13383       Style);
13384   verifyFormat(
13385       "SomeClass::Constructor()\n"
13386       "    : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
13387       Style);
13388   Style.ConstructorInitializerIndentWidth = 4;
13389   Style.ColumnLimit = 60;
13390   verifyFormat("SomeClass::Constructor()\n"
13391                "    : aaaaaaaa(aaaaaaaa)\n"
13392                "    , aaaaaaaa(aaaaaaaa)\n"
13393                "    , aaaaaaaa(aaaaaaaa) {}",
13394                Style);
13395 }
13396 
13397 TEST_F(FormatTest, Destructors) {
13398   verifyFormat("void F(int &i) { i.~int(); }");
13399   verifyFormat("void F(int &i) { i->~int(); }");
13400 }
13401 
13402 TEST_F(FormatTest, FormatsWithWebKitStyle) {
13403   FormatStyle Style = getWebKitStyle();
13404 
13405   // Don't indent in outer namespaces.
13406   verifyFormat("namespace outer {\n"
13407                "int i;\n"
13408                "namespace inner {\n"
13409                "    int i;\n"
13410                "} // namespace inner\n"
13411                "} // namespace outer\n"
13412                "namespace other_outer {\n"
13413                "int i;\n"
13414                "}",
13415                Style);
13416 
13417   // Don't indent case labels.
13418   verifyFormat("switch (variable) {\n"
13419                "case 1:\n"
13420                "case 2:\n"
13421                "    doSomething();\n"
13422                "    break;\n"
13423                "default:\n"
13424                "    ++variable;\n"
13425                "}",
13426                Style);
13427 
13428   // Wrap before binary operators.
13429   EXPECT_EQ("void f()\n"
13430             "{\n"
13431             "    if (aaaaaaaaaaaaaaaa\n"
13432             "        && bbbbbbbbbbbbbbbbbbbbbbbb\n"
13433             "        && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
13434             "        return;\n"
13435             "}",
13436             format("void f() {\n"
13437                    "if (aaaaaaaaaaaaaaaa\n"
13438                    "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
13439                    "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
13440                    "return;\n"
13441                    "}",
13442                    Style));
13443 
13444   // Allow functions on a single line.
13445   verifyFormat("void f() { return; }", Style);
13446 
13447   // Allow empty blocks on a single line and insert a space in empty blocks.
13448   EXPECT_EQ("void f() { }", format("void f() {}", Style));
13449   EXPECT_EQ("while (true) { }", format("while (true) {}", Style));
13450   // However, don't merge non-empty short loops.
13451   EXPECT_EQ("while (true) {\n"
13452             "    continue;\n"
13453             "}",
13454             format("while (true) { continue; }", Style));
13455 
13456   // Constructor initializers are formatted one per line with the "," on the
13457   // new line.
13458   verifyFormat("Constructor()\n"
13459                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
13460                "    , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
13461                "          aaaaaaaaaaaaaa)\n"
13462                "    , aaaaaaaaaaaaaaaaaaaaaaa()\n"
13463                "{\n"
13464                "}",
13465                Style);
13466   verifyFormat("SomeClass::Constructor()\n"
13467                "    : a(a)\n"
13468                "{\n"
13469                "}",
13470                Style);
13471   EXPECT_EQ("SomeClass::Constructor()\n"
13472             "    : a(a)\n"
13473             "{\n"
13474             "}",
13475             format("SomeClass::Constructor():a(a){}", Style));
13476   verifyFormat("SomeClass::Constructor()\n"
13477                "    : a(a)\n"
13478                "    , b(b)\n"
13479                "    , c(c)\n"
13480                "{\n"
13481                "}",
13482                Style);
13483   verifyFormat("SomeClass::Constructor()\n"
13484                "    : a(a)\n"
13485                "{\n"
13486                "    foo();\n"
13487                "    bar();\n"
13488                "}",
13489                Style);
13490 
13491   // Access specifiers should be aligned left.
13492   verifyFormat("class C {\n"
13493                "public:\n"
13494                "    int i;\n"
13495                "};",
13496                Style);
13497 
13498   // Do not align comments.
13499   verifyFormat("int a; // Do not\n"
13500                "double b; // align comments.",
13501                Style);
13502 
13503   // Do not align operands.
13504   EXPECT_EQ("ASSERT(aaaa\n"
13505             "    || bbbb);",
13506             format("ASSERT ( aaaa\n||bbbb);", Style));
13507 
13508   // Accept input's line breaks.
13509   EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
13510             "    || bbbbbbbbbbbbbbb) {\n"
13511             "    i++;\n"
13512             "}",
13513             format("if (aaaaaaaaaaaaaaa\n"
13514                    "|| bbbbbbbbbbbbbbb) { i++; }",
13515                    Style));
13516   EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
13517             "    i++;\n"
13518             "}",
13519             format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
13520 
13521   // Don't automatically break all macro definitions (llvm.org/PR17842).
13522   verifyFormat("#define aNumber 10", Style);
13523   // However, generally keep the line breaks that the user authored.
13524   EXPECT_EQ("#define aNumber \\\n"
13525             "    10",
13526             format("#define aNumber \\\n"
13527                    " 10",
13528                    Style));
13529 
13530   // Keep empty and one-element array literals on a single line.
13531   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
13532             "                                  copyItems:YES];",
13533             format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
13534                    "copyItems:YES];",
13535                    Style));
13536   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
13537             "                                  copyItems:YES];",
13538             format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
13539                    "             copyItems:YES];",
13540                    Style));
13541   // FIXME: This does not seem right, there should be more indentation before
13542   // the array literal's entries. Nested blocks have the same problem.
13543   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
13544             "    @\"a\",\n"
13545             "    @\"a\"\n"
13546             "]\n"
13547             "                                  copyItems:YES];",
13548             format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
13549                    "     @\"a\",\n"
13550                    "     @\"a\"\n"
13551                    "     ]\n"
13552                    "       copyItems:YES];",
13553                    Style));
13554   EXPECT_EQ(
13555       "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
13556       "                                  copyItems:YES];",
13557       format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
13558              "   copyItems:YES];",
13559              Style));
13560 
13561   verifyFormat("[self.a b:c c:d];", Style);
13562   EXPECT_EQ("[self.a b:c\n"
13563             "        c:d];",
13564             format("[self.a b:c\n"
13565                    "c:d];",
13566                    Style));
13567 }
13568 
13569 TEST_F(FormatTest, FormatsLambdas) {
13570   verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
13571   verifyFormat(
13572       "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n");
13573   verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
13574   verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
13575   verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
13576   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
13577   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
13578   verifyFormat("auto c = [a = [b = 42] {}] {};\n");
13579   verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
13580   verifyFormat("int x = f(*+[] {});");
13581   verifyFormat("void f() {\n"
13582                "  other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
13583                "}\n");
13584   verifyFormat("void f() {\n"
13585                "  other(x.begin(), //\n"
13586                "        x.end(),   //\n"
13587                "        [&](int, int) { return 1; });\n"
13588                "}\n");
13589   verifyFormat("void f() {\n"
13590                "  other.other.other.other.other(\n"
13591                "      x.begin(), x.end(),\n"
13592                "      [something, rather](int, int, int, int, int, int, int) { "
13593                "return 1; });\n"
13594                "}\n");
13595   verifyFormat(
13596       "void f() {\n"
13597       "  other.other.other.other.other(\n"
13598       "      x.begin(), x.end(),\n"
13599       "      [something, rather](int, int, int, int, int, int, int) {\n"
13600       "        //\n"
13601       "      });\n"
13602       "}\n");
13603   verifyFormat("SomeFunction([]() { // A cool function...\n"
13604                "  return 43;\n"
13605                "});");
13606   EXPECT_EQ("SomeFunction([]() {\n"
13607             "#define A a\n"
13608             "  return 43;\n"
13609             "});",
13610             format("SomeFunction([](){\n"
13611                    "#define A a\n"
13612                    "return 43;\n"
13613                    "});"));
13614   verifyFormat("void f() {\n"
13615                "  SomeFunction([](decltype(x), A *a) {});\n"
13616                "}");
13617   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
13618                "    [](const aaaaaaaaaa &a) { return a; });");
13619   verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
13620                "  SomeOtherFunctioooooooooooooooooooooooooon();\n"
13621                "});");
13622   verifyFormat("Constructor()\n"
13623                "    : Field([] { // comment\n"
13624                "        int i;\n"
13625                "      }) {}");
13626   verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
13627                "  return some_parameter.size();\n"
13628                "};");
13629   verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
13630                "    [](const string &s) { return s; };");
13631   verifyFormat("int i = aaaaaa ? 1 //\n"
13632                "               : [] {\n"
13633                "                   return 2; //\n"
13634                "                 }();");
13635   verifyFormat("llvm::errs() << \"number of twos is \"\n"
13636                "             << std::count_if(v.begin(), v.end(), [](int x) {\n"
13637                "                  return x == 2; // force break\n"
13638                "                });");
13639   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
13640                "    [=](int iiiiiiiiiiii) {\n"
13641                "      return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
13642                "             aaaaaaaaaaaaaaaaaaaaaaa;\n"
13643                "    });",
13644                getLLVMStyleWithColumns(60));
13645   verifyFormat("SomeFunction({[&] {\n"
13646                "                // comment\n"
13647                "              },\n"
13648                "              [&] {\n"
13649                "                // comment\n"
13650                "              }});");
13651   verifyFormat("SomeFunction({[&] {\n"
13652                "  // comment\n"
13653                "}});");
13654   verifyFormat(
13655       "virtual aaaaaaaaaaaaaaaa(\n"
13656       "    std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n"
13657       "    aaaaa aaaaaaaaa);");
13658 
13659   // Lambdas with return types.
13660   verifyFormat("int c = []() -> int { return 2; }();\n");
13661   verifyFormat("int c = []() -> int * { return 2; }();\n");
13662   verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
13663   verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
13664   verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
13665   verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
13666   verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
13667   verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
13668   verifyFormat("[a, a]() -> a<1> {};");
13669   verifyFormat("[]() -> foo<5 + 2> { return {}; };");
13670   verifyFormat("[]() -> foo<5 - 2> { return {}; };");
13671   verifyFormat("[]() -> foo<5 / 2> { return {}; };");
13672   verifyFormat("[]() -> foo<5 * 2> { return {}; };");
13673   verifyFormat("[]() -> foo<5 % 2> { return {}; };");
13674   verifyFormat("[]() -> foo<5 << 2> { return {}; };");
13675   verifyFormat("[]() -> foo<!5> { return {}; };");
13676   verifyFormat("[]() -> foo<~5> { return {}; };");
13677   verifyFormat("[]() -> foo<5 | 2> { return {}; };");
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 <= 2> { return {}; };");
13685   verifyFormat("[]() -> foo<5 < 2> { return {}; };");
13686   verifyFormat("[]() -> foo<2 ? 1 : 0> { return {}; };");
13687   verifyFormat("namespace bar {\n"
13688                "// broken:\n"
13689                "auto foo{[]() -> foo<5 + 2> { return {}; }};\n"
13690                "} // namespace bar");
13691   verifyFormat("namespace bar {\n"
13692                "// broken:\n"
13693                "auto foo{[]() -> foo<5 - 2> { return {}; }};\n"
13694                "} // namespace bar");
13695   verifyFormat("namespace bar {\n"
13696                "// broken:\n"
13697                "auto foo{[]() -> foo<5 / 2> { return {}; }};\n"
13698                "} // namespace bar");
13699   verifyFormat("namespace bar {\n"
13700                "// broken:\n"
13701                "auto foo{[]() -> foo<5 * 2> { return {}; }};\n"
13702                "} // namespace bar");
13703   verifyFormat("namespace bar {\n"
13704                "// broken:\n"
13705                "auto foo{[]() -> foo<5 % 2> { return {}; }};\n"
13706                "} // namespace bar");
13707   verifyFormat("namespace bar {\n"
13708                "// broken:\n"
13709                "auto foo{[]() -> foo<5 << 2> { return {}; }};\n"
13710                "} // namespace bar");
13711   verifyFormat("namespace bar {\n"
13712                "// broken:\n"
13713                "auto foo{[]() -> foo<!5> { return {}; }};\n"
13714                "} // namespace bar");
13715   verifyFormat("namespace bar {\n"
13716                "// broken:\n"
13717                "auto foo{[]() -> foo<~5> { return {}; }};\n"
13718                "} // namespace bar");
13719   verifyFormat("namespace bar {\n"
13720                "// broken:\n"
13721                "auto foo{[]() -> foo<5 | 2> { return {}; }};\n"
13722                "} // namespace bar");
13723   verifyFormat("namespace bar {\n"
13724                "// broken:\n"
13725                "auto foo{[]() -> foo<5 || 2> { return {}; }};\n"
13726                "} // namespace bar");
13727   verifyFormat("namespace bar {\n"
13728                "// broken:\n"
13729                "auto foo{[]() -> foo<5 & 2> { return {}; }};\n"
13730                "} // namespace bar");
13731   verifyFormat("namespace bar {\n"
13732                "// broken:\n"
13733                "auto foo{[]() -> foo<5 && 2> { return {}; }};\n"
13734                "} // namespace bar");
13735   verifyFormat("namespace bar {\n"
13736                "// broken:\n"
13737                "auto foo{[]() -> foo<5 == 2> { return {}; }};\n"
13738                "} // namespace bar");
13739   verifyFormat("namespace bar {\n"
13740                "// broken:\n"
13741                "auto foo{[]() -> foo<5 != 2> { return {}; }};\n"
13742                "} // namespace bar");
13743   verifyFormat("namespace bar {\n"
13744                "// broken:\n"
13745                "auto foo{[]() -> foo<5 >= 2> { return {}; }};\n"
13746                "} // namespace bar");
13747   verifyFormat("namespace bar {\n"
13748                "// broken:\n"
13749                "auto foo{[]() -> foo<5 <= 2> { return {}; }};\n"
13750                "} // namespace bar");
13751   verifyFormat("namespace bar {\n"
13752                "// broken:\n"
13753                "auto foo{[]() -> foo<5 < 2> { return {}; }};\n"
13754                "} // namespace bar");
13755   verifyFormat("namespace bar {\n"
13756                "// broken:\n"
13757                "auto foo{[]() -> foo<2 ? 1 : 0> { return {}; }};\n"
13758                "} // namespace bar");
13759   verifyFormat("[]() -> a<1> {};");
13760   verifyFormat("[]() -> a<1> { ; };");
13761   verifyFormat("[]() -> a<1> { ; }();");
13762   verifyFormat("[a, a]() -> a<true> {};");
13763   verifyFormat("[]() -> a<true> {};");
13764   verifyFormat("[]() -> a<true> { ; };");
13765   verifyFormat("[]() -> a<true> { ; }();");
13766   verifyFormat("[a, a]() -> a<false> {};");
13767   verifyFormat("[]() -> a<false> {};");
13768   verifyFormat("[]() -> a<false> { ; };");
13769   verifyFormat("[]() -> a<false> { ; }();");
13770   verifyFormat("auto foo{[]() -> foo<false> { ; }};");
13771   verifyFormat("namespace bar {\n"
13772                "auto foo{[]() -> foo<false> { ; }};\n"
13773                "} // namespace bar");
13774   verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
13775                "                   int j) -> int {\n"
13776                "  return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
13777                "};");
13778   verifyFormat(
13779       "aaaaaaaaaaaaaaaaaaaaaa(\n"
13780       "    [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
13781       "      return aaaaaaaaaaaaaaaaa;\n"
13782       "    });",
13783       getLLVMStyleWithColumns(70));
13784   verifyFormat("[]() //\n"
13785                "    -> int {\n"
13786                "  return 1; //\n"
13787                "};");
13788 
13789   // Lambdas with explicit template argument lists.
13790   verifyFormat(
13791       "auto L = []<template <typename> class T, class U>(T<U> &&a) {};\n");
13792 
13793   // Multiple lambdas in the same parentheses change indentation rules. These
13794   // lambdas are forced to start on new lines.
13795   verifyFormat("SomeFunction(\n"
13796                "    []() {\n"
13797                "      //\n"
13798                "    },\n"
13799                "    []() {\n"
13800                "      //\n"
13801                "    });");
13802 
13803   // A lambda passed as arg0 is always pushed to the next line.
13804   verifyFormat("SomeFunction(\n"
13805                "    [this] {\n"
13806                "      //\n"
13807                "    },\n"
13808                "    1);\n");
13809 
13810   // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like
13811   // the arg0 case above.
13812   auto Style = getGoogleStyle();
13813   Style.BinPackArguments = false;
13814   verifyFormat("SomeFunction(\n"
13815                "    a,\n"
13816                "    [this] {\n"
13817                "      //\n"
13818                "    },\n"
13819                "    b);\n",
13820                Style);
13821   verifyFormat("SomeFunction(\n"
13822                "    a,\n"
13823                "    [this] {\n"
13824                "      //\n"
13825                "    },\n"
13826                "    b);\n");
13827 
13828   // A lambda with a very long line forces arg0 to be pushed out irrespective of
13829   // the BinPackArguments value (as long as the code is wide enough).
13830   verifyFormat(
13831       "something->SomeFunction(\n"
13832       "    a,\n"
13833       "    [this] {\n"
13834       "      "
13835       "D0000000000000000000000000000000000000000000000000000000000001();\n"
13836       "    },\n"
13837       "    b);\n");
13838 
13839   // A multi-line lambda is pulled up as long as the introducer fits on the
13840   // previous line and there are no further args.
13841   verifyFormat("function(1, [this, that] {\n"
13842                "  //\n"
13843                "});\n");
13844   verifyFormat("function([this, that] {\n"
13845                "  //\n"
13846                "});\n");
13847   // FIXME: this format is not ideal and we should consider forcing the first
13848   // arg onto its own line.
13849   verifyFormat("function(a, b, c, //\n"
13850                "         d, [this, that] {\n"
13851                "           //\n"
13852                "         });\n");
13853 
13854   // Multiple lambdas are treated correctly even when there is a short arg0.
13855   verifyFormat("SomeFunction(\n"
13856                "    1,\n"
13857                "    [this] {\n"
13858                "      //\n"
13859                "    },\n"
13860                "    [this] {\n"
13861                "      //\n"
13862                "    },\n"
13863                "    1);\n");
13864 
13865   // More complex introducers.
13866   verifyFormat("return [i, args...] {};");
13867 
13868   // Not lambdas.
13869   verifyFormat("constexpr char hello[]{\"hello\"};");
13870   verifyFormat("double &operator[](int i) { return 0; }\n"
13871                "int i;");
13872   verifyFormat("std::unique_ptr<int[]> foo() {}");
13873   verifyFormat("int i = a[a][a]->f();");
13874   verifyFormat("int i = (*b)[a]->f();");
13875 
13876   // Other corner cases.
13877   verifyFormat("void f() {\n"
13878                "  bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
13879                "  );\n"
13880                "}");
13881 
13882   // Lambdas created through weird macros.
13883   verifyFormat("void f() {\n"
13884                "  MACRO((const AA &a) { return 1; });\n"
13885                "  MACRO((AA &a) { return 1; });\n"
13886                "}");
13887 
13888   verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
13889                "      doo_dah();\n"
13890                "      doo_dah();\n"
13891                "    })) {\n"
13892                "}");
13893   verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
13894                "                doo_dah();\n"
13895                "                doo_dah();\n"
13896                "              })) {\n"
13897                "}");
13898   verifyFormat("if CONSTEXPR (blah_blah(whatever, whatever, [] {\n"
13899                "                doo_dah();\n"
13900                "                doo_dah();\n"
13901                "              })) {\n"
13902                "}");
13903   verifyFormat("auto lambda = []() {\n"
13904                "  int a = 2\n"
13905                "#if A\n"
13906                "          + 2\n"
13907                "#endif\n"
13908                "      ;\n"
13909                "};");
13910 
13911   // Lambdas with complex multiline introducers.
13912   verifyFormat(
13913       "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
13914       "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
13915       "        -> ::std::unordered_set<\n"
13916       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
13917       "      //\n"
13918       "    });");
13919 
13920   FormatStyle DoNotMerge = getLLVMStyle();
13921   DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None;
13922   verifyFormat("auto c = []() {\n"
13923                "  return b;\n"
13924                "};",
13925                "auto c = []() { return b; };", DoNotMerge);
13926   verifyFormat("auto c = []() {\n"
13927                "};",
13928                " auto c = []() {};", DoNotMerge);
13929 
13930   FormatStyle MergeEmptyOnly = getLLVMStyle();
13931   MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty;
13932   verifyFormat("auto c = []() {\n"
13933                "  return b;\n"
13934                "};",
13935                "auto c = []() {\n"
13936                "  return b;\n"
13937                " };",
13938                MergeEmptyOnly);
13939   verifyFormat("auto c = []() {};",
13940                "auto c = []() {\n"
13941                "};",
13942                MergeEmptyOnly);
13943 
13944   FormatStyle MergeInline = getLLVMStyle();
13945   MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline;
13946   verifyFormat("auto c = []() {\n"
13947                "  return b;\n"
13948                "};",
13949                "auto c = []() { return b; };", MergeInline);
13950   verifyFormat("function([]() { return b; })", "function([]() { return b; })",
13951                MergeInline);
13952   verifyFormat("function([]() { return b; }, a)",
13953                "function([]() { return b; }, a)", MergeInline);
13954   verifyFormat("function(a, []() { return b; })",
13955                "function(a, []() { return b; })", MergeInline);
13956 }
13957 
13958 TEST_F(FormatTest, EmptyLinesInLambdas) {
13959   verifyFormat("auto lambda = []() {\n"
13960                "  x(); //\n"
13961                "};",
13962                "auto lambda = []() {\n"
13963                "\n"
13964                "  x(); //\n"
13965                "\n"
13966                "};");
13967 }
13968 
13969 TEST_F(FormatTest, FormatsBlocks) {
13970   FormatStyle ShortBlocks = getLLVMStyle();
13971   ShortBlocks.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always;
13972   verifyFormat("int (^Block)(int, int);", ShortBlocks);
13973   verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
13974   verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
13975   verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
13976   verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
13977   verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
13978 
13979   verifyFormat("foo(^{ bar(); });", ShortBlocks);
13980   verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
13981   verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
13982 
13983   verifyFormat("[operation setCompletionBlock:^{\n"
13984                "  [self onOperationDone];\n"
13985                "}];");
13986   verifyFormat("int i = {[operation setCompletionBlock:^{\n"
13987                "  [self onOperationDone];\n"
13988                "}]};");
13989   verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
13990                "  f();\n"
13991                "}];");
13992   verifyFormat("int a = [operation block:^int(int *i) {\n"
13993                "  return 1;\n"
13994                "}];");
13995   verifyFormat("[myObject doSomethingWith:arg1\n"
13996                "                      aaa:^int(int *a) {\n"
13997                "                        return 1;\n"
13998                "                      }\n"
13999                "                      bbb:f(a * bbbbbbbb)];");
14000 
14001   verifyFormat("[operation setCompletionBlock:^{\n"
14002                "  [self.delegate newDataAvailable];\n"
14003                "}];",
14004                getLLVMStyleWithColumns(60));
14005   verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
14006                "  NSString *path = [self sessionFilePath];\n"
14007                "  if (path) {\n"
14008                "    // ...\n"
14009                "  }\n"
14010                "});");
14011   verifyFormat("[[SessionService sharedService]\n"
14012                "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
14013                "      if (window) {\n"
14014                "        [self windowDidLoad:window];\n"
14015                "      } else {\n"
14016                "        [self errorLoadingWindow];\n"
14017                "      }\n"
14018                "    }];");
14019   verifyFormat("void (^largeBlock)(void) = ^{\n"
14020                "  // ...\n"
14021                "};\n",
14022                getLLVMStyleWithColumns(40));
14023   verifyFormat("[[SessionService sharedService]\n"
14024                "    loadWindowWithCompletionBlock: //\n"
14025                "        ^(SessionWindow *window) {\n"
14026                "          if (window) {\n"
14027                "            [self windowDidLoad:window];\n"
14028                "          } else {\n"
14029                "            [self errorLoadingWindow];\n"
14030                "          }\n"
14031                "        }];",
14032                getLLVMStyleWithColumns(60));
14033   verifyFormat("[myObject doSomethingWith:arg1\n"
14034                "    firstBlock:^(Foo *a) {\n"
14035                "      // ...\n"
14036                "      int i;\n"
14037                "    }\n"
14038                "    secondBlock:^(Bar *b) {\n"
14039                "      // ...\n"
14040                "      int i;\n"
14041                "    }\n"
14042                "    thirdBlock:^Foo(Bar *b) {\n"
14043                "      // ...\n"
14044                "      int i;\n"
14045                "    }];");
14046   verifyFormat("[myObject doSomethingWith:arg1\n"
14047                "               firstBlock:-1\n"
14048                "              secondBlock:^(Bar *b) {\n"
14049                "                // ...\n"
14050                "                int i;\n"
14051                "              }];");
14052 
14053   verifyFormat("f(^{\n"
14054                "  @autoreleasepool {\n"
14055                "    if (a) {\n"
14056                "      g();\n"
14057                "    }\n"
14058                "  }\n"
14059                "});");
14060   verifyFormat("Block b = ^int *(A *a, B *b) {}");
14061   verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
14062                "};");
14063 
14064   FormatStyle FourIndent = getLLVMStyle();
14065   FourIndent.ObjCBlockIndentWidth = 4;
14066   verifyFormat("[operation setCompletionBlock:^{\n"
14067                "    [self onOperationDone];\n"
14068                "}];",
14069                FourIndent);
14070 }
14071 
14072 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
14073   FormatStyle ZeroColumn = getLLVMStyle();
14074   ZeroColumn.ColumnLimit = 0;
14075 
14076   verifyFormat("[[SessionService sharedService] "
14077                "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
14078                "  if (window) {\n"
14079                "    [self windowDidLoad:window];\n"
14080                "  } else {\n"
14081                "    [self errorLoadingWindow];\n"
14082                "  }\n"
14083                "}];",
14084                ZeroColumn);
14085   EXPECT_EQ("[[SessionService sharedService]\n"
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             format("[[SessionService sharedService]\n"
14094                    "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
14095                    "                if (window) {\n"
14096                    "    [self windowDidLoad:window];\n"
14097                    "  } else {\n"
14098                    "    [self errorLoadingWindow];\n"
14099                    "  }\n"
14100                    "}];",
14101                    ZeroColumn));
14102   verifyFormat("[myObject doSomethingWith:arg1\n"
14103                "    firstBlock:^(Foo *a) {\n"
14104                "      // ...\n"
14105                "      int i;\n"
14106                "    }\n"
14107                "    secondBlock:^(Bar *b) {\n"
14108                "      // ...\n"
14109                "      int i;\n"
14110                "    }\n"
14111                "    thirdBlock:^Foo(Bar *b) {\n"
14112                "      // ...\n"
14113                "      int i;\n"
14114                "    }];",
14115                ZeroColumn);
14116   verifyFormat("f(^{\n"
14117                "  @autoreleasepool {\n"
14118                "    if (a) {\n"
14119                "      g();\n"
14120                "    }\n"
14121                "  }\n"
14122                "});",
14123                ZeroColumn);
14124   verifyFormat("void (^largeBlock)(void) = ^{\n"
14125                "  // ...\n"
14126                "};",
14127                ZeroColumn);
14128 
14129   ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always;
14130   EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
14131             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
14132   ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never;
14133   EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
14134             "  int i;\n"
14135             "};",
14136             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
14137 }
14138 
14139 TEST_F(FormatTest, SupportsCRLF) {
14140   EXPECT_EQ("int a;\r\n"
14141             "int b;\r\n"
14142             "int c;\r\n",
14143             format("int a;\r\n"
14144                    "  int b;\r\n"
14145                    "    int c;\r\n",
14146                    getLLVMStyle()));
14147   EXPECT_EQ("int a;\r\n"
14148             "int b;\r\n"
14149             "int c;\r\n",
14150             format("int a;\r\n"
14151                    "  int b;\n"
14152                    "    int c;\r\n",
14153                    getLLVMStyle()));
14154   EXPECT_EQ("int a;\n"
14155             "int b;\n"
14156             "int c;\n",
14157             format("int a;\r\n"
14158                    "  int b;\n"
14159                    "    int c;\n",
14160                    getLLVMStyle()));
14161   EXPECT_EQ("\"aaaaaaa \"\r\n"
14162             "\"bbbbbbb\";\r\n",
14163             format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
14164   EXPECT_EQ("#define A \\\r\n"
14165             "  b;      \\\r\n"
14166             "  c;      \\\r\n"
14167             "  d;\r\n",
14168             format("#define A \\\r\n"
14169                    "  b; \\\r\n"
14170                    "  c; d; \r\n",
14171                    getGoogleStyle()));
14172 
14173   EXPECT_EQ("/*\r\n"
14174             "multi line block comments\r\n"
14175             "should not introduce\r\n"
14176             "an extra carriage return\r\n"
14177             "*/\r\n",
14178             format("/*\r\n"
14179                    "multi line block comments\r\n"
14180                    "should not introduce\r\n"
14181                    "an extra carriage return\r\n"
14182                    "*/\r\n"));
14183   EXPECT_EQ("/*\r\n"
14184             "\r\n"
14185             "*/",
14186             format("/*\r\n"
14187                    "    \r\r\r\n"
14188                    "*/"));
14189 
14190   FormatStyle style = getLLVMStyle();
14191 
14192   style.DeriveLineEnding = true;
14193   style.UseCRLF = false;
14194   EXPECT_EQ("union FooBarBazQux {\n"
14195             "  int foo;\n"
14196             "  int bar;\n"
14197             "  int baz;\n"
14198             "};",
14199             format("union FooBarBazQux {\r\n"
14200                    "  int foo;\n"
14201                    "  int bar;\r\n"
14202                    "  int baz;\n"
14203                    "};",
14204                    style));
14205   style.UseCRLF = true;
14206   EXPECT_EQ("union FooBarBazQux {\r\n"
14207             "  int foo;\r\n"
14208             "  int bar;\r\n"
14209             "  int baz;\r\n"
14210             "};",
14211             format("union FooBarBazQux {\r\n"
14212                    "  int foo;\n"
14213                    "  int bar;\r\n"
14214                    "  int baz;\n"
14215                    "};",
14216                    style));
14217 
14218   style.DeriveLineEnding = false;
14219   style.UseCRLF = false;
14220   EXPECT_EQ("union FooBarBazQux {\n"
14221             "  int foo;\n"
14222             "  int bar;\n"
14223             "  int baz;\n"
14224             "  int qux;\n"
14225             "};",
14226             format("union FooBarBazQux {\r\n"
14227                    "  int foo;\n"
14228                    "  int bar;\r\n"
14229                    "  int baz;\n"
14230                    "  int qux;\r\n"
14231                    "};",
14232                    style));
14233   style.UseCRLF = true;
14234   EXPECT_EQ("union FooBarBazQux {\r\n"
14235             "  int foo;\r\n"
14236             "  int bar;\r\n"
14237             "  int baz;\r\n"
14238             "  int qux;\r\n"
14239             "};",
14240             format("union FooBarBazQux {\r\n"
14241                    "  int foo;\n"
14242                    "  int bar;\r\n"
14243                    "  int baz;\n"
14244                    "  int qux;\n"
14245                    "};",
14246                    style));
14247 
14248   style.DeriveLineEnding = true;
14249   style.UseCRLF = false;
14250   EXPECT_EQ("union FooBarBazQux {\r\n"
14251             "  int foo;\r\n"
14252             "  int bar;\r\n"
14253             "  int baz;\r\n"
14254             "  int qux;\r\n"
14255             "};",
14256             format("union FooBarBazQux {\r\n"
14257                    "  int foo;\n"
14258                    "  int bar;\r\n"
14259                    "  int baz;\n"
14260                    "  int qux;\r\n"
14261                    "};",
14262                    style));
14263   style.UseCRLF = true;
14264   EXPECT_EQ("union FooBarBazQux {\n"
14265             "  int foo;\n"
14266             "  int bar;\n"
14267             "  int baz;\n"
14268             "  int qux;\n"
14269             "};",
14270             format("union FooBarBazQux {\r\n"
14271                    "  int foo;\n"
14272                    "  int bar;\r\n"
14273                    "  int baz;\n"
14274                    "  int qux;\n"
14275                    "};",
14276                    style));
14277 }
14278 
14279 TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
14280   verifyFormat("MY_CLASS(C) {\n"
14281                "  int i;\n"
14282                "  int j;\n"
14283                "};");
14284 }
14285 
14286 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
14287   FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
14288   TwoIndent.ContinuationIndentWidth = 2;
14289 
14290   EXPECT_EQ("int i =\n"
14291             "  longFunction(\n"
14292             "    arg);",
14293             format("int i = longFunction(arg);", TwoIndent));
14294 
14295   FormatStyle SixIndent = getLLVMStyleWithColumns(20);
14296   SixIndent.ContinuationIndentWidth = 6;
14297 
14298   EXPECT_EQ("int i =\n"
14299             "      longFunction(\n"
14300             "            arg);",
14301             format("int i = longFunction(arg);", SixIndent));
14302 }
14303 
14304 TEST_F(FormatTest, WrappedClosingParenthesisIndent) {
14305   FormatStyle Style = getLLVMStyle();
14306   verifyFormat("int Foo::getter(\n"
14307                "    //\n"
14308                ") const {\n"
14309                "  return foo;\n"
14310                "}",
14311                Style);
14312   verifyFormat("void Foo::setter(\n"
14313                "    //\n"
14314                ") {\n"
14315                "  foo = 1;\n"
14316                "}",
14317                Style);
14318 }
14319 
14320 TEST_F(FormatTest, SpacesInAngles) {
14321   FormatStyle Spaces = getLLVMStyle();
14322   Spaces.SpacesInAngles = true;
14323 
14324   verifyFormat("static_cast< int >(arg);", Spaces);
14325   verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
14326   verifyFormat("f< int, float >();", Spaces);
14327   verifyFormat("template <> g() {}", Spaces);
14328   verifyFormat("template < std::vector< int > > f() {}", Spaces);
14329   verifyFormat("std::function< void(int, int) > fct;", Spaces);
14330   verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
14331                Spaces);
14332 
14333   Spaces.Standard = FormatStyle::LS_Cpp03;
14334   Spaces.SpacesInAngles = true;
14335   verifyFormat("A< A< int > >();", Spaces);
14336 
14337   Spaces.SpacesInAngles = false;
14338   verifyFormat("A<A<int> >();", Spaces);
14339 
14340   Spaces.Standard = FormatStyle::LS_Cpp11;
14341   Spaces.SpacesInAngles = true;
14342   verifyFormat("A< A< int > >();", Spaces);
14343 
14344   Spaces.SpacesInAngles = false;
14345   verifyFormat("A<A<int>>();", Spaces);
14346 }
14347 
14348 TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
14349   FormatStyle Style = getLLVMStyle();
14350   Style.SpaceAfterTemplateKeyword = false;
14351   verifyFormat("template<int> void foo();", Style);
14352 }
14353 
14354 TEST_F(FormatTest, TripleAngleBrackets) {
14355   verifyFormat("f<<<1, 1>>>();");
14356   verifyFormat("f<<<1, 1, 1, s>>>();");
14357   verifyFormat("f<<<a, b, c, d>>>();");
14358   EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
14359   verifyFormat("f<param><<<1, 1>>>();");
14360   verifyFormat("f<1><<<1, 1>>>();");
14361   EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
14362   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
14363                "aaaaaaaaaaa<<<\n    1, 1>>>();");
14364   verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
14365                "    <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
14366 }
14367 
14368 TEST_F(FormatTest, MergeLessLessAtEnd) {
14369   verifyFormat("<<");
14370   EXPECT_EQ("< < <", format("\\\n<<<"));
14371   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
14372                "aaallvm::outs() <<");
14373   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
14374                "aaaallvm::outs()\n    <<");
14375 }
14376 
14377 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
14378   std::string code = "#if A\n"
14379                      "#if B\n"
14380                      "a.\n"
14381                      "#endif\n"
14382                      "    a = 1;\n"
14383                      "#else\n"
14384                      "#endif\n"
14385                      "#if C\n"
14386                      "#else\n"
14387                      "#endif\n";
14388   EXPECT_EQ(code, format(code));
14389 }
14390 
14391 TEST_F(FormatTest, HandleConflictMarkers) {
14392   // Git/SVN conflict markers.
14393   EXPECT_EQ("int a;\n"
14394             "void f() {\n"
14395             "  callme(some(parameter1,\n"
14396             "<<<<<<< text by the vcs\n"
14397             "              parameter2),\n"
14398             "||||||| text by the vcs\n"
14399             "              parameter2),\n"
14400             "         parameter3,\n"
14401             "======= text by the vcs\n"
14402             "              parameter2, parameter3),\n"
14403             ">>>>>>> text by the vcs\n"
14404             "         otherparameter);\n",
14405             format("int a;\n"
14406                    "void f() {\n"
14407                    "  callme(some(parameter1,\n"
14408                    "<<<<<<< text by the vcs\n"
14409                    "  parameter2),\n"
14410                    "||||||| text by the vcs\n"
14411                    "  parameter2),\n"
14412                    "  parameter3,\n"
14413                    "======= text by the vcs\n"
14414                    "  parameter2,\n"
14415                    "  parameter3),\n"
14416                    ">>>>>>> text by the vcs\n"
14417                    "  otherparameter);\n"));
14418 
14419   // Perforce markers.
14420   EXPECT_EQ("void f() {\n"
14421             "  function(\n"
14422             ">>>> text by the vcs\n"
14423             "      parameter,\n"
14424             "==== text by the vcs\n"
14425             "      parameter,\n"
14426             "==== text by the vcs\n"
14427             "      parameter,\n"
14428             "<<<< text by the vcs\n"
14429             "      parameter);\n",
14430             format("void f() {\n"
14431                    "  function(\n"
14432                    ">>>> text by the vcs\n"
14433                    "  parameter,\n"
14434                    "==== text by the vcs\n"
14435                    "  parameter,\n"
14436                    "==== text by the vcs\n"
14437                    "  parameter,\n"
14438                    "<<<< text by the vcs\n"
14439                    "  parameter);\n"));
14440 
14441   EXPECT_EQ("<<<<<<<\n"
14442             "|||||||\n"
14443             "=======\n"
14444             ">>>>>>>",
14445             format("<<<<<<<\n"
14446                    "|||||||\n"
14447                    "=======\n"
14448                    ">>>>>>>"));
14449 
14450   EXPECT_EQ("<<<<<<<\n"
14451             "|||||||\n"
14452             "int i;\n"
14453             "=======\n"
14454             ">>>>>>>",
14455             format("<<<<<<<\n"
14456                    "|||||||\n"
14457                    "int i;\n"
14458                    "=======\n"
14459                    ">>>>>>>"));
14460 
14461   // FIXME: Handle parsing of macros around conflict markers correctly:
14462   EXPECT_EQ("#define Macro \\\n"
14463             "<<<<<<<\n"
14464             "Something \\\n"
14465             "|||||||\n"
14466             "Else \\\n"
14467             "=======\n"
14468             "Other \\\n"
14469             ">>>>>>>\n"
14470             "    End int i;\n",
14471             format("#define Macro \\\n"
14472                    "<<<<<<<\n"
14473                    "  Something \\\n"
14474                    "|||||||\n"
14475                    "  Else \\\n"
14476                    "=======\n"
14477                    "  Other \\\n"
14478                    ">>>>>>>\n"
14479                    "  End\n"
14480                    "int i;\n"));
14481 }
14482 
14483 TEST_F(FormatTest, DisableRegions) {
14484   EXPECT_EQ("int i;\n"
14485             "// clang-format off\n"
14486             "  int j;\n"
14487             "// clang-format on\n"
14488             "int k;",
14489             format(" int  i;\n"
14490                    "   // clang-format off\n"
14491                    "  int j;\n"
14492                    " // clang-format on\n"
14493                    "   int   k;"));
14494   EXPECT_EQ("int i;\n"
14495             "/* clang-format off */\n"
14496             "  int j;\n"
14497             "/* clang-format on */\n"
14498             "int k;",
14499             format(" int  i;\n"
14500                    "   /* clang-format off */\n"
14501                    "  int j;\n"
14502                    " /* clang-format on */\n"
14503                    "   int   k;"));
14504 
14505   // Don't reflow comments within disabled regions.
14506   EXPECT_EQ("// clang-format off\n"
14507             "// long long long long long long line\n"
14508             "/* clang-format on */\n"
14509             "/* long long long\n"
14510             " * long long long\n"
14511             " * line */\n"
14512             "int i;\n"
14513             "/* clang-format off */\n"
14514             "/* long long long long long long line */\n",
14515             format("// clang-format off\n"
14516                    "// long long long long long long line\n"
14517                    "/* clang-format on */\n"
14518                    "/* long long long long long long line */\n"
14519                    "int i;\n"
14520                    "/* clang-format off */\n"
14521                    "/* long long long long long long line */\n",
14522                    getLLVMStyleWithColumns(20)));
14523 }
14524 
14525 TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
14526   format("? ) =");
14527   verifyNoCrash("#define a\\\n /**/}");
14528 }
14529 
14530 TEST_F(FormatTest, FormatsTableGenCode) {
14531   FormatStyle Style = getLLVMStyle();
14532   Style.Language = FormatStyle::LK_TableGen;
14533   verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
14534 }
14535 
14536 TEST_F(FormatTest, ArrayOfTemplates) {
14537   EXPECT_EQ("auto a = new unique_ptr<int>[10];",
14538             format("auto a = new unique_ptr<int > [ 10];"));
14539 
14540   FormatStyle Spaces = getLLVMStyle();
14541   Spaces.SpacesInSquareBrackets = true;
14542   EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
14543             format("auto a = new unique_ptr<int > [10];", Spaces));
14544 }
14545 
14546 TEST_F(FormatTest, ArrayAsTemplateType) {
14547   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
14548             format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
14549 
14550   FormatStyle Spaces = getLLVMStyle();
14551   Spaces.SpacesInSquareBrackets = true;
14552   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
14553             format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
14554 }
14555 
14556 TEST_F(FormatTest, NoSpaceAfterSuper) { verifyFormat("__super::FooBar();"); }
14557 
14558 TEST(FormatStyle, GetStyleWithEmptyFileName) {
14559   llvm::vfs::InMemoryFileSystem FS;
14560   auto Style1 = getStyle("file", "", "Google", "", &FS);
14561   ASSERT_TRUE((bool)Style1);
14562   ASSERT_EQ(*Style1, getGoogleStyle());
14563 }
14564 
14565 TEST(FormatStyle, GetStyleOfFile) {
14566   llvm::vfs::InMemoryFileSystem FS;
14567   // Test 1: format file in the same directory.
14568   ASSERT_TRUE(
14569       FS.addFile("/a/.clang-format", 0,
14570                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
14571   ASSERT_TRUE(
14572       FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
14573   auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
14574   ASSERT_TRUE((bool)Style1);
14575   ASSERT_EQ(*Style1, getLLVMStyle());
14576 
14577   // Test 2.1: fallback to default.
14578   ASSERT_TRUE(
14579       FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
14580   auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
14581   ASSERT_TRUE((bool)Style2);
14582   ASSERT_EQ(*Style2, getMozillaStyle());
14583 
14584   // Test 2.2: no format on 'none' fallback style.
14585   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
14586   ASSERT_TRUE((bool)Style2);
14587   ASSERT_EQ(*Style2, getNoStyle());
14588 
14589   // Test 2.3: format if config is found with no based style while fallback is
14590   // 'none'.
14591   ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
14592                          llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
14593   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
14594   ASSERT_TRUE((bool)Style2);
14595   ASSERT_EQ(*Style2, getLLVMStyle());
14596 
14597   // Test 2.4: format if yaml with no based style, while fallback is 'none'.
14598   Style2 = getStyle("{}", "a.h", "none", "", &FS);
14599   ASSERT_TRUE((bool)Style2);
14600   ASSERT_EQ(*Style2, getLLVMStyle());
14601 
14602   // Test 3: format file in parent directory.
14603   ASSERT_TRUE(
14604       FS.addFile("/c/.clang-format", 0,
14605                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
14606   ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
14607                          llvm::MemoryBuffer::getMemBuffer("int i;")));
14608   auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
14609   ASSERT_TRUE((bool)Style3);
14610   ASSERT_EQ(*Style3, getGoogleStyle());
14611 
14612   // Test 4: error on invalid fallback style
14613   auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
14614   ASSERT_FALSE((bool)Style4);
14615   llvm::consumeError(Style4.takeError());
14616 
14617   // Test 5: error on invalid yaml on command line
14618   auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
14619   ASSERT_FALSE((bool)Style5);
14620   llvm::consumeError(Style5.takeError());
14621 
14622   // Test 6: error on invalid style
14623   auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
14624   ASSERT_FALSE((bool)Style6);
14625   llvm::consumeError(Style6.takeError());
14626 
14627   // Test 7: found config file, error on parsing it
14628   ASSERT_TRUE(
14629       FS.addFile("/d/.clang-format", 0,
14630                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
14631                                                   "InvalidKey: InvalidValue")));
14632   ASSERT_TRUE(
14633       FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
14634   auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
14635   ASSERT_FALSE((bool)Style7);
14636   llvm::consumeError(Style7.takeError());
14637 
14638   // Test 8: inferred per-language defaults apply.
14639   auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS);
14640   ASSERT_TRUE((bool)StyleTd);
14641   ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen));
14642 }
14643 
14644 TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
14645   // Column limit is 20.
14646   std::string Code = "Type *a =\n"
14647                      "    new Type();\n"
14648                      "g(iiiii, 0, jjjjj,\n"
14649                      "  0, kkkkk, 0, mm);\n"
14650                      "int  bad     = format   ;";
14651   std::string Expected = "auto a = new Type();\n"
14652                          "g(iiiii, nullptr,\n"
14653                          "  jjjjj, nullptr,\n"
14654                          "  kkkkk, nullptr,\n"
14655                          "  mm);\n"
14656                          "int  bad     = format   ;";
14657   FileID ID = Context.createInMemoryFile("format.cpp", Code);
14658   tooling::Replacements Replaces = toReplacements(
14659       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
14660                             "auto "),
14661        tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
14662                             "nullptr"),
14663        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
14664                             "nullptr"),
14665        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
14666                             "nullptr")});
14667 
14668   format::FormatStyle Style = format::getLLVMStyle();
14669   Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
14670   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
14671   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
14672       << llvm::toString(FormattedReplaces.takeError()) << "\n";
14673   auto Result = applyAllReplacements(Code, *FormattedReplaces);
14674   EXPECT_TRUE(static_cast<bool>(Result));
14675   EXPECT_EQ(Expected, *Result);
14676 }
14677 
14678 TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
14679   std::string Code = "#include \"a.h\"\n"
14680                      "#include \"c.h\"\n"
14681                      "\n"
14682                      "int main() {\n"
14683                      "  return 0;\n"
14684                      "}";
14685   std::string Expected = "#include \"a.h\"\n"
14686                          "#include \"b.h\"\n"
14687                          "#include \"c.h\"\n"
14688                          "\n"
14689                          "int main() {\n"
14690                          "  return 0;\n"
14691                          "}";
14692   FileID ID = Context.createInMemoryFile("fix.cpp", Code);
14693   tooling::Replacements Replaces = toReplacements(
14694       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
14695                             "#include \"b.h\"\n")});
14696 
14697   format::FormatStyle Style = format::getLLVMStyle();
14698   Style.SortIncludes = true;
14699   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
14700   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
14701       << llvm::toString(FormattedReplaces.takeError()) << "\n";
14702   auto Result = applyAllReplacements(Code, *FormattedReplaces);
14703   EXPECT_TRUE(static_cast<bool>(Result));
14704   EXPECT_EQ(Expected, *Result);
14705 }
14706 
14707 TEST_F(FormatTest, FormatSortsUsingDeclarations) {
14708   EXPECT_EQ("using std::cin;\n"
14709             "using std::cout;",
14710             format("using std::cout;\n"
14711                    "using std::cin;",
14712                    getGoogleStyle()));
14713 }
14714 
14715 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
14716   format::FormatStyle Style = format::getLLVMStyle();
14717   Style.Standard = FormatStyle::LS_Cpp03;
14718   // cpp03 recognize this string as identifier u8 and literal character 'a'
14719   EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
14720 }
14721 
14722 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
14723   // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
14724   // all modes, including C++11, C++14 and C++17
14725   EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
14726 }
14727 
14728 TEST_F(FormatTest, DoNotFormatLikelyXml) {
14729   EXPECT_EQ("<!-- ;> -->", format("<!-- ;> -->", getGoogleStyle()));
14730   EXPECT_EQ(" <!-- >; -->", format(" <!-- >; -->", getGoogleStyle()));
14731 }
14732 
14733 TEST_F(FormatTest, StructuredBindings) {
14734   // Structured bindings is a C++17 feature.
14735   // all modes, including C++11, C++14 and C++17
14736   verifyFormat("auto [a, b] = f();");
14737   EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
14738   EXPECT_EQ("const auto [a, b] = f();", format("const   auto[a, b] = f();"));
14739   EXPECT_EQ("auto const [a, b] = f();", format("auto  const[a, b] = f();"));
14740   EXPECT_EQ("auto const volatile [a, b] = f();",
14741             format("auto  const   volatile[a, b] = f();"));
14742   EXPECT_EQ("auto [a, b, c] = f();", format("auto   [  a  ,  b,c   ] = f();"));
14743   EXPECT_EQ("auto &[a, b, c] = f();",
14744             format("auto   &[  a  ,  b,c   ] = f();"));
14745   EXPECT_EQ("auto &&[a, b, c] = f();",
14746             format("auto   &&[  a  ,  b,c   ] = f();"));
14747   EXPECT_EQ("auto const &[a, b] = f();", format("auto  const&[a, b] = f();"));
14748   EXPECT_EQ("auto const volatile &&[a, b] = f();",
14749             format("auto  const  volatile  &&[a, b] = f();"));
14750   EXPECT_EQ("auto const &&[a, b] = f();",
14751             format("auto  const   &&  [a, b] = f();"));
14752   EXPECT_EQ("const auto &[a, b] = f();",
14753             format("const  auto  &  [a, b] = f();"));
14754   EXPECT_EQ("const auto volatile &&[a, b] = f();",
14755             format("const  auto   volatile  &&[a, b] = f();"));
14756   EXPECT_EQ("volatile const auto &&[a, b] = f();",
14757             format("volatile  const  auto   &&[a, b] = f();"));
14758   EXPECT_EQ("const auto &&[a, b] = f();",
14759             format("const  auto  &&  [a, b] = f();"));
14760 
14761   // Make sure we don't mistake structured bindings for lambdas.
14762   FormatStyle PointerMiddle = getLLVMStyle();
14763   PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
14764   verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
14765   verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
14766   verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
14767   verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
14768   verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
14769   verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
14770   verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
14771   verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
14772   verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
14773   verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
14774   verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
14775   verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
14776 
14777   EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
14778             format("for (const auto   &&   [a, b] : some_range) {\n}"));
14779   EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
14780             format("for (const auto   &   [a, b] : some_range) {\n}"));
14781   EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
14782             format("for (const auto[a, b] : some_range) {\n}"));
14783   EXPECT_EQ("auto [x, y](expr);", format("auto[x,y]  (expr);"));
14784   EXPECT_EQ("auto &[x, y](expr);", format("auto  &  [x,y]  (expr);"));
14785   EXPECT_EQ("auto &&[x, y](expr);", format("auto  &&  [x,y]  (expr);"));
14786   EXPECT_EQ("auto const &[x, y](expr);",
14787             format("auto  const  &  [x,y]  (expr);"));
14788   EXPECT_EQ("auto const &&[x, y](expr);",
14789             format("auto  const  &&  [x,y]  (expr);"));
14790   EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y]     {expr};"));
14791   EXPECT_EQ("auto const &[x, y]{expr};",
14792             format("auto  const  &  [x,y]  {expr};"));
14793   EXPECT_EQ("auto const &&[x, y]{expr};",
14794             format("auto  const  &&  [x,y]  {expr};"));
14795 
14796   format::FormatStyle Spaces = format::getLLVMStyle();
14797   Spaces.SpacesInSquareBrackets = true;
14798   verifyFormat("auto [ a, b ] = f();", Spaces);
14799   verifyFormat("auto &&[ a, b ] = f();", Spaces);
14800   verifyFormat("auto &[ a, b ] = f();", Spaces);
14801   verifyFormat("auto const &&[ a, b ] = f();", Spaces);
14802   verifyFormat("auto const &[ a, b ] = f();", Spaces);
14803 }
14804 
14805 TEST_F(FormatTest, FileAndCode) {
14806   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", ""));
14807   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", ""));
14808   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", ""));
14809   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", ""));
14810   EXPECT_EQ(FormatStyle::LK_ObjC,
14811             guessLanguage("foo.h", "@interface Foo\n@end\n"));
14812   EXPECT_EQ(
14813       FormatStyle::LK_ObjC,
14814       guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }"));
14815   EXPECT_EQ(FormatStyle::LK_ObjC,
14816             guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))"));
14817   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;"));
14818   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", ""));
14819   EXPECT_EQ(FormatStyle::LK_ObjC,
14820             guessLanguage("foo", "@interface Foo\n@end\n"));
14821   EXPECT_EQ(FormatStyle::LK_ObjC,
14822             guessLanguage("foo.h", "int DoStuff(CGRect rect);\n"));
14823   EXPECT_EQ(
14824       FormatStyle::LK_ObjC,
14825       guessLanguage("foo.h",
14826                     "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n"));
14827   EXPECT_EQ(
14828       FormatStyle::LK_Cpp,
14829       guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;"));
14830 }
14831 
14832 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) {
14833   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];"));
14834   EXPECT_EQ(FormatStyle::LK_ObjC,
14835             guessLanguage("foo.h", "array[[calculator getIndex]];"));
14836   EXPECT_EQ(FormatStyle::LK_Cpp,
14837             guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];"));
14838   EXPECT_EQ(
14839       FormatStyle::LK_Cpp,
14840       guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];"));
14841   EXPECT_EQ(FormatStyle::LK_ObjC,
14842             guessLanguage("foo.h", "[[noreturn foo] bar];"));
14843   EXPECT_EQ(FormatStyle::LK_Cpp,
14844             guessLanguage("foo.h", "[[clang::fallthrough]];"));
14845   EXPECT_EQ(FormatStyle::LK_ObjC,
14846             guessLanguage("foo.h", "[[clang:fallthrough] foo];"));
14847   EXPECT_EQ(FormatStyle::LK_Cpp,
14848             guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];"));
14849   EXPECT_EQ(FormatStyle::LK_Cpp,
14850             guessLanguage("foo.h", "[[using clang: fallthrough]];"));
14851   EXPECT_EQ(FormatStyle::LK_ObjC,
14852             guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];"));
14853   EXPECT_EQ(FormatStyle::LK_Cpp,
14854             guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];"));
14855   EXPECT_EQ(
14856       FormatStyle::LK_Cpp,
14857       guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)"));
14858   EXPECT_EQ(
14859       FormatStyle::LK_Cpp,
14860       guessLanguage("foo.h",
14861                     "[[clang::callable_when(\"unconsumed\", \"unknown\")]]"));
14862   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]"));
14863 }
14864 
14865 TEST_F(FormatTest, GuessLanguageWithCaret) {
14866   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);"));
14867   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);"));
14868   EXPECT_EQ(FormatStyle::LK_ObjC,
14869             guessLanguage("foo.h", "int(^)(char, float);"));
14870   EXPECT_EQ(FormatStyle::LK_ObjC,
14871             guessLanguage("foo.h", "int(^foo)(char, float);"));
14872   EXPECT_EQ(FormatStyle::LK_ObjC,
14873             guessLanguage("foo.h", "int(^foo[10])(char, float);"));
14874   EXPECT_EQ(FormatStyle::LK_ObjC,
14875             guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);"));
14876   EXPECT_EQ(
14877       FormatStyle::LK_ObjC,
14878       guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);"));
14879 }
14880 
14881 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) {
14882   EXPECT_EQ(FormatStyle::LK_Cpp,
14883             guessLanguage("foo.h", "void f() {\n"
14884                                    "  asm (\"mov %[e], %[d]\"\n"
14885                                    "     : [d] \"=rm\" (d)\n"
14886                                    "       [e] \"rm\" (*e));\n"
14887                                    "}"));
14888   EXPECT_EQ(FormatStyle::LK_Cpp,
14889             guessLanguage("foo.h", "void f() {\n"
14890                                    "  _asm (\"mov %[e], %[d]\"\n"
14891                                    "     : [d] \"=rm\" (d)\n"
14892                                    "       [e] \"rm\" (*e));\n"
14893                                    "}"));
14894   EXPECT_EQ(FormatStyle::LK_Cpp,
14895             guessLanguage("foo.h", "void f() {\n"
14896                                    "  __asm (\"mov %[e], %[d]\"\n"
14897                                    "     : [d] \"=rm\" (d)\n"
14898                                    "       [e] \"rm\" (*e));\n"
14899                                    "}"));
14900   EXPECT_EQ(FormatStyle::LK_Cpp,
14901             guessLanguage("foo.h", "void f() {\n"
14902                                    "  __asm__ (\"mov %[e], %[d]\"\n"
14903                                    "     : [d] \"=rm\" (d)\n"
14904                                    "       [e] \"rm\" (*e));\n"
14905                                    "}"));
14906   EXPECT_EQ(FormatStyle::LK_Cpp,
14907             guessLanguage("foo.h", "void f() {\n"
14908                                    "  asm (\"mov %[e], %[d]\"\n"
14909                                    "     : [d] \"=rm\" (d),\n"
14910                                    "       [e] \"rm\" (*e));\n"
14911                                    "}"));
14912   EXPECT_EQ(FormatStyle::LK_Cpp,
14913             guessLanguage("foo.h", "void f() {\n"
14914                                    "  asm volatile (\"mov %[e], %[d]\"\n"
14915                                    "     : [d] \"=rm\" (d)\n"
14916                                    "       [e] \"rm\" (*e));\n"
14917                                    "}"));
14918 }
14919 
14920 TEST_F(FormatTest, GuessLanguageWithChildLines) {
14921   EXPECT_EQ(FormatStyle::LK_Cpp,
14922             guessLanguage("foo.h", "#define FOO ({ std::string s; })"));
14923   EXPECT_EQ(FormatStyle::LK_ObjC,
14924             guessLanguage("foo.h", "#define FOO ({ NSString *s; })"));
14925   EXPECT_EQ(
14926       FormatStyle::LK_Cpp,
14927       guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })"));
14928   EXPECT_EQ(
14929       FormatStyle::LK_ObjC,
14930       guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })"));
14931 }
14932 
14933 TEST_F(FormatTest, TypenameMacros) {
14934   std::vector<std::string> TypenameMacros = {"STACK_OF", "LIST", "TAILQ_ENTRY"};
14935 
14936   // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=30353
14937   FormatStyle Google = getGoogleStyleWithColumns(0);
14938   Google.TypenameMacros = TypenameMacros;
14939   verifyFormat("struct foo {\n"
14940                "  int bar;\n"
14941                "  TAILQ_ENTRY(a) bleh;\n"
14942                "};",
14943                Google);
14944 
14945   FormatStyle Macros = getLLVMStyle();
14946   Macros.TypenameMacros = TypenameMacros;
14947 
14948   verifyFormat("STACK_OF(int) a;", Macros);
14949   verifyFormat("STACK_OF(int) *a;", Macros);
14950   verifyFormat("STACK_OF(int const *) *a;", Macros);
14951   verifyFormat("STACK_OF(int *const) *a;", Macros);
14952   verifyFormat("STACK_OF(int, string) a;", Macros);
14953   verifyFormat("STACK_OF(LIST(int)) a;", Macros);
14954   verifyFormat("STACK_OF(LIST(int)) a, b;", Macros);
14955   verifyFormat("for (LIST(int) *a = NULL; a;) {\n}", Macros);
14956   verifyFormat("STACK_OF(int) f(LIST(int) *arg);", Macros);
14957 
14958   Macros.PointerAlignment = FormatStyle::PAS_Left;
14959   verifyFormat("STACK_OF(int)* a;", Macros);
14960   verifyFormat("STACK_OF(int*)* a;", Macros);
14961 }
14962 
14963 TEST_F(FormatTest, AmbersandInLamda) {
14964   // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=41899
14965   FormatStyle AlignStyle = getLLVMStyle();
14966   AlignStyle.PointerAlignment = FormatStyle::PAS_Left;
14967   verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle);
14968   AlignStyle.PointerAlignment = FormatStyle::PAS_Right;
14969   verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle);
14970 }
14971 
14972 TEST_F(FormatTest, SpacesInConditionalStatement) {
14973   FormatStyle Spaces = getLLVMStyle();
14974   Spaces.SpacesInConditionalStatement = true;
14975   verifyFormat("for ( int i = 0; i; i++ )\n  continue;", Spaces);
14976   verifyFormat("if ( !a )\n  return;", Spaces);
14977   verifyFormat("if ( a )\n  return;", Spaces);
14978   verifyFormat("if constexpr ( a )\n  return;", Spaces);
14979   verifyFormat("switch ( a )\ncase 1:\n  return;", Spaces);
14980   verifyFormat("while ( a )\n  return;", Spaces);
14981   verifyFormat("while ( (a && b) )\n  return;", Spaces);
14982   verifyFormat("do {\n} while ( 1 != 0 );", Spaces);
14983   verifyFormat("try {\n} catch ( const std::exception & ) {\n}", Spaces);
14984   // Check that space on the left of "::" is inserted as expected at beginning
14985   // of condition.
14986   verifyFormat("while ( ::func() )\n  return;", Spaces);
14987 }
14988 
14989 TEST_F(FormatTest, AlternativeOperators) {
14990   // Test case for ensuring alternate operators are not
14991   // combined with their right most neighbour.
14992   verifyFormat("int a and b;");
14993   verifyFormat("int a and_eq b;");
14994   verifyFormat("int a bitand b;");
14995   verifyFormat("int a bitor b;");
14996   verifyFormat("int a compl b;");
14997   verifyFormat("int a not b;");
14998   verifyFormat("int a not_eq b;");
14999   verifyFormat("int a or b;");
15000   verifyFormat("int a xor b;");
15001   verifyFormat("int a xor_eq b;");
15002   verifyFormat("return this not_eq bitand other;");
15003   verifyFormat("bool operator not_eq(const X bitand other)");
15004 
15005   verifyFormat("int a and 5;");
15006   verifyFormat("int a and_eq 5;");
15007   verifyFormat("int a bitand 5;");
15008   verifyFormat("int a bitor 5;");
15009   verifyFormat("int a compl 5;");
15010   verifyFormat("int a not 5;");
15011   verifyFormat("int a not_eq 5;");
15012   verifyFormat("int a or 5;");
15013   verifyFormat("int a xor 5;");
15014   verifyFormat("int a xor_eq 5;");
15015 
15016   verifyFormat("int a compl(5);");
15017   verifyFormat("int a not(5);");
15018 
15019   /* FIXME handle alternate tokens
15020    * https://en.cppreference.com/w/cpp/language/operator_alternative
15021   // alternative tokens
15022   verifyFormat("compl foo();");     //  ~foo();
15023   verifyFormat("foo() <%%>;");      // foo();
15024   verifyFormat("void foo() <%%>;"); // void foo(){}
15025   verifyFormat("int a <:1:>;");     // int a[1];[
15026   verifyFormat("%:define ABC abc"); // #define ABC abc
15027   verifyFormat("%:%:");             // ##
15028   */
15029 }
15030 
15031 TEST_F(FormatTest, STLWhileNotDefineChed) {
15032   verifyFormat("#if defined(while)\n"
15033                "#define while EMIT WARNING C4005\n"
15034                "#endif // while");
15035 }
15036 
15037 TEST_F(FormatTest, OperatorSpacing) {
15038   FormatStyle Style = getLLVMStyle();
15039   Style.PointerAlignment = FormatStyle::PAS_Right;
15040   verifyFormat("Foo::operator*();", Style);
15041   verifyFormat("Foo::operator void *();", Style);
15042   verifyFormat("Foo::operator()(void *);", Style);
15043   verifyFormat("Foo::operator*(void *);", Style);
15044   verifyFormat("Foo::operator*();", Style);
15045   verifyFormat("operator*(int (*)(), class Foo);", Style);
15046 
15047   verifyFormat("Foo::operator&();", Style);
15048   verifyFormat("Foo::operator void &();", Style);
15049   verifyFormat("Foo::operator()(void &);", Style);
15050   verifyFormat("Foo::operator&(void &);", Style);
15051   verifyFormat("Foo::operator&();", Style);
15052   verifyFormat("operator&(int (&)(), class Foo);", Style);
15053 
15054   verifyFormat("Foo::operator&&();", Style);
15055   verifyFormat("Foo::operator void &&();", Style);
15056   verifyFormat("Foo::operator()(void &&);", Style);
15057   verifyFormat("Foo::operator&&(void &&);", Style);
15058   verifyFormat("Foo::operator&&();", Style);
15059   verifyFormat("operator&&(int(&&)(), class Foo);", Style);
15060 
15061   Style.PointerAlignment = FormatStyle::PAS_Left;
15062   verifyFormat("Foo::operator*();", Style);
15063   verifyFormat("Foo::operator void*();", Style);
15064   verifyFormat("Foo::operator/*comment*/ void*();", Style);
15065   verifyFormat("Foo::operator/*a*/ const /*b*/ void*();", Style);
15066   verifyFormat("Foo::operator/*a*/ volatile /*b*/ void*();", Style);
15067   verifyFormat("Foo::operator()(void*);", Style);
15068   verifyFormat("Foo::operator*(void*);", Style);
15069   verifyFormat("Foo::operator*();", Style);
15070   verifyFormat("operator*(int (*)(), class Foo);", Style);
15071 
15072   verifyFormat("Foo::operator&();", Style);
15073   verifyFormat("Foo::operator void&();", Style);
15074   verifyFormat("Foo::operator/*comment*/ void&();", Style);
15075   verifyFormat("Foo::operator/*a*/ const /*b*/ void&();", Style);
15076   verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&();", Style);
15077   verifyFormat("Foo::operator()(void&);", Style);
15078   verifyFormat("Foo::operator&(void&);", Style);
15079   verifyFormat("Foo::operator&();", Style);
15080   verifyFormat("operator&(int (&)(), class Foo);", Style);
15081 
15082   verifyFormat("Foo::operator&&();", Style);
15083   verifyFormat("Foo::operator void&&();", Style);
15084   verifyFormat("Foo::operator/*comment*/ void&&();", Style);
15085   verifyFormat("Foo::operator/*a*/ const /*b*/ void&&();", Style);
15086   verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&&();", Style);
15087   verifyFormat("Foo::operator()(void&&);", Style);
15088   verifyFormat("Foo::operator&&(void&&);", Style);
15089   verifyFormat("Foo::operator&&();", Style);
15090   verifyFormat("operator&&(int(&&)(), class Foo);", Style);
15091 
15092   Style.PointerAlignment = FormatStyle::PAS_Middle;
15093   verifyFormat("Foo::operator*();", Style);
15094   verifyFormat("Foo::operator void *();", Style);
15095   verifyFormat("Foo::operator()(void *);", Style);
15096   verifyFormat("Foo::operator*(void *);", Style);
15097   verifyFormat("Foo::operator*();", Style);
15098   verifyFormat("operator*(int (*)(), class Foo);", Style);
15099 
15100   verifyFormat("Foo::operator&();", Style);
15101   verifyFormat("Foo::operator void &();", Style);
15102   verifyFormat("Foo::operator()(void &);", Style);
15103   verifyFormat("Foo::operator&(void &);", Style);
15104   verifyFormat("Foo::operator&();", Style);
15105   verifyFormat("operator&(int (&)(), class Foo);", Style);
15106 
15107   verifyFormat("Foo::operator&&();", Style);
15108   verifyFormat("Foo::operator void &&();", Style);
15109   verifyFormat("Foo::operator()(void &&);", Style);
15110   verifyFormat("Foo::operator&&(void &&);", Style);
15111   verifyFormat("Foo::operator&&();", Style);
15112   verifyFormat("operator&&(int(&&)(), class Foo);", Style);
15113 }
15114 
15115 } // namespace
15116 } // namespace format
15117 } // namespace clang
15118