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   verifyFormat("do a++;\n"
560                "while (true);",
561                AllowsMergedLoops);
562   verifyFormat("do /* Don't merge */\n"
563                "  a++;\n"
564                "while (true);",
565                AllowsMergedLoops);
566   verifyFormat("do // Don't merge\n"
567                "  a++;\n"
568                "while (true);",
569                AllowsMergedLoops);
570   verifyFormat("do\n"
571                "  // Don't merge\n"
572                "  a++;\n"
573                "while (true);",
574                AllowsMergedLoops);
575   // Without braces labels are interpreted differently.
576   verifyFormat("{\n"
577                "  do\n"
578                "  label:\n"
579                "    a++;\n"
580                "  while (true);\n"
581                "}",
582                AllowsMergedLoops);
583 }
584 
585 TEST_F(FormatTest, FormatShortBracedStatements) {
586   FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
587   AllowSimpleBracedStatements.ColumnLimit = 40;
588   AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine =
589       FormatStyle::SBS_Always;
590 
591   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine =
592       FormatStyle::SIS_WithoutElse;
593   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
594 
595   AllowSimpleBracedStatements.BreakBeforeBraces = FormatStyle::BS_Custom;
596   AllowSimpleBracedStatements.BraceWrapping.AfterFunction = true;
597   AllowSimpleBracedStatements.BraceWrapping.SplitEmptyRecord = false;
598 
599   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
600   verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
601   verifyFormat("if CONSTEXPR (true) {}", AllowSimpleBracedStatements);
602   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
603   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
604   verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
605   verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
606   verifyFormat("if CONSTEXPR (true) { f(); }", AllowSimpleBracedStatements);
607   verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
608   verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
609   verifyFormat("if (true) { fffffffffffffffffffffff(); }",
610                AllowSimpleBracedStatements);
611   verifyFormat("if (true) {\n"
612                "  ffffffffffffffffffffffff();\n"
613                "}",
614                AllowSimpleBracedStatements);
615   verifyFormat("if (true) {\n"
616                "  ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
617                "}",
618                AllowSimpleBracedStatements);
619   verifyFormat("if (true) { //\n"
620                "  f();\n"
621                "}",
622                AllowSimpleBracedStatements);
623   verifyFormat("if (true) {\n"
624                "  f();\n"
625                "  f();\n"
626                "}",
627                AllowSimpleBracedStatements);
628   verifyFormat("if (true) {\n"
629                "  f();\n"
630                "} else {\n"
631                "  f();\n"
632                "}",
633                AllowSimpleBracedStatements);
634 
635   verifyFormat("struct A2 {\n"
636                "  int X;\n"
637                "};",
638                AllowSimpleBracedStatements);
639   verifyFormat("typedef struct A2 {\n"
640                "  int X;\n"
641                "} A2_t;",
642                AllowSimpleBracedStatements);
643   verifyFormat("template <int> struct A2 {\n"
644                "  struct B {};\n"
645                "};",
646                AllowSimpleBracedStatements);
647 
648   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine =
649       FormatStyle::SIS_Never;
650   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
651   verifyFormat("if (true) {\n"
652                "  f();\n"
653                "}",
654                AllowSimpleBracedStatements);
655   verifyFormat("if (true) {\n"
656                "  f();\n"
657                "} else {\n"
658                "  f();\n"
659                "}",
660                AllowSimpleBracedStatements);
661 
662   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
663   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
664   verifyFormat("while (true) {\n"
665                "  f();\n"
666                "}",
667                AllowSimpleBracedStatements);
668   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
669   verifyFormat("for (;;) {\n"
670                "  f();\n"
671                "}",
672                AllowSimpleBracedStatements);
673 
674   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine =
675       FormatStyle::SIS_WithoutElse;
676   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
677   AllowSimpleBracedStatements.BraceWrapping.AfterControlStatement =
678       FormatStyle::BWACS_Always;
679 
680   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
681   verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
682   verifyFormat("if CONSTEXPR (true) {}", AllowSimpleBracedStatements);
683   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
684   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
685   verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
686   verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
687   verifyFormat("if CONSTEXPR (true) { f(); }", AllowSimpleBracedStatements);
688   verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
689   verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
690   verifyFormat("if (true) { fffffffffffffffffffffff(); }",
691                AllowSimpleBracedStatements);
692   verifyFormat("if (true)\n"
693                "{\n"
694                "  ffffffffffffffffffffffff();\n"
695                "}",
696                AllowSimpleBracedStatements);
697   verifyFormat("if (true)\n"
698                "{\n"
699                "  ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
700                "}",
701                AllowSimpleBracedStatements);
702   verifyFormat("if (true)\n"
703                "{ //\n"
704                "  f();\n"
705                "}",
706                AllowSimpleBracedStatements);
707   verifyFormat("if (true)\n"
708                "{\n"
709                "  f();\n"
710                "  f();\n"
711                "}",
712                AllowSimpleBracedStatements);
713   verifyFormat("if (true)\n"
714                "{\n"
715                "  f();\n"
716                "} else\n"
717                "{\n"
718                "  f();\n"
719                "}",
720                AllowSimpleBracedStatements);
721 
722   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine =
723       FormatStyle::SIS_Never;
724   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
725   verifyFormat("if (true)\n"
726                "{\n"
727                "  f();\n"
728                "}",
729                AllowSimpleBracedStatements);
730   verifyFormat("if (true)\n"
731                "{\n"
732                "  f();\n"
733                "} else\n"
734                "{\n"
735                "  f();\n"
736                "}",
737                AllowSimpleBracedStatements);
738 
739   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
740   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
741   verifyFormat("while (true)\n"
742                "{\n"
743                "  f();\n"
744                "}",
745                AllowSimpleBracedStatements);
746   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
747   verifyFormat("for (;;)\n"
748                "{\n"
749                "  f();\n"
750                "}",
751                AllowSimpleBracedStatements);
752 }
753 
754 TEST_F(FormatTest, ShortBlocksInMacrosDontMergeWithCodeAfterMacro) {
755   FormatStyle Style = getLLVMStyleWithColumns(60);
756   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always;
757   Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse;
758   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
759   EXPECT_EQ("#define A                                                  \\\n"
760             "  if (HANDLEwernufrnuLwrmviferuvnierv)                     \\\n"
761             "  {                                                        \\\n"
762             "    RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier;               \\\n"
763             "  }\n"
764             "X;",
765             format("#define A \\\n"
766                    "   if (HANDLEwernufrnuLwrmviferuvnierv) { \\\n"
767                    "      RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; \\\n"
768                    "   }\n"
769                    "X;",
770                    Style));
771 }
772 
773 TEST_F(FormatTest, ParseIfElse) {
774   verifyFormat("if (true)\n"
775                "  if (true)\n"
776                "    if (true)\n"
777                "      f();\n"
778                "    else\n"
779                "      g();\n"
780                "  else\n"
781                "    h();\n"
782                "else\n"
783                "  i();");
784   verifyFormat("if (true)\n"
785                "  if (true)\n"
786                "    if (true) {\n"
787                "      if (true)\n"
788                "        f();\n"
789                "    } else {\n"
790                "      g();\n"
791                "    }\n"
792                "  else\n"
793                "    h();\n"
794                "else {\n"
795                "  i();\n"
796                "}");
797   verifyFormat("if (true)\n"
798                "  if constexpr (true)\n"
799                "    if (true) {\n"
800                "      if constexpr (true)\n"
801                "        f();\n"
802                "    } else {\n"
803                "      g();\n"
804                "    }\n"
805                "  else\n"
806                "    h();\n"
807                "else {\n"
808                "  i();\n"
809                "}");
810   verifyFormat("if (true)\n"
811                "  if CONSTEXPR (true)\n"
812                "    if (true) {\n"
813                "      if CONSTEXPR (true)\n"
814                "        f();\n"
815                "    } else {\n"
816                "      g();\n"
817                "    }\n"
818                "  else\n"
819                "    h();\n"
820                "else {\n"
821                "  i();\n"
822                "}");
823   verifyFormat("void f() {\n"
824                "  if (a) {\n"
825                "  } else {\n"
826                "  }\n"
827                "}");
828 }
829 
830 TEST_F(FormatTest, ElseIf) {
831   verifyFormat("if (a) {\n} else if (b) {\n}");
832   verifyFormat("if (a)\n"
833                "  f();\n"
834                "else if (b)\n"
835                "  g();\n"
836                "else\n"
837                "  h();");
838   verifyFormat("if constexpr (a)\n"
839                "  f();\n"
840                "else if constexpr (b)\n"
841                "  g();\n"
842                "else\n"
843                "  h();");
844   verifyFormat("if CONSTEXPR (a)\n"
845                "  f();\n"
846                "else if CONSTEXPR (b)\n"
847                "  g();\n"
848                "else\n"
849                "  h();");
850   verifyFormat("if (a) {\n"
851                "  f();\n"
852                "}\n"
853                "// or else ..\n"
854                "else {\n"
855                "  g()\n"
856                "}");
857 
858   verifyFormat("if (a) {\n"
859                "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
860                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
861                "}");
862   verifyFormat("if (a) {\n"
863                "} else if constexpr (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
864                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
865                "}");
866   verifyFormat("if (a) {\n"
867                "} else if CONSTEXPR (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
868                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
869                "}");
870   verifyFormat("if (a) {\n"
871                "} else if (\n"
872                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
873                "}",
874                getLLVMStyleWithColumns(62));
875   verifyFormat("if (a) {\n"
876                "} else if constexpr (\n"
877                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
878                "}",
879                getLLVMStyleWithColumns(62));
880   verifyFormat("if (a) {\n"
881                "} else if CONSTEXPR (\n"
882                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
883                "}",
884                getLLVMStyleWithColumns(62));
885 }
886 
887 TEST_F(FormatTest, FormatsForLoop) {
888   verifyFormat(
889       "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
890       "     ++VeryVeryLongLoopVariable)\n"
891       "  ;");
892   verifyFormat("for (;;)\n"
893                "  f();");
894   verifyFormat("for (;;) {\n}");
895   verifyFormat("for (;;) {\n"
896                "  f();\n"
897                "}");
898   verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
899 
900   verifyFormat(
901       "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
902       "                                          E = UnwrappedLines.end();\n"
903       "     I != E; ++I) {\n}");
904 
905   verifyFormat(
906       "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
907       "     ++IIIII) {\n}");
908   verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
909                "         aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
910                "     aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
911   verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
912                "         I = FD->getDeclsInPrototypeScope().begin(),\n"
913                "         E = FD->getDeclsInPrototypeScope().end();\n"
914                "     I != E; ++I) {\n}");
915   verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
916                "         I = Container.begin(),\n"
917                "         E = Container.end();\n"
918                "     I != E; ++I) {\n}",
919                getLLVMStyleWithColumns(76));
920 
921   verifyFormat(
922       "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
923       "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
924       "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
925       "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
926       "     ++aaaaaaaaaaa) {\n}");
927   verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
928                "                bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
929                "     ++i) {\n}");
930   verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
931                "     aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
932                "}");
933   verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
934                "         aaaaaaaaaa);\n"
935                "     iter; ++iter) {\n"
936                "}");
937   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
938                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
939                "     aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
940                "     ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
941 
942   // These should not be formatted as Objective-C for-in loops.
943   verifyFormat("for (Foo *x = 0; x != in; x++) {\n}");
944   verifyFormat("Foo *x;\nfor (x = 0; x != in; x++) {\n}");
945   verifyFormat("Foo *x;\nfor (x in y) {\n}");
946   verifyFormat(
947       "for (const Foo<Bar> &baz = in.value(); !baz.at_end(); ++baz) {\n}");
948 
949   FormatStyle NoBinPacking = getLLVMStyle();
950   NoBinPacking.BinPackParameters = false;
951   verifyFormat("for (int aaaaaaaaaaa = 1;\n"
952                "     aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
953                "                                           aaaaaaaaaaaaaaaa,\n"
954                "                                           aaaaaaaaaaaaaaaa,\n"
955                "                                           aaaaaaaaaaaaaaaa);\n"
956                "     aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
957                "}",
958                NoBinPacking);
959   verifyFormat(
960       "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
961       "                                          E = UnwrappedLines.end();\n"
962       "     I != E;\n"
963       "     ++I) {\n}",
964       NoBinPacking);
965 
966   FormatStyle AlignLeft = getLLVMStyle();
967   AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
968   verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft);
969 }
970 
971 TEST_F(FormatTest, RangeBasedForLoops) {
972   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
973                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
974   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
975                "     aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
976   verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
977                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
978   verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
979                "     aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
980 }
981 
982 TEST_F(FormatTest, ForEachLoops) {
983   verifyFormat("void f() {\n"
984                "  foreach (Item *item, itemlist) {}\n"
985                "  Q_FOREACH (Item *item, itemlist) {}\n"
986                "  BOOST_FOREACH (Item *item, itemlist) {}\n"
987                "  UNKNOWN_FORACH(Item * item, itemlist) {}\n"
988                "}");
989 
990   FormatStyle Style = getLLVMStyle();
991   Style.SpaceBeforeParens =
992       FormatStyle::SBPO_ControlStatementsExceptForEachMacros;
993   verifyFormat("void f() {\n"
994                "  foreach(Item *item, itemlist) {}\n"
995                "  Q_FOREACH(Item *item, itemlist) {}\n"
996                "  BOOST_FOREACH(Item *item, itemlist) {}\n"
997                "  UNKNOWN_FORACH(Item * item, itemlist) {}\n"
998                "}",
999                Style);
1000 
1001   // As function-like macros.
1002   verifyFormat("#define foreach(x, y)\n"
1003                "#define Q_FOREACH(x, y)\n"
1004                "#define BOOST_FOREACH(x, y)\n"
1005                "#define UNKNOWN_FOREACH(x, y)\n");
1006 
1007   // Not as function-like macros.
1008   verifyFormat("#define foreach (x, y)\n"
1009                "#define Q_FOREACH (x, y)\n"
1010                "#define BOOST_FOREACH (x, y)\n"
1011                "#define UNKNOWN_FOREACH (x, y)\n");
1012 
1013   // handle microsoft non standard extension
1014   verifyFormat("for each (char c in x->MyStringProperty)");
1015 }
1016 
1017 TEST_F(FormatTest, FormatsWhileLoop) {
1018   verifyFormat("while (true) {\n}");
1019   verifyFormat("while (true)\n"
1020                "  f();");
1021   verifyFormat("while () {\n}");
1022   verifyFormat("while () {\n"
1023                "  f();\n"
1024                "}");
1025 }
1026 
1027 TEST_F(FormatTest, FormatsDoWhile) {
1028   verifyFormat("do {\n"
1029                "  do_something();\n"
1030                "} while (something());");
1031   verifyFormat("do\n"
1032                "  do_something();\n"
1033                "while (something());");
1034 }
1035 
1036 TEST_F(FormatTest, FormatsSwitchStatement) {
1037   verifyFormat("switch (x) {\n"
1038                "case 1:\n"
1039                "  f();\n"
1040                "  break;\n"
1041                "case kFoo:\n"
1042                "case ns::kBar:\n"
1043                "case kBaz:\n"
1044                "  break;\n"
1045                "default:\n"
1046                "  g();\n"
1047                "  break;\n"
1048                "}");
1049   verifyFormat("switch (x) {\n"
1050                "case 1: {\n"
1051                "  f();\n"
1052                "  break;\n"
1053                "}\n"
1054                "case 2: {\n"
1055                "  break;\n"
1056                "}\n"
1057                "}");
1058   verifyFormat("switch (x) {\n"
1059                "case 1: {\n"
1060                "  f();\n"
1061                "  {\n"
1062                "    g();\n"
1063                "    h();\n"
1064                "  }\n"
1065                "  break;\n"
1066                "}\n"
1067                "}");
1068   verifyFormat("switch (x) {\n"
1069                "case 1: {\n"
1070                "  f();\n"
1071                "  if (foo) {\n"
1072                "    g();\n"
1073                "    h();\n"
1074                "  }\n"
1075                "  break;\n"
1076                "}\n"
1077                "}");
1078   verifyFormat("switch (x) {\n"
1079                "case 1: {\n"
1080                "  f();\n"
1081                "  g();\n"
1082                "} break;\n"
1083                "}");
1084   verifyFormat("switch (test)\n"
1085                "  ;");
1086   verifyFormat("switch (x) {\n"
1087                "default: {\n"
1088                "  // Do nothing.\n"
1089                "}\n"
1090                "}");
1091   verifyFormat("switch (x) {\n"
1092                "// comment\n"
1093                "// if 1, do f()\n"
1094                "case 1:\n"
1095                "  f();\n"
1096                "}");
1097   verifyFormat("switch (x) {\n"
1098                "case 1:\n"
1099                "  // Do amazing stuff\n"
1100                "  {\n"
1101                "    f();\n"
1102                "    g();\n"
1103                "  }\n"
1104                "  break;\n"
1105                "}");
1106   verifyFormat("#define A          \\\n"
1107                "  switch (x) {     \\\n"
1108                "  case a:          \\\n"
1109                "    foo = b;       \\\n"
1110                "  }",
1111                getLLVMStyleWithColumns(20));
1112   verifyFormat("#define OPERATION_CASE(name)           \\\n"
1113                "  case OP_name:                        \\\n"
1114                "    return operations::Operation##name\n",
1115                getLLVMStyleWithColumns(40));
1116   verifyFormat("switch (x) {\n"
1117                "case 1:;\n"
1118                "default:;\n"
1119                "  int i;\n"
1120                "}");
1121 
1122   verifyGoogleFormat("switch (x) {\n"
1123                      "  case 1:\n"
1124                      "    f();\n"
1125                      "    break;\n"
1126                      "  case kFoo:\n"
1127                      "  case ns::kBar:\n"
1128                      "  case kBaz:\n"
1129                      "    break;\n"
1130                      "  default:\n"
1131                      "    g();\n"
1132                      "    break;\n"
1133                      "}");
1134   verifyGoogleFormat("switch (x) {\n"
1135                      "  case 1: {\n"
1136                      "    f();\n"
1137                      "    break;\n"
1138                      "  }\n"
1139                      "}");
1140   verifyGoogleFormat("switch (test)\n"
1141                      "  ;");
1142 
1143   verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
1144                      "  case OP_name:              \\\n"
1145                      "    return operations::Operation##name\n");
1146   verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
1147                      "  // Get the correction operation class.\n"
1148                      "  switch (OpCode) {\n"
1149                      "    CASE(Add);\n"
1150                      "    CASE(Subtract);\n"
1151                      "    default:\n"
1152                      "      return operations::Unknown;\n"
1153                      "  }\n"
1154                      "#undef OPERATION_CASE\n"
1155                      "}");
1156   verifyFormat("DEBUG({\n"
1157                "  switch (x) {\n"
1158                "  case A:\n"
1159                "    f();\n"
1160                "    break;\n"
1161                "    // fallthrough\n"
1162                "  case B:\n"
1163                "    g();\n"
1164                "    break;\n"
1165                "  }\n"
1166                "});");
1167   EXPECT_EQ("DEBUG({\n"
1168             "  switch (x) {\n"
1169             "  case A:\n"
1170             "    f();\n"
1171             "    break;\n"
1172             "  // On B:\n"
1173             "  case B:\n"
1174             "    g();\n"
1175             "    break;\n"
1176             "  }\n"
1177             "});",
1178             format("DEBUG({\n"
1179                    "  switch (x) {\n"
1180                    "  case A:\n"
1181                    "    f();\n"
1182                    "    break;\n"
1183                    "  // On B:\n"
1184                    "  case B:\n"
1185                    "    g();\n"
1186                    "    break;\n"
1187                    "  }\n"
1188                    "});",
1189                    getLLVMStyle()));
1190   EXPECT_EQ("switch (n) {\n"
1191             "case 0: {\n"
1192             "  return false;\n"
1193             "}\n"
1194             "default: {\n"
1195             "  return true;\n"
1196             "}\n"
1197             "}",
1198             format("switch (n)\n"
1199                    "{\n"
1200                    "case 0: {\n"
1201                    "  return false;\n"
1202                    "}\n"
1203                    "default: {\n"
1204                    "  return true;\n"
1205                    "}\n"
1206                    "}",
1207                    getLLVMStyle()));
1208   verifyFormat("switch (a) {\n"
1209                "case (b):\n"
1210                "  return;\n"
1211                "}");
1212 
1213   verifyFormat("switch (a) {\n"
1214                "case some_namespace::\n"
1215                "    some_constant:\n"
1216                "  return;\n"
1217                "}",
1218                getLLVMStyleWithColumns(34));
1219 
1220   FormatStyle Style = getLLVMStyle();
1221   Style.IndentCaseLabels = true;
1222   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never;
1223   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1224   Style.BraceWrapping.AfterCaseLabel = true;
1225   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always;
1226   EXPECT_EQ("switch (n)\n"
1227             "{\n"
1228             "  case 0:\n"
1229             "  {\n"
1230             "    return false;\n"
1231             "  }\n"
1232             "  default:\n"
1233             "  {\n"
1234             "    return true;\n"
1235             "  }\n"
1236             "}",
1237             format("switch (n) {\n"
1238                    "  case 0: {\n"
1239                    "    return false;\n"
1240                    "  }\n"
1241                    "  default: {\n"
1242                    "    return true;\n"
1243                    "  }\n"
1244                    "}",
1245                    Style));
1246   Style.BraceWrapping.AfterCaseLabel = false;
1247   EXPECT_EQ("switch (n)\n"
1248             "{\n"
1249             "  case 0: {\n"
1250             "    return false;\n"
1251             "  }\n"
1252             "  default: {\n"
1253             "    return true;\n"
1254             "  }\n"
1255             "}",
1256             format("switch (n) {\n"
1257                    "  case 0:\n"
1258                    "  {\n"
1259                    "    return false;\n"
1260                    "  }\n"
1261                    "  default:\n"
1262                    "  {\n"
1263                    "    return true;\n"
1264                    "  }\n"
1265                    "}",
1266                    Style));
1267   Style.IndentCaseLabels = false;
1268   Style.IndentCaseBlocks = true;
1269   EXPECT_EQ("switch (n)\n"
1270             "{\n"
1271             "case 0:\n"
1272             "  {\n"
1273             "    return false;\n"
1274             "  }\n"
1275             "case 1:\n"
1276             "  break;\n"
1277             "default:\n"
1278             "  {\n"
1279             "    return true;\n"
1280             "  }\n"
1281             "}",
1282             format("switch (n) {\n"
1283                    "case 0: {\n"
1284                    "  return false;\n"
1285                    "}\n"
1286                    "case 1:\n"
1287                    "  break;\n"
1288                    "default: {\n"
1289                    "  return true;\n"
1290                    "}\n"
1291                    "}",
1292                    Style));
1293   Style.IndentCaseLabels = true;
1294   Style.IndentCaseBlocks = true;
1295   EXPECT_EQ("switch (n)\n"
1296             "{\n"
1297             "  case 0:\n"
1298             "    {\n"
1299             "      return false;\n"
1300             "    }\n"
1301             "  case 1:\n"
1302             "    break;\n"
1303             "  default:\n"
1304             "    {\n"
1305             "      return true;\n"
1306             "    }\n"
1307             "}",
1308             format("switch (n) {\n"
1309                    "case 0: {\n"
1310                    "  return false;\n"
1311                    "}\n"
1312                    "case 1:\n"
1313                    "  break;\n"
1314                    "default: {\n"
1315                    "  return true;\n"
1316                    "}\n"
1317                    "}",
1318                    Style));
1319 }
1320 
1321 TEST_F(FormatTest, CaseRanges) {
1322   verifyFormat("switch (x) {\n"
1323                "case 'A' ... 'Z':\n"
1324                "case 1 ... 5:\n"
1325                "case a ... b:\n"
1326                "  break;\n"
1327                "}");
1328 }
1329 
1330 TEST_F(FormatTest, ShortEnums) {
1331   FormatStyle Style = getLLVMStyle();
1332   Style.AllowShortEnumsOnASingleLine = true;
1333   verifyFormat("enum { A, B, C } ShortEnum1, ShortEnum2;", Style);
1334   Style.AllowShortEnumsOnASingleLine = false;
1335   verifyFormat("enum\n"
1336                "{\n"
1337                "  A,\n"
1338                "  B,\n"
1339                "  C\n"
1340                "} ShortEnum1, ShortEnum2;",
1341                Style);
1342 }
1343 
1344 TEST_F(FormatTest, ShortCaseLabels) {
1345   FormatStyle Style = getLLVMStyle();
1346   Style.AllowShortCaseLabelsOnASingleLine = true;
1347   verifyFormat("switch (a) {\n"
1348                "case 1: x = 1; break;\n"
1349                "case 2: return;\n"
1350                "case 3:\n"
1351                "case 4:\n"
1352                "case 5: return;\n"
1353                "case 6: // comment\n"
1354                "  return;\n"
1355                "case 7:\n"
1356                "  // comment\n"
1357                "  return;\n"
1358                "case 8:\n"
1359                "  x = 8; // comment\n"
1360                "  break;\n"
1361                "default: y = 1; break;\n"
1362                "}",
1363                Style);
1364   verifyFormat("switch (a) {\n"
1365                "case 0: return; // comment\n"
1366                "case 1: break;  // comment\n"
1367                "case 2: return;\n"
1368                "// comment\n"
1369                "case 3: return;\n"
1370                "// comment 1\n"
1371                "// comment 2\n"
1372                "// comment 3\n"
1373                "case 4: break; /* comment */\n"
1374                "case 5:\n"
1375                "  // comment\n"
1376                "  break;\n"
1377                "case 6: /* comment */ x = 1; break;\n"
1378                "case 7: x = /* comment */ 1; break;\n"
1379                "case 8:\n"
1380                "  x = 1; /* comment */\n"
1381                "  break;\n"
1382                "case 9:\n"
1383                "  break; // comment line 1\n"
1384                "         // comment line 2\n"
1385                "}",
1386                Style);
1387   EXPECT_EQ("switch (a) {\n"
1388             "case 1:\n"
1389             "  x = 8;\n"
1390             "  // fall through\n"
1391             "case 2: x = 8;\n"
1392             "// comment\n"
1393             "case 3:\n"
1394             "  return; /* comment line 1\n"
1395             "           * comment line 2 */\n"
1396             "case 4: i = 8;\n"
1397             "// something else\n"
1398             "#if FOO\n"
1399             "case 5: break;\n"
1400             "#endif\n"
1401             "}",
1402             format("switch (a) {\n"
1403                    "case 1: x = 8;\n"
1404                    "  // fall through\n"
1405                    "case 2:\n"
1406                    "  x = 8;\n"
1407                    "// comment\n"
1408                    "case 3:\n"
1409                    "  return; /* comment line 1\n"
1410                    "           * comment line 2 */\n"
1411                    "case 4:\n"
1412                    "  i = 8;\n"
1413                    "// something else\n"
1414                    "#if FOO\n"
1415                    "case 5: break;\n"
1416                    "#endif\n"
1417                    "}",
1418                    Style));
1419   EXPECT_EQ("switch (a) {\n"
1420             "case 0:\n"
1421             "  return; // long long long long long long long long long long "
1422             "long long comment\n"
1423             "          // line\n"
1424             "}",
1425             format("switch (a) {\n"
1426                    "case 0: return; // long long long long long long long long "
1427                    "long long long long comment line\n"
1428                    "}",
1429                    Style));
1430   EXPECT_EQ("switch (a) {\n"
1431             "case 0:\n"
1432             "  return; /* long long long long long long long long long long "
1433             "long long comment\n"
1434             "             line */\n"
1435             "}",
1436             format("switch (a) {\n"
1437                    "case 0: return; /* long long long long long long long long "
1438                    "long long long long comment line */\n"
1439                    "}",
1440                    Style));
1441   verifyFormat("switch (a) {\n"
1442                "#if FOO\n"
1443                "case 0: return 0;\n"
1444                "#endif\n"
1445                "}",
1446                Style);
1447   verifyFormat("switch (a) {\n"
1448                "case 1: {\n"
1449                "}\n"
1450                "case 2: {\n"
1451                "  return;\n"
1452                "}\n"
1453                "case 3: {\n"
1454                "  x = 1;\n"
1455                "  return;\n"
1456                "}\n"
1457                "case 4:\n"
1458                "  if (x)\n"
1459                "    return;\n"
1460                "}",
1461                Style);
1462   Style.ColumnLimit = 21;
1463   verifyFormat("switch (a) {\n"
1464                "case 1: x = 1; break;\n"
1465                "case 2: return;\n"
1466                "case 3:\n"
1467                "case 4:\n"
1468                "case 5: return;\n"
1469                "default:\n"
1470                "  y = 1;\n"
1471                "  break;\n"
1472                "}",
1473                Style);
1474   Style.ColumnLimit = 80;
1475   Style.AllowShortCaseLabelsOnASingleLine = false;
1476   Style.IndentCaseLabels = true;
1477   EXPECT_EQ("switch (n) {\n"
1478             "  default /*comments*/:\n"
1479             "    return true;\n"
1480             "  case 0:\n"
1481             "    return false;\n"
1482             "}",
1483             format("switch (n) {\n"
1484                    "default/*comments*/:\n"
1485                    "  return true;\n"
1486                    "case 0:\n"
1487                    "  return false;\n"
1488                    "}",
1489                    Style));
1490   Style.AllowShortCaseLabelsOnASingleLine = true;
1491   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1492   Style.BraceWrapping.AfterCaseLabel = true;
1493   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always;
1494   EXPECT_EQ("switch (n)\n"
1495             "{\n"
1496             "  case 0:\n"
1497             "  {\n"
1498             "    return false;\n"
1499             "  }\n"
1500             "  default:\n"
1501             "  {\n"
1502             "    return true;\n"
1503             "  }\n"
1504             "}",
1505             format("switch (n) {\n"
1506                    "  case 0: {\n"
1507                    "    return false;\n"
1508                    "  }\n"
1509                    "  default:\n"
1510                    "  {\n"
1511                    "    return true;\n"
1512                    "  }\n"
1513                    "}",
1514                    Style));
1515 }
1516 
1517 TEST_F(FormatTest, FormatsLabels) {
1518   verifyFormat("void f() {\n"
1519                "  some_code();\n"
1520                "test_label:\n"
1521                "  some_other_code();\n"
1522                "  {\n"
1523                "    some_more_code();\n"
1524                "  another_label:\n"
1525                "    some_more_code();\n"
1526                "  }\n"
1527                "}");
1528   verifyFormat("{\n"
1529                "  some_code();\n"
1530                "test_label:\n"
1531                "  some_other_code();\n"
1532                "}");
1533   verifyFormat("{\n"
1534                "  some_code();\n"
1535                "test_label:;\n"
1536                "  int i = 0;\n"
1537                "}");
1538   FormatStyle Style = getLLVMStyle();
1539   Style.IndentGotoLabels = false;
1540   verifyFormat("void f() {\n"
1541                "  some_code();\n"
1542                "test_label:\n"
1543                "  some_other_code();\n"
1544                "  {\n"
1545                "    some_more_code();\n"
1546                "another_label:\n"
1547                "    some_more_code();\n"
1548                "  }\n"
1549                "}",
1550                Style);
1551   verifyFormat("{\n"
1552                "  some_code();\n"
1553                "test_label:\n"
1554                "  some_other_code();\n"
1555                "}",
1556                Style);
1557   verifyFormat("{\n"
1558                "  some_code();\n"
1559                "test_label:;\n"
1560                "  int i = 0;\n"
1561                "}");
1562 }
1563 
1564 TEST_F(FormatTest, MultiLineControlStatements) {
1565   FormatStyle Style = getLLVMStyle();
1566   Style.BreakBeforeBraces = FormatStyle::BraceBreakingStyle::BS_Custom;
1567   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_MultiLine;
1568   Style.ColumnLimit = 20;
1569   // Short lines should keep opening brace on same line.
1570   EXPECT_EQ("if (foo) {\n"
1571             "  bar();\n"
1572             "}",
1573             format("if(foo){bar();}", Style));
1574   EXPECT_EQ("if (foo) {\n"
1575             "  bar();\n"
1576             "} else {\n"
1577             "  baz();\n"
1578             "}",
1579             format("if(foo){bar();}else{baz();}", Style));
1580   EXPECT_EQ("if (foo && bar) {\n"
1581             "  baz();\n"
1582             "}",
1583             format("if(foo&&bar){baz();}", Style));
1584   EXPECT_EQ("if (foo) {\n"
1585             "  bar();\n"
1586             "} else if (baz) {\n"
1587             "  quux();\n"
1588             "}",
1589             format("if(foo){bar();}else if(baz){quux();}", Style));
1590   EXPECT_EQ(
1591       "if (foo) {\n"
1592       "  bar();\n"
1593       "} else if (baz) {\n"
1594       "  quux();\n"
1595       "} else {\n"
1596       "  foobar();\n"
1597       "}",
1598       format("if(foo){bar();}else if(baz){quux();}else{foobar();}", Style));
1599   EXPECT_EQ("for (;;) {\n"
1600             "  foo();\n"
1601             "}",
1602             format("for(;;){foo();}"));
1603   EXPECT_EQ("while (1) {\n"
1604             "  foo();\n"
1605             "}",
1606             format("while(1){foo();}", Style));
1607   EXPECT_EQ("switch (foo) {\n"
1608             "case bar:\n"
1609             "  return;\n"
1610             "}",
1611             format("switch(foo){case bar:return;}", Style));
1612   EXPECT_EQ("try {\n"
1613             "  foo();\n"
1614             "} catch (...) {\n"
1615             "  bar();\n"
1616             "}",
1617             format("try{foo();}catch(...){bar();}", Style));
1618   EXPECT_EQ("do {\n"
1619             "  foo();\n"
1620             "} while (bar &&\n"
1621             "         baz);",
1622             format("do{foo();}while(bar&&baz);", Style));
1623   // Long lines should put opening brace on new line.
1624   EXPECT_EQ("if (foo && bar &&\n"
1625             "    baz)\n"
1626             "{\n"
1627             "  quux();\n"
1628             "}",
1629             format("if(foo&&bar&&baz){quux();}", Style));
1630   EXPECT_EQ("if (foo && bar &&\n"
1631             "    baz)\n"
1632             "{\n"
1633             "  quux();\n"
1634             "}",
1635             format("if (foo && bar &&\n"
1636                    "    baz) {\n"
1637                    "  quux();\n"
1638                    "}",
1639                    Style));
1640   EXPECT_EQ("if (foo) {\n"
1641             "  bar();\n"
1642             "} else if (baz ||\n"
1643             "           quux)\n"
1644             "{\n"
1645             "  foobar();\n"
1646             "}",
1647             format("if(foo){bar();}else if(baz||quux){foobar();}", Style));
1648   EXPECT_EQ(
1649       "if (foo) {\n"
1650       "  bar();\n"
1651       "} else if (baz ||\n"
1652       "           quux)\n"
1653       "{\n"
1654       "  foobar();\n"
1655       "} else {\n"
1656       "  barbaz();\n"
1657       "}",
1658       format("if(foo){bar();}else if(baz||quux){foobar();}else{barbaz();}",
1659              Style));
1660   EXPECT_EQ("for (int i = 0;\n"
1661             "     i < 10; ++i)\n"
1662             "{\n"
1663             "  foo();\n"
1664             "}",
1665             format("for(int i=0;i<10;++i){foo();}", Style));
1666   EXPECT_EQ("while (foo || bar ||\n"
1667             "       baz)\n"
1668             "{\n"
1669             "  quux();\n"
1670             "}",
1671             format("while(foo||bar||baz){quux();}", Style));
1672   EXPECT_EQ("switch (\n"
1673             "    foo = barbaz)\n"
1674             "{\n"
1675             "case quux:\n"
1676             "  return;\n"
1677             "}",
1678             format("switch(foo=barbaz){case quux:return;}", Style));
1679   EXPECT_EQ("try {\n"
1680             "  foo();\n"
1681             "} catch (\n"
1682             "    Exception &bar)\n"
1683             "{\n"
1684             "  baz();\n"
1685             "}",
1686             format("try{foo();}catch(Exception&bar){baz();}", Style));
1687   Style.ColumnLimit =
1688       40; // to concentrate at brace wrapping, not line wrap due to column limit
1689   EXPECT_EQ("try {\n"
1690             "  foo();\n"
1691             "} catch (Exception &bar) {\n"
1692             "  baz();\n"
1693             "}",
1694             format("try{foo();}catch(Exception&bar){baz();}", Style));
1695   Style.ColumnLimit =
1696       20; // to concentrate at brace wrapping, not line wrap due to column limit
1697 
1698   Style.BraceWrapping.BeforeElse = true;
1699   EXPECT_EQ(
1700       "if (foo) {\n"
1701       "  bar();\n"
1702       "}\n"
1703       "else if (baz ||\n"
1704       "         quux)\n"
1705       "{\n"
1706       "  foobar();\n"
1707       "}\n"
1708       "else {\n"
1709       "  barbaz();\n"
1710       "}",
1711       format("if(foo){bar();}else if(baz||quux){foobar();}else{barbaz();}",
1712              Style));
1713 
1714   Style.BraceWrapping.BeforeCatch = true;
1715   EXPECT_EQ("try {\n"
1716             "  foo();\n"
1717             "}\n"
1718             "catch (...) {\n"
1719             "  baz();\n"
1720             "}",
1721             format("try{foo();}catch(...){baz();}", Style));
1722 }
1723 
1724 TEST_F(FormatTest, BeforeWhile) {
1725   FormatStyle Style = getLLVMStyle();
1726   Style.BreakBeforeBraces = FormatStyle::BraceBreakingStyle::BS_Custom;
1727 
1728   verifyFormat("do {\n"
1729                "  foo();\n"
1730                "} while (1);",
1731                Style);
1732   Style.BraceWrapping.BeforeWhile = true;
1733   verifyFormat("do {\n"
1734                "  foo();\n"
1735                "}\n"
1736                "while (1);",
1737                Style);
1738 }
1739 
1740 //===----------------------------------------------------------------------===//
1741 // Tests for classes, namespaces, etc.
1742 //===----------------------------------------------------------------------===//
1743 
1744 TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
1745   verifyFormat("class A {};");
1746 }
1747 
1748 TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1749   verifyFormat("class A {\n"
1750                "public:\n"
1751                "public: // comment\n"
1752                "protected:\n"
1753                "private:\n"
1754                "  void f() {}\n"
1755                "};");
1756   verifyFormat("export class A {\n"
1757                "public:\n"
1758                "public: // comment\n"
1759                "protected:\n"
1760                "private:\n"
1761                "  void f() {}\n"
1762                "};");
1763   verifyGoogleFormat("class A {\n"
1764                      " public:\n"
1765                      " protected:\n"
1766                      " private:\n"
1767                      "  void f() {}\n"
1768                      "};");
1769   verifyGoogleFormat("export class A {\n"
1770                      " public:\n"
1771                      " protected:\n"
1772                      " private:\n"
1773                      "  void f() {}\n"
1774                      "};");
1775   verifyFormat("class A {\n"
1776                "public slots:\n"
1777                "  void f1() {}\n"
1778                "public Q_SLOTS:\n"
1779                "  void f2() {}\n"
1780                "protected slots:\n"
1781                "  void f3() {}\n"
1782                "protected Q_SLOTS:\n"
1783                "  void f4() {}\n"
1784                "private slots:\n"
1785                "  void f5() {}\n"
1786                "private Q_SLOTS:\n"
1787                "  void f6() {}\n"
1788                "signals:\n"
1789                "  void g1();\n"
1790                "Q_SIGNALS:\n"
1791                "  void g2();\n"
1792                "};");
1793 
1794   // Don't interpret 'signals' the wrong way.
1795   verifyFormat("signals.set();");
1796   verifyFormat("for (Signals signals : f()) {\n}");
1797   verifyFormat("{\n"
1798                "  signals.set(); // This needs indentation.\n"
1799                "}");
1800   verifyFormat("void f() {\n"
1801                "label:\n"
1802                "  signals.baz();\n"
1803                "}");
1804 }
1805 
1806 TEST_F(FormatTest, SeparatesLogicalBlocks) {
1807   EXPECT_EQ("class A {\n"
1808             "public:\n"
1809             "  void f();\n"
1810             "\n"
1811             "private:\n"
1812             "  void g() {}\n"
1813             "  // test\n"
1814             "protected:\n"
1815             "  int h;\n"
1816             "};",
1817             format("class A {\n"
1818                    "public:\n"
1819                    "void f();\n"
1820                    "private:\n"
1821                    "void g() {}\n"
1822                    "// test\n"
1823                    "protected:\n"
1824                    "int h;\n"
1825                    "};"));
1826   EXPECT_EQ("class A {\n"
1827             "protected:\n"
1828             "public:\n"
1829             "  void f();\n"
1830             "};",
1831             format("class A {\n"
1832                    "protected:\n"
1833                    "\n"
1834                    "public:\n"
1835                    "\n"
1836                    "  void f();\n"
1837                    "};"));
1838 
1839   // Even ensure proper spacing inside macros.
1840   EXPECT_EQ("#define B     \\\n"
1841             "  class A {   \\\n"
1842             "   protected: \\\n"
1843             "   public:    \\\n"
1844             "    void f(); \\\n"
1845             "  };",
1846             format("#define B     \\\n"
1847                    "  class A {   \\\n"
1848                    "   protected: \\\n"
1849                    "              \\\n"
1850                    "   public:    \\\n"
1851                    "              \\\n"
1852                    "    void f(); \\\n"
1853                    "  };",
1854                    getGoogleStyle()));
1855   // But don't remove empty lines after macros ending in access specifiers.
1856   EXPECT_EQ("#define A private:\n"
1857             "\n"
1858             "int i;",
1859             format("#define A         private:\n"
1860                    "\n"
1861                    "int              i;"));
1862 }
1863 
1864 TEST_F(FormatTest, FormatsClasses) {
1865   verifyFormat("class A : public B {};");
1866   verifyFormat("class A : public ::B {};");
1867 
1868   verifyFormat(
1869       "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1870       "                             public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
1871   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1872                "    : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1873                "      public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
1874   verifyFormat(
1875       "class A : public B, public C, public D, public E, public F {};");
1876   verifyFormat("class AAAAAAAAAAAA : public B,\n"
1877                "                     public C,\n"
1878                "                     public D,\n"
1879                "                     public E,\n"
1880                "                     public F,\n"
1881                "                     public G {};");
1882 
1883   verifyFormat("class\n"
1884                "    ReallyReallyLongClassName {\n"
1885                "  int i;\n"
1886                "};",
1887                getLLVMStyleWithColumns(32));
1888   verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1889                "                           aaaaaaaaaaaaaaaa> {};");
1890   verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1891                "    : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1892                "                                 aaaaaaaaaaaaaaaaaaaaaa> {};");
1893   verifyFormat("template <class R, class C>\n"
1894                "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1895                "    : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
1896   verifyFormat("class ::A::B {};");
1897 }
1898 
1899 TEST_F(FormatTest, BreakInheritanceStyle) {
1900   FormatStyle StyleWithInheritanceBreakBeforeComma = getLLVMStyle();
1901   StyleWithInheritanceBreakBeforeComma.BreakInheritanceList =
1902       FormatStyle::BILS_BeforeComma;
1903   verifyFormat("class MyClass : public X {};",
1904                StyleWithInheritanceBreakBeforeComma);
1905   verifyFormat("class MyClass\n"
1906                "    : public X\n"
1907                "    , public Y {};",
1908                StyleWithInheritanceBreakBeforeComma);
1909   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA\n"
1910                "    : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n"
1911                "    , public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};",
1912                StyleWithInheritanceBreakBeforeComma);
1913   verifyFormat("struct aaaaaaaaaaaaa\n"
1914                "    : public aaaaaaaaaaaaaaaaaaa< // break\n"
1915                "          aaaaaaaaaaaaaaaa> {};",
1916                StyleWithInheritanceBreakBeforeComma);
1917 
1918   FormatStyle StyleWithInheritanceBreakAfterColon = getLLVMStyle();
1919   StyleWithInheritanceBreakAfterColon.BreakInheritanceList =
1920       FormatStyle::BILS_AfterColon;
1921   verifyFormat("class MyClass : public X {};",
1922                StyleWithInheritanceBreakAfterColon);
1923   verifyFormat("class MyClass : public X, public Y {};",
1924                StyleWithInheritanceBreakAfterColon);
1925   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA :\n"
1926                "    public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1927                "    public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};",
1928                StyleWithInheritanceBreakAfterColon);
1929   verifyFormat("struct aaaaaaaaaaaaa :\n"
1930                "    public aaaaaaaaaaaaaaaaaaa< // break\n"
1931                "        aaaaaaaaaaaaaaaa> {};",
1932                StyleWithInheritanceBreakAfterColon);
1933 }
1934 
1935 TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
1936   verifyFormat("class A {\n} a, b;");
1937   verifyFormat("struct A {\n} a, b;");
1938   verifyFormat("union A {\n} a;");
1939 }
1940 
1941 TEST_F(FormatTest, FormatsEnum) {
1942   verifyFormat("enum {\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   verifyGoogleFormat("enum {\n"
1951                      "  Zero,\n"
1952                      "  One = 1,\n"
1953                      "  Two = One + 1,\n"
1954                      "  Three = (One + Two),\n"
1955                      "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1956                      "  Five = (One, Two, Three, Four, 5)\n"
1957                      "};");
1958   verifyFormat("enum Enum {};");
1959   verifyFormat("enum {};");
1960   verifyFormat("enum X E {} d;");
1961   verifyFormat("enum __attribute__((...)) E {} d;");
1962   verifyFormat("enum __declspec__((...)) E {} d;");
1963   verifyFormat("enum {\n"
1964                "  Bar = Foo<int, int>::value\n"
1965                "};",
1966                getLLVMStyleWithColumns(30));
1967 
1968   verifyFormat("enum ShortEnum { A, B, C };");
1969   verifyGoogleFormat("enum ShortEnum { A, B, C };");
1970 
1971   EXPECT_EQ("enum KeepEmptyLines {\n"
1972             "  ONE,\n"
1973             "\n"
1974             "  TWO,\n"
1975             "\n"
1976             "  THREE\n"
1977             "}",
1978             format("enum KeepEmptyLines {\n"
1979                    "  ONE,\n"
1980                    "\n"
1981                    "  TWO,\n"
1982                    "\n"
1983                    "\n"
1984                    "  THREE\n"
1985                    "}"));
1986   verifyFormat("enum E { // comment\n"
1987                "  ONE,\n"
1988                "  TWO\n"
1989                "};\n"
1990                "int i;");
1991 
1992   FormatStyle EightIndent = getLLVMStyle();
1993   EightIndent.IndentWidth = 8;
1994   verifyFormat("enum {\n"
1995                "        VOID,\n"
1996                "        CHAR,\n"
1997                "        SHORT,\n"
1998                "        INT,\n"
1999                "        LONG,\n"
2000                "        SIGNED,\n"
2001                "        UNSIGNED,\n"
2002                "        BOOL,\n"
2003                "        FLOAT,\n"
2004                "        DOUBLE,\n"
2005                "        COMPLEX\n"
2006                "};",
2007                EightIndent);
2008 
2009   // Not enums.
2010   verifyFormat("enum X f() {\n"
2011                "  a();\n"
2012                "  return 42;\n"
2013                "}");
2014   verifyFormat("enum X Type::f() {\n"
2015                "  a();\n"
2016                "  return 42;\n"
2017                "}");
2018   verifyFormat("enum ::X f() {\n"
2019                "  a();\n"
2020                "  return 42;\n"
2021                "}");
2022   verifyFormat("enum ns::X f() {\n"
2023                "  a();\n"
2024                "  return 42;\n"
2025                "}");
2026 }
2027 
2028 TEST_F(FormatTest, FormatsEnumsWithErrors) {
2029   verifyFormat("enum Type {\n"
2030                "  One = 0; // These semicolons should be commas.\n"
2031                "  Two = 1;\n"
2032                "};");
2033   verifyFormat("namespace n {\n"
2034                "enum Type {\n"
2035                "  One,\n"
2036                "  Two, // missing };\n"
2037                "  int i;\n"
2038                "}\n"
2039                "void g() {}");
2040 }
2041 
2042 TEST_F(FormatTest, FormatsEnumStruct) {
2043   verifyFormat("enum struct {\n"
2044                "  Zero,\n"
2045                "  One = 1,\n"
2046                "  Two = One + 1,\n"
2047                "  Three = (One + Two),\n"
2048                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
2049                "  Five = (One, Two, Three, Four, 5)\n"
2050                "};");
2051   verifyFormat("enum struct Enum {};");
2052   verifyFormat("enum struct {};");
2053   verifyFormat("enum struct X E {} d;");
2054   verifyFormat("enum struct __attribute__((...)) E {} d;");
2055   verifyFormat("enum struct __declspec__((...)) E {} d;");
2056   verifyFormat("enum struct X f() {\n  a();\n  return 42;\n}");
2057 }
2058 
2059 TEST_F(FormatTest, FormatsEnumClass) {
2060   verifyFormat("enum class {\n"
2061                "  Zero,\n"
2062                "  One = 1,\n"
2063                "  Two = One + 1,\n"
2064                "  Three = (One + Two),\n"
2065                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
2066                "  Five = (One, Two, Three, Four, 5)\n"
2067                "};");
2068   verifyFormat("enum class Enum {};");
2069   verifyFormat("enum class {};");
2070   verifyFormat("enum class X E {} d;");
2071   verifyFormat("enum class __attribute__((...)) E {} d;");
2072   verifyFormat("enum class __declspec__((...)) E {} d;");
2073   verifyFormat("enum class X f() {\n  a();\n  return 42;\n}");
2074 }
2075 
2076 TEST_F(FormatTest, FormatsEnumTypes) {
2077   verifyFormat("enum X : int {\n"
2078                "  A, // Force multiple lines.\n"
2079                "  B\n"
2080                "};");
2081   verifyFormat("enum X : int { A, B };");
2082   verifyFormat("enum X : std::uint32_t { A, B };");
2083 }
2084 
2085 TEST_F(FormatTest, FormatsTypedefEnum) {
2086   FormatStyle Style = getLLVMStyle();
2087   Style.ColumnLimit = 40;
2088   verifyFormat("typedef enum {} EmptyEnum;");
2089   verifyFormat("typedef enum { A, B, C } ShortEnum;");
2090   verifyFormat("typedef enum {\n"
2091                "  ZERO = 0,\n"
2092                "  ONE = 1,\n"
2093                "  TWO = 2,\n"
2094                "  THREE = 3\n"
2095                "} LongEnum;",
2096                Style);
2097   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2098   Style.BraceWrapping.AfterEnum = true;
2099   verifyFormat("typedef enum {} EmptyEnum;");
2100   verifyFormat("typedef enum { A, B, C } ShortEnum;");
2101   verifyFormat("typedef enum\n"
2102                "{\n"
2103                "  ZERO = 0,\n"
2104                "  ONE = 1,\n"
2105                "  TWO = 2,\n"
2106                "  THREE = 3\n"
2107                "} LongEnum;",
2108                Style);
2109 }
2110 
2111 TEST_F(FormatTest, FormatsNSEnums) {
2112   verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
2113   verifyGoogleFormat(
2114       "typedef NS_CLOSED_ENUM(NSInteger, SomeName) { AAA, BBB }");
2115   verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
2116                      "  // Information about someDecentlyLongValue.\n"
2117                      "  someDecentlyLongValue,\n"
2118                      "  // Information about anotherDecentlyLongValue.\n"
2119                      "  anotherDecentlyLongValue,\n"
2120                      "  // Information about aThirdDecentlyLongValue.\n"
2121                      "  aThirdDecentlyLongValue\n"
2122                      "};");
2123   verifyGoogleFormat("typedef NS_CLOSED_ENUM(NSInteger, MyType) {\n"
2124                      "  // Information about someDecentlyLongValue.\n"
2125                      "  someDecentlyLongValue,\n"
2126                      "  // Information about anotherDecentlyLongValue.\n"
2127                      "  anotherDecentlyLongValue,\n"
2128                      "  // Information about aThirdDecentlyLongValue.\n"
2129                      "  aThirdDecentlyLongValue\n"
2130                      "};");
2131   verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
2132                      "  a = 1,\n"
2133                      "  b = 2,\n"
2134                      "  c = 3,\n"
2135                      "};");
2136   verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
2137                      "  a = 1,\n"
2138                      "  b = 2,\n"
2139                      "  c = 3,\n"
2140                      "};");
2141   verifyGoogleFormat("typedef CF_CLOSED_ENUM(NSInteger, MyType) {\n"
2142                      "  a = 1,\n"
2143                      "  b = 2,\n"
2144                      "  c = 3,\n"
2145                      "};");
2146   verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
2147                      "  a = 1,\n"
2148                      "  b = 2,\n"
2149                      "  c = 3,\n"
2150                      "};");
2151 }
2152 
2153 TEST_F(FormatTest, FormatsBitfields) {
2154   verifyFormat("struct Bitfields {\n"
2155                "  unsigned sClass : 8;\n"
2156                "  unsigned ValueKind : 2;\n"
2157                "};");
2158   verifyFormat("struct A {\n"
2159                "  int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
2160                "      bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
2161                "};");
2162   verifyFormat("struct MyStruct {\n"
2163                "  uchar data;\n"
2164                "  uchar : 8;\n"
2165                "  uchar : 8;\n"
2166                "  uchar other;\n"
2167                "};");
2168   FormatStyle Style = getLLVMStyle();
2169   Style.BitFieldColonSpacing = FormatStyle::BFCS_None;
2170   verifyFormat("struct Bitfields {\n"
2171                "  unsigned sClass:8;\n"
2172                "  unsigned ValueKind:2;\n"
2173                "  uchar other;\n"
2174                "};",
2175                Style);
2176   verifyFormat("struct A {\n"
2177                "  int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:1,\n"
2178                "      bbbbbbbbbbbbbbbbbbbbbbbbb:2;\n"
2179                "};",
2180                Style);
2181   Style.BitFieldColonSpacing = FormatStyle::BFCS_Before;
2182   verifyFormat("struct Bitfields {\n"
2183                "  unsigned sClass :8;\n"
2184                "  unsigned ValueKind :2;\n"
2185                "  uchar other;\n"
2186                "};",
2187                Style);
2188   Style.BitFieldColonSpacing = FormatStyle::BFCS_After;
2189   verifyFormat("struct Bitfields {\n"
2190                "  unsigned sClass: 8;\n"
2191                "  unsigned ValueKind: 2;\n"
2192                "  uchar other;\n"
2193                "};",
2194                Style);
2195 }
2196 
2197 TEST_F(FormatTest, FormatsNamespaces) {
2198   FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
2199   LLVMWithNoNamespaceFix.FixNamespaceComments = false;
2200 
2201   verifyFormat("namespace some_namespace {\n"
2202                "class A {};\n"
2203                "void f() { f(); }\n"
2204                "}",
2205                LLVMWithNoNamespaceFix);
2206   verifyFormat("namespace N::inline D {\n"
2207                "class A {};\n"
2208                "void f() { f(); }\n"
2209                "}",
2210                LLVMWithNoNamespaceFix);
2211   verifyFormat("namespace N::inline D::E {\n"
2212                "class A {};\n"
2213                "void f() { f(); }\n"
2214                "}",
2215                LLVMWithNoNamespaceFix);
2216   verifyFormat("namespace [[deprecated(\"foo[bar\")]] some_namespace {\n"
2217                "class A {};\n"
2218                "void f() { f(); }\n"
2219                "}",
2220                LLVMWithNoNamespaceFix);
2221   verifyFormat("/* something */ namespace some_namespace {\n"
2222                "class A {};\n"
2223                "void f() { f(); }\n"
2224                "}",
2225                LLVMWithNoNamespaceFix);
2226   verifyFormat("namespace {\n"
2227                "class A {};\n"
2228                "void f() { f(); }\n"
2229                "}",
2230                LLVMWithNoNamespaceFix);
2231   verifyFormat("/* something */ namespace {\n"
2232                "class A {};\n"
2233                "void f() { f(); }\n"
2234                "}",
2235                LLVMWithNoNamespaceFix);
2236   verifyFormat("inline namespace X {\n"
2237                "class A {};\n"
2238                "void f() { f(); }\n"
2239                "}",
2240                LLVMWithNoNamespaceFix);
2241   verifyFormat("/* something */ inline namespace X {\n"
2242                "class A {};\n"
2243                "void f() { f(); }\n"
2244                "}",
2245                LLVMWithNoNamespaceFix);
2246   verifyFormat("export namespace X {\n"
2247                "class A {};\n"
2248                "void f() { f(); }\n"
2249                "}",
2250                LLVMWithNoNamespaceFix);
2251   verifyFormat("using namespace some_namespace;\n"
2252                "class A {};\n"
2253                "void f() { f(); }",
2254                LLVMWithNoNamespaceFix);
2255 
2256   // This code is more common than we thought; if we
2257   // layout this correctly the semicolon will go into
2258   // its own line, which is undesirable.
2259   verifyFormat("namespace {};", LLVMWithNoNamespaceFix);
2260   verifyFormat("namespace {\n"
2261                "class A {};\n"
2262                "};",
2263                LLVMWithNoNamespaceFix);
2264 
2265   verifyFormat("namespace {\n"
2266                "int SomeVariable = 0; // comment\n"
2267                "} // namespace",
2268                LLVMWithNoNamespaceFix);
2269   EXPECT_EQ("#ifndef HEADER_GUARD\n"
2270             "#define HEADER_GUARD\n"
2271             "namespace my_namespace {\n"
2272             "int i;\n"
2273             "} // my_namespace\n"
2274             "#endif // HEADER_GUARD",
2275             format("#ifndef HEADER_GUARD\n"
2276                    " #define HEADER_GUARD\n"
2277                    "   namespace my_namespace {\n"
2278                    "int i;\n"
2279                    "}    // my_namespace\n"
2280                    "#endif    // HEADER_GUARD",
2281                    LLVMWithNoNamespaceFix));
2282 
2283   EXPECT_EQ("namespace A::B {\n"
2284             "class C {};\n"
2285             "}",
2286             format("namespace A::B {\n"
2287                    "class C {};\n"
2288                    "}",
2289                    LLVMWithNoNamespaceFix));
2290 
2291   FormatStyle Style = getLLVMStyle();
2292   Style.NamespaceIndentation = FormatStyle::NI_All;
2293   EXPECT_EQ("namespace out {\n"
2294             "  int i;\n"
2295             "  namespace in {\n"
2296             "    int i;\n"
2297             "  } // namespace in\n"
2298             "} // namespace out",
2299             format("namespace out {\n"
2300                    "int i;\n"
2301                    "namespace in {\n"
2302                    "int i;\n"
2303                    "} // namespace in\n"
2304                    "} // namespace out",
2305                    Style));
2306 
2307   Style.NamespaceIndentation = FormatStyle::NI_Inner;
2308   EXPECT_EQ("namespace out {\n"
2309             "int i;\n"
2310             "namespace in {\n"
2311             "  int i;\n"
2312             "} // namespace in\n"
2313             "} // namespace out",
2314             format("namespace out {\n"
2315                    "int i;\n"
2316                    "namespace in {\n"
2317                    "int i;\n"
2318                    "} // namespace in\n"
2319                    "} // namespace out",
2320                    Style));
2321 }
2322 
2323 TEST_F(FormatTest, NamespaceMacros) {
2324   FormatStyle Style = getLLVMStyle();
2325   Style.NamespaceMacros.push_back("TESTSUITE");
2326 
2327   verifyFormat("TESTSUITE(A) {\n"
2328                "int foo();\n"
2329                "} // TESTSUITE(A)",
2330                Style);
2331 
2332   verifyFormat("TESTSUITE(A, B) {\n"
2333                "int foo();\n"
2334                "} // TESTSUITE(A)",
2335                Style);
2336 
2337   // Properly indent according to NamespaceIndentation style
2338   Style.NamespaceIndentation = FormatStyle::NI_All;
2339   verifyFormat("TESTSUITE(A) {\n"
2340                "  int foo();\n"
2341                "} // TESTSUITE(A)",
2342                Style);
2343   verifyFormat("TESTSUITE(A) {\n"
2344                "  namespace B {\n"
2345                "    int foo();\n"
2346                "  } // namespace B\n"
2347                "} // TESTSUITE(A)",
2348                Style);
2349   verifyFormat("namespace A {\n"
2350                "  TESTSUITE(B) {\n"
2351                "    int foo();\n"
2352                "  } // TESTSUITE(B)\n"
2353                "} // namespace A",
2354                Style);
2355 
2356   Style.NamespaceIndentation = FormatStyle::NI_Inner;
2357   verifyFormat("TESTSUITE(A) {\n"
2358                "TESTSUITE(B) {\n"
2359                "  int foo();\n"
2360                "} // TESTSUITE(B)\n"
2361                "} // TESTSUITE(A)",
2362                Style);
2363   verifyFormat("TESTSUITE(A) {\n"
2364                "namespace B {\n"
2365                "  int foo();\n"
2366                "} // namespace B\n"
2367                "} // TESTSUITE(A)",
2368                Style);
2369   verifyFormat("namespace A {\n"
2370                "TESTSUITE(B) {\n"
2371                "  int foo();\n"
2372                "} // TESTSUITE(B)\n"
2373                "} // namespace A",
2374                Style);
2375 
2376   // Properly merge namespace-macros blocks in CompactNamespaces mode
2377   Style.NamespaceIndentation = FormatStyle::NI_None;
2378   Style.CompactNamespaces = true;
2379   verifyFormat("TESTSUITE(A) { TESTSUITE(B) {\n"
2380                "}} // TESTSUITE(A::B)",
2381                Style);
2382 
2383   EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n"
2384             "}} // TESTSUITE(out::in)",
2385             format("TESTSUITE(out) {\n"
2386                    "TESTSUITE(in) {\n"
2387                    "} // TESTSUITE(in)\n"
2388                    "} // TESTSUITE(out)",
2389                    Style));
2390 
2391   EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n"
2392             "}} // TESTSUITE(out::in)",
2393             format("TESTSUITE(out) {\n"
2394                    "TESTSUITE(in) {\n"
2395                    "} // TESTSUITE(in)\n"
2396                    "} // TESTSUITE(out)",
2397                    Style));
2398 
2399   // Do not merge different namespaces/macros
2400   EXPECT_EQ("namespace out {\n"
2401             "TESTSUITE(in) {\n"
2402             "} // TESTSUITE(in)\n"
2403             "} // namespace out",
2404             format("namespace out {\n"
2405                    "TESTSUITE(in) {\n"
2406                    "} // TESTSUITE(in)\n"
2407                    "} // namespace out",
2408                    Style));
2409   EXPECT_EQ("TESTSUITE(out) {\n"
2410             "namespace in {\n"
2411             "} // namespace in\n"
2412             "} // TESTSUITE(out)",
2413             format("TESTSUITE(out) {\n"
2414                    "namespace in {\n"
2415                    "} // namespace in\n"
2416                    "} // TESTSUITE(out)",
2417                    Style));
2418   Style.NamespaceMacros.push_back("FOOBAR");
2419   EXPECT_EQ("TESTSUITE(out) {\n"
2420             "FOOBAR(in) {\n"
2421             "} // FOOBAR(in)\n"
2422             "} // TESTSUITE(out)",
2423             format("TESTSUITE(out) {\n"
2424                    "FOOBAR(in) {\n"
2425                    "} // FOOBAR(in)\n"
2426                    "} // TESTSUITE(out)",
2427                    Style));
2428 }
2429 
2430 TEST_F(FormatTest, FormatsCompactNamespaces) {
2431   FormatStyle Style = getLLVMStyle();
2432   Style.CompactNamespaces = true;
2433   Style.NamespaceMacros.push_back("TESTSUITE");
2434 
2435   verifyFormat("namespace A { namespace B {\n"
2436                "}} // namespace A::B",
2437                Style);
2438 
2439   EXPECT_EQ("namespace out { namespace in {\n"
2440             "}} // namespace out::in",
2441             format("namespace out {\n"
2442                    "namespace in {\n"
2443                    "} // namespace in\n"
2444                    "} // namespace out",
2445                    Style));
2446 
2447   // Only namespaces which have both consecutive opening and end get compacted
2448   EXPECT_EQ("namespace out {\n"
2449             "namespace in1 {\n"
2450             "} // namespace in1\n"
2451             "namespace in2 {\n"
2452             "} // namespace in2\n"
2453             "} // namespace out",
2454             format("namespace out {\n"
2455                    "namespace in1 {\n"
2456                    "} // namespace in1\n"
2457                    "namespace in2 {\n"
2458                    "} // namespace in2\n"
2459                    "} // namespace out",
2460                    Style));
2461 
2462   EXPECT_EQ("namespace out {\n"
2463             "int i;\n"
2464             "namespace in {\n"
2465             "int j;\n"
2466             "} // namespace in\n"
2467             "int k;\n"
2468             "} // namespace out",
2469             format("namespace out { int i;\n"
2470                    "namespace in { int j; } // namespace in\n"
2471                    "int k; } // namespace out",
2472                    Style));
2473 
2474   EXPECT_EQ("namespace A { namespace B { namespace C {\n"
2475             "}}} // namespace A::B::C\n",
2476             format("namespace A { namespace B {\n"
2477                    "namespace C {\n"
2478                    "}} // namespace B::C\n"
2479                    "} // namespace A\n",
2480                    Style));
2481 
2482   Style.ColumnLimit = 40;
2483   EXPECT_EQ("namespace aaaaaaaaaa {\n"
2484             "namespace bbbbbbbbbb {\n"
2485             "}} // namespace aaaaaaaaaa::bbbbbbbbbb",
2486             format("namespace aaaaaaaaaa {\n"
2487                    "namespace bbbbbbbbbb {\n"
2488                    "} // namespace bbbbbbbbbb\n"
2489                    "} // namespace aaaaaaaaaa",
2490                    Style));
2491 
2492   EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n"
2493             "namespace cccccc {\n"
2494             "}}} // namespace aaaaaa::bbbbbb::cccccc",
2495             format("namespace aaaaaa {\n"
2496                    "namespace bbbbbb {\n"
2497                    "namespace cccccc {\n"
2498                    "} // namespace cccccc\n"
2499                    "} // namespace bbbbbb\n"
2500                    "} // namespace aaaaaa",
2501                    Style));
2502   Style.ColumnLimit = 80;
2503 
2504   // Extra semicolon after 'inner' closing brace prevents merging
2505   EXPECT_EQ("namespace out { namespace in {\n"
2506             "}; } // namespace out::in",
2507             format("namespace out {\n"
2508                    "namespace in {\n"
2509                    "}; // namespace in\n"
2510                    "} // namespace out",
2511                    Style));
2512 
2513   // Extra semicolon after 'outer' closing brace is conserved
2514   EXPECT_EQ("namespace out { namespace in {\n"
2515             "}}; // namespace out::in",
2516             format("namespace out {\n"
2517                    "namespace in {\n"
2518                    "} // namespace in\n"
2519                    "}; // namespace out",
2520                    Style));
2521 
2522   Style.NamespaceIndentation = FormatStyle::NI_All;
2523   EXPECT_EQ("namespace out { namespace in {\n"
2524             "  int i;\n"
2525             "}} // namespace out::in",
2526             format("namespace out {\n"
2527                    "namespace in {\n"
2528                    "int i;\n"
2529                    "} // namespace in\n"
2530                    "} // namespace out",
2531                    Style));
2532   EXPECT_EQ("namespace out { namespace mid {\n"
2533             "  namespace in {\n"
2534             "    int j;\n"
2535             "  } // namespace in\n"
2536             "  int k;\n"
2537             "}} // namespace out::mid",
2538             format("namespace out { namespace mid {\n"
2539                    "namespace in { int j; } // namespace in\n"
2540                    "int k; }} // namespace out::mid",
2541                    Style));
2542 
2543   Style.NamespaceIndentation = FormatStyle::NI_Inner;
2544   EXPECT_EQ("namespace out { namespace in {\n"
2545             "  int i;\n"
2546             "}} // namespace out::in",
2547             format("namespace out {\n"
2548                    "namespace in {\n"
2549                    "int i;\n"
2550                    "} // namespace in\n"
2551                    "} // namespace out",
2552                    Style));
2553   EXPECT_EQ("namespace out { namespace mid { namespace in {\n"
2554             "  int i;\n"
2555             "}}} // namespace out::mid::in",
2556             format("namespace out {\n"
2557                    "namespace mid {\n"
2558                    "namespace in {\n"
2559                    "int i;\n"
2560                    "} // namespace in\n"
2561                    "} // namespace mid\n"
2562                    "} // namespace out",
2563                    Style));
2564 }
2565 
2566 TEST_F(FormatTest, FormatsExternC) {
2567   verifyFormat("extern \"C\" {\nint a;");
2568   verifyFormat("extern \"C\" {}");
2569   verifyFormat("extern \"C\" {\n"
2570                "int foo();\n"
2571                "}");
2572   verifyFormat("extern \"C\" int foo() {}");
2573   verifyFormat("extern \"C\" int foo();");
2574   verifyFormat("extern \"C\" int foo() {\n"
2575                "  int i = 42;\n"
2576                "  return i;\n"
2577                "}");
2578 
2579   FormatStyle Style = getLLVMStyle();
2580   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2581   Style.BraceWrapping.AfterFunction = true;
2582   verifyFormat("extern \"C\" int foo() {}", Style);
2583   verifyFormat("extern \"C\" int foo();", Style);
2584   verifyFormat("extern \"C\" int foo()\n"
2585                "{\n"
2586                "  int i = 42;\n"
2587                "  return i;\n"
2588                "}",
2589                Style);
2590 
2591   Style.BraceWrapping.AfterExternBlock = true;
2592   Style.BraceWrapping.SplitEmptyRecord = false;
2593   verifyFormat("extern \"C\"\n"
2594                "{}",
2595                Style);
2596   verifyFormat("extern \"C\"\n"
2597                "{\n"
2598                "  int foo();\n"
2599                "}",
2600                Style);
2601 }
2602 
2603 TEST_F(FormatTest, IndentExternBlockStyle) {
2604   FormatStyle Style = getLLVMStyle();
2605   Style.IndentWidth = 2;
2606 
2607   Style.IndentExternBlock = FormatStyle::IEBS_Indent;
2608   verifyFormat("extern \"C\" { /*9*/\n}", Style);
2609   verifyFormat("extern \"C\" {\n"
2610                "  int foo10();\n"
2611                "}",
2612                Style);
2613 
2614   Style.IndentExternBlock = FormatStyle::IEBS_NoIndent;
2615   verifyFormat("extern \"C\" { /*11*/\n}", Style);
2616   verifyFormat("extern \"C\" {\n"
2617                "int foo12();\n"
2618                "}",
2619                Style);
2620 
2621   Style.IndentExternBlock = FormatStyle::IEBS_AfterExternBlock;
2622   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2623   Style.BraceWrapping.AfterExternBlock = true;
2624   verifyFormat("extern \"C\"\n{ /*13*/\n}", Style);
2625   verifyFormat("extern \"C\"\n{\n"
2626                "  int foo14();\n"
2627                "}",
2628                Style);
2629 
2630   Style.IndentExternBlock = FormatStyle::IEBS_AfterExternBlock;
2631   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2632   Style.BraceWrapping.AfterExternBlock = false;
2633   verifyFormat("extern \"C\" { /*15*/\n}", Style);
2634   verifyFormat("extern \"C\" {\n"
2635                "int foo16();\n"
2636                "}",
2637                Style);
2638 }
2639 
2640 TEST_F(FormatTest, FormatsInlineASM) {
2641   verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
2642   verifyFormat("asm(\"nop\" ::: \"memory\");");
2643   verifyFormat(
2644       "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
2645       "    \"cpuid\\n\\t\"\n"
2646       "    \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
2647       "    : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
2648       "    : \"a\"(value));");
2649   EXPECT_EQ(
2650       "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
2651       "  __asm {\n"
2652       "        mov     edx,[that] // vtable in edx\n"
2653       "        mov     eax,methodIndex\n"
2654       "        call    [edx][eax*4] // stdcall\n"
2655       "  }\n"
2656       "}",
2657       format("void NS_InvokeByIndex(void *that,   unsigned int methodIndex) {\n"
2658              "    __asm {\n"
2659              "        mov     edx,[that] // vtable in edx\n"
2660              "        mov     eax,methodIndex\n"
2661              "        call    [edx][eax*4] // stdcall\n"
2662              "    }\n"
2663              "}"));
2664   EXPECT_EQ("_asm {\n"
2665             "  xor eax, eax;\n"
2666             "  cpuid;\n"
2667             "}",
2668             format("_asm {\n"
2669                    "  xor eax, eax;\n"
2670                    "  cpuid;\n"
2671                    "}"));
2672   verifyFormat("void function() {\n"
2673                "  // comment\n"
2674                "  asm(\"\");\n"
2675                "}");
2676   EXPECT_EQ("__asm {\n"
2677             "}\n"
2678             "int i;",
2679             format("__asm   {\n"
2680                    "}\n"
2681                    "int   i;"));
2682 }
2683 
2684 TEST_F(FormatTest, FormatTryCatch) {
2685   verifyFormat("try {\n"
2686                "  throw a * b;\n"
2687                "} catch (int a) {\n"
2688                "  // Do nothing.\n"
2689                "} catch (...) {\n"
2690                "  exit(42);\n"
2691                "}");
2692 
2693   // Function-level try statements.
2694   verifyFormat("int f() try { return 4; } catch (...) {\n"
2695                "  return 5;\n"
2696                "}");
2697   verifyFormat("class A {\n"
2698                "  int a;\n"
2699                "  A() try : a(0) {\n"
2700                "  } catch (...) {\n"
2701                "    throw;\n"
2702                "  }\n"
2703                "};\n");
2704 
2705   // Incomplete try-catch blocks.
2706   verifyIncompleteFormat("try {} catch (");
2707 }
2708 
2709 TEST_F(FormatTest, FormatTryAsAVariable) {
2710   verifyFormat("int try;");
2711   verifyFormat("int try, size;");
2712   verifyFormat("try = foo();");
2713   verifyFormat("if (try < size) {\n  return true;\n}");
2714 
2715   verifyFormat("int catch;");
2716   verifyFormat("int catch, size;");
2717   verifyFormat("catch = foo();");
2718   verifyFormat("if (catch < size) {\n  return true;\n}");
2719 }
2720 
2721 TEST_F(FormatTest, FormatSEHTryCatch) {
2722   verifyFormat("__try {\n"
2723                "  int a = b * c;\n"
2724                "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
2725                "  // Do nothing.\n"
2726                "}");
2727 
2728   verifyFormat("__try {\n"
2729                "  int a = b * c;\n"
2730                "} __finally {\n"
2731                "  // Do nothing.\n"
2732                "}");
2733 
2734   verifyFormat("DEBUG({\n"
2735                "  __try {\n"
2736                "  } __finally {\n"
2737                "  }\n"
2738                "});\n");
2739 }
2740 
2741 TEST_F(FormatTest, IncompleteTryCatchBlocks) {
2742   verifyFormat("try {\n"
2743                "  f();\n"
2744                "} catch {\n"
2745                "  g();\n"
2746                "}");
2747   verifyFormat("try {\n"
2748                "  f();\n"
2749                "} catch (A a) MACRO(x) {\n"
2750                "  g();\n"
2751                "} catch (B b) MACRO(x) {\n"
2752                "  g();\n"
2753                "}");
2754 }
2755 
2756 TEST_F(FormatTest, FormatTryCatchBraceStyles) {
2757   FormatStyle Style = getLLVMStyle();
2758   for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
2759                           FormatStyle::BS_WebKit}) {
2760     Style.BreakBeforeBraces = BraceStyle;
2761     verifyFormat("try {\n"
2762                  "  // something\n"
2763                  "} catch (...) {\n"
2764                  "  // something\n"
2765                  "}",
2766                  Style);
2767   }
2768   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
2769   verifyFormat("try {\n"
2770                "  // something\n"
2771                "}\n"
2772                "catch (...) {\n"
2773                "  // something\n"
2774                "}",
2775                Style);
2776   verifyFormat("__try {\n"
2777                "  // something\n"
2778                "}\n"
2779                "__finally {\n"
2780                "  // something\n"
2781                "}",
2782                Style);
2783   verifyFormat("@try {\n"
2784                "  // something\n"
2785                "}\n"
2786                "@finally {\n"
2787                "  // something\n"
2788                "}",
2789                Style);
2790   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2791   verifyFormat("try\n"
2792                "{\n"
2793                "  // something\n"
2794                "}\n"
2795                "catch (...)\n"
2796                "{\n"
2797                "  // something\n"
2798                "}",
2799                Style);
2800   Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths;
2801   verifyFormat("try\n"
2802                "  {\n"
2803                "  // something white\n"
2804                "  }\n"
2805                "catch (...)\n"
2806                "  {\n"
2807                "  // something white\n"
2808                "  }",
2809                Style);
2810   Style.BreakBeforeBraces = FormatStyle::BS_GNU;
2811   verifyFormat("try\n"
2812                "  {\n"
2813                "    // something\n"
2814                "  }\n"
2815                "catch (...)\n"
2816                "  {\n"
2817                "    // something\n"
2818                "  }",
2819                Style);
2820   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2821   Style.BraceWrapping.BeforeCatch = true;
2822   verifyFormat("try {\n"
2823                "  // something\n"
2824                "}\n"
2825                "catch (...) {\n"
2826                "  // something\n"
2827                "}",
2828                Style);
2829 }
2830 
2831 TEST_F(FormatTest, StaticInitializers) {
2832   verifyFormat("static SomeClass SC = {1, 'a'};");
2833 
2834   verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
2835                "    100000000, "
2836                "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
2837 
2838   // Here, everything other than the "}" would fit on a line.
2839   verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
2840                "    10000000000000000000000000};");
2841   EXPECT_EQ("S s = {a,\n"
2842             "\n"
2843             "       b};",
2844             format("S s = {\n"
2845                    "  a,\n"
2846                    "\n"
2847                    "  b\n"
2848                    "};"));
2849 
2850   // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
2851   // line. However, the formatting looks a bit off and this probably doesn't
2852   // happen often in practice.
2853   verifyFormat("static int Variable[1] = {\n"
2854                "    {1000000000000000000000000000000000000}};",
2855                getLLVMStyleWithColumns(40));
2856 }
2857 
2858 TEST_F(FormatTest, DesignatedInitializers) {
2859   verifyFormat("const struct A a = {.a = 1, .b = 2};");
2860   verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
2861                "                    .bbbbbbbbbb = 2,\n"
2862                "                    .cccccccccc = 3,\n"
2863                "                    .dddddddddd = 4,\n"
2864                "                    .eeeeeeeeee = 5};");
2865   verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
2866                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
2867                "    .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
2868                "    .ccccccccccccccccccccccccccc = 3,\n"
2869                "    .ddddddddddddddddddddddddddd = 4,\n"
2870                "    .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
2871 
2872   verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
2873 
2874   verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
2875   verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n"
2876                "                    [2] = bbbbbbbbbb,\n"
2877                "                    [3] = cccccccccc,\n"
2878                "                    [4] = dddddddddd,\n"
2879                "                    [5] = eeeeeeeeee};");
2880   verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
2881                "    [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2882                "    [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2883                "    [3] = cccccccccccccccccccccccccccccccccccccc,\n"
2884                "    [4] = dddddddddddddddddddddddddddddddddddddd,\n"
2885                "    [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};");
2886 }
2887 
2888 TEST_F(FormatTest, NestedStaticInitializers) {
2889   verifyFormat("static A x = {{{}}};\n");
2890   verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
2891                "               {init1, init2, init3, init4}}};",
2892                getLLVMStyleWithColumns(50));
2893 
2894   verifyFormat("somes Status::global_reps[3] = {\n"
2895                "    {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2896                "    {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2897                "    {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
2898                getLLVMStyleWithColumns(60));
2899   verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
2900                      "    {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2901                      "    {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2902                      "    {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
2903   verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
2904                "                  {rect.fRight - rect.fLeft, rect.fBottom - "
2905                "rect.fTop}};");
2906 
2907   verifyFormat(
2908       "SomeArrayOfSomeType a = {\n"
2909       "    {{1, 2, 3},\n"
2910       "     {1, 2, 3},\n"
2911       "     {111111111111111111111111111111, 222222222222222222222222222222,\n"
2912       "      333333333333333333333333333333},\n"
2913       "     {1, 2, 3},\n"
2914       "     {1, 2, 3}}};");
2915   verifyFormat(
2916       "SomeArrayOfSomeType a = {\n"
2917       "    {{1, 2, 3}},\n"
2918       "    {{1, 2, 3}},\n"
2919       "    {{111111111111111111111111111111, 222222222222222222222222222222,\n"
2920       "      333333333333333333333333333333}},\n"
2921       "    {{1, 2, 3}},\n"
2922       "    {{1, 2, 3}}};");
2923 
2924   verifyFormat("struct {\n"
2925                "  unsigned bit;\n"
2926                "  const char *const name;\n"
2927                "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
2928                "                 {kOsWin, \"Windows\"},\n"
2929                "                 {kOsLinux, \"Linux\"},\n"
2930                "                 {kOsCrOS, \"Chrome OS\"}};");
2931   verifyFormat("struct {\n"
2932                "  unsigned bit;\n"
2933                "  const char *const name;\n"
2934                "} kBitsToOs[] = {\n"
2935                "    {kOsMac, \"Mac\"},\n"
2936                "    {kOsWin, \"Windows\"},\n"
2937                "    {kOsLinux, \"Linux\"},\n"
2938                "    {kOsCrOS, \"Chrome OS\"},\n"
2939                "};");
2940 }
2941 
2942 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
2943   verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2944                "                      \\\n"
2945                "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
2946 }
2947 
2948 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
2949   verifyFormat("virtual void write(ELFWriter *writerrr,\n"
2950                "                   OwningPtr<FileOutputBuffer> &buffer) = 0;");
2951 
2952   // Do break defaulted and deleted functions.
2953   verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2954                "    default;",
2955                getLLVMStyleWithColumns(40));
2956   verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2957                "    delete;",
2958                getLLVMStyleWithColumns(40));
2959 }
2960 
2961 TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
2962   verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
2963                getLLVMStyleWithColumns(40));
2964   verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2965                getLLVMStyleWithColumns(40));
2966   EXPECT_EQ("#define Q                              \\\n"
2967             "  \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\"    \\\n"
2968             "  \"aaaaaaaa.cpp\"",
2969             format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2970                    getLLVMStyleWithColumns(40)));
2971 }
2972 
2973 TEST_F(FormatTest, UnderstandsLinePPDirective) {
2974   EXPECT_EQ("# 123 \"A string literal\"",
2975             format("   #     123    \"A string literal\""));
2976 }
2977 
2978 TEST_F(FormatTest, LayoutUnknownPPDirective) {
2979   EXPECT_EQ("#;", format("#;"));
2980   verifyFormat("#\n;\n;\n;");
2981 }
2982 
2983 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
2984   EXPECT_EQ("#line 42 \"test\"\n",
2985             format("#  \\\n  line  \\\n  42  \\\n  \"test\"\n"));
2986   EXPECT_EQ("#define A B\n", format("#  \\\n define  \\\n    A  \\\n       B\n",
2987                                     getLLVMStyleWithColumns(12)));
2988 }
2989 
2990 TEST_F(FormatTest, EndOfFileEndsPPDirective) {
2991   EXPECT_EQ("#line 42 \"test\"",
2992             format("#  \\\n  line  \\\n  42  \\\n  \"test\""));
2993   EXPECT_EQ("#define A B", format("#  \\\n define  \\\n    A  \\\n       B"));
2994 }
2995 
2996 TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
2997   verifyFormat("#define A \\x20");
2998   verifyFormat("#define A \\ x20");
2999   EXPECT_EQ("#define A \\ x20", format("#define A \\   x20"));
3000   verifyFormat("#define A ''");
3001   verifyFormat("#define A ''qqq");
3002   verifyFormat("#define A `qqq");
3003   verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
3004   EXPECT_EQ("const char *c = STRINGIFY(\n"
3005             "\\na : b);",
3006             format("const char * c = STRINGIFY(\n"
3007                    "\\na : b);"));
3008 
3009   verifyFormat("a\r\\");
3010   verifyFormat("a\v\\");
3011   verifyFormat("a\f\\");
3012 }
3013 
3014 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
3015   verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
3016   verifyFormat("#define A( \\\n    BB)", getLLVMStyleWithColumns(12));
3017   verifyFormat("#define A( \\\n    A, B)", getLLVMStyleWithColumns(12));
3018   // FIXME: We never break before the macro name.
3019   verifyFormat("#define AA( \\\n    B)", getLLVMStyleWithColumns(12));
3020 
3021   verifyFormat("#define A A\n#define A A");
3022   verifyFormat("#define A(X) A\n#define A A");
3023 
3024   verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
3025   verifyFormat("#define Something    \\\n  Other", getLLVMStyleWithColumns(22));
3026 }
3027 
3028 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
3029   EXPECT_EQ("// somecomment\n"
3030             "#include \"a.h\"\n"
3031             "#define A(  \\\n"
3032             "    A, B)\n"
3033             "#include \"b.h\"\n"
3034             "// somecomment\n",
3035             format("  // somecomment\n"
3036                    "  #include \"a.h\"\n"
3037                    "#define A(A,\\\n"
3038                    "    B)\n"
3039                    "    #include \"b.h\"\n"
3040                    " // somecomment\n",
3041                    getLLVMStyleWithColumns(13)));
3042 }
3043 
3044 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
3045 
3046 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
3047   EXPECT_EQ("#define A    \\\n"
3048             "  c;         \\\n"
3049             "  e;\n"
3050             "f;",
3051             format("#define A c; e;\n"
3052                    "f;",
3053                    getLLVMStyleWithColumns(14)));
3054 }
3055 
3056 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
3057 
3058 TEST_F(FormatTest, MacroDefinitionInsideStatement) {
3059   EXPECT_EQ("int x,\n"
3060             "#define A\n"
3061             "    y;",
3062             format("int x,\n#define A\ny;"));
3063 }
3064 
3065 TEST_F(FormatTest, HashInMacroDefinition) {
3066   EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
3067   verifyFormat("#define A \\\n  b #c;", getLLVMStyleWithColumns(11));
3068   verifyFormat("#define A  \\\n"
3069                "  {        \\\n"
3070                "    f(#c); \\\n"
3071                "  }",
3072                getLLVMStyleWithColumns(11));
3073 
3074   verifyFormat("#define A(X)         \\\n"
3075                "  void function##X()",
3076                getLLVMStyleWithColumns(22));
3077 
3078   verifyFormat("#define A(a, b, c)   \\\n"
3079                "  void a##b##c()",
3080                getLLVMStyleWithColumns(22));
3081 
3082   verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
3083 }
3084 
3085 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
3086   EXPECT_EQ("#define A (x)", format("#define A (x)"));
3087   EXPECT_EQ("#define A(x)", format("#define A(x)"));
3088 
3089   FormatStyle Style = getLLVMStyle();
3090   Style.SpaceBeforeParens = FormatStyle::SBPO_Never;
3091   verifyFormat("#define true ((foo)1)", Style);
3092   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
3093   verifyFormat("#define false((foo)0)", Style);
3094 }
3095 
3096 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
3097   EXPECT_EQ("#define A b;", format("#define A \\\n"
3098                                    "          \\\n"
3099                                    "  b;",
3100                                    getLLVMStyleWithColumns(25)));
3101   EXPECT_EQ("#define A \\\n"
3102             "          \\\n"
3103             "  a;      \\\n"
3104             "  b;",
3105             format("#define A \\\n"
3106                    "          \\\n"
3107                    "  a;      \\\n"
3108                    "  b;",
3109                    getLLVMStyleWithColumns(11)));
3110   EXPECT_EQ("#define A \\\n"
3111             "  a;      \\\n"
3112             "          \\\n"
3113             "  b;",
3114             format("#define A \\\n"
3115                    "  a;      \\\n"
3116                    "          \\\n"
3117                    "  b;",
3118                    getLLVMStyleWithColumns(11)));
3119 }
3120 
3121 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
3122   verifyIncompleteFormat("#define A :");
3123   verifyFormat("#define SOMECASES  \\\n"
3124                "  case 1:          \\\n"
3125                "  case 2\n",
3126                getLLVMStyleWithColumns(20));
3127   verifyFormat("#define MACRO(a) \\\n"
3128                "  if (a)         \\\n"
3129                "    f();         \\\n"
3130                "  else           \\\n"
3131                "    g()",
3132                getLLVMStyleWithColumns(18));
3133   verifyFormat("#define A template <typename T>");
3134   verifyIncompleteFormat("#define STR(x) #x\n"
3135                          "f(STR(this_is_a_string_literal{));");
3136   verifyFormat("#pragma omp threadprivate( \\\n"
3137                "    y)), // expected-warning",
3138                getLLVMStyleWithColumns(28));
3139   verifyFormat("#d, = };");
3140   verifyFormat("#if \"a");
3141   verifyIncompleteFormat("({\n"
3142                          "#define b     \\\n"
3143                          "  }           \\\n"
3144                          "  a\n"
3145                          "a",
3146                          getLLVMStyleWithColumns(15));
3147   verifyFormat("#define A     \\\n"
3148                "  {           \\\n"
3149                "    {\n"
3150                "#define B     \\\n"
3151                "  }           \\\n"
3152                "  }",
3153                getLLVMStyleWithColumns(15));
3154   verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
3155   verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
3156   verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
3157   verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() {      \n)}");
3158 }
3159 
3160 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
3161   verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
3162   EXPECT_EQ("class A : public QObject {\n"
3163             "  Q_OBJECT\n"
3164             "\n"
3165             "  A() {}\n"
3166             "};",
3167             format("class A  :  public QObject {\n"
3168                    "     Q_OBJECT\n"
3169                    "\n"
3170                    "  A() {\n}\n"
3171                    "}  ;"));
3172   EXPECT_EQ("MACRO\n"
3173             "/*static*/ int i;",
3174             format("MACRO\n"
3175                    " /*static*/ int   i;"));
3176   EXPECT_EQ("SOME_MACRO\n"
3177             "namespace {\n"
3178             "void f();\n"
3179             "} // namespace",
3180             format("SOME_MACRO\n"
3181                    "  namespace    {\n"
3182                    "void   f(  );\n"
3183                    "} // namespace"));
3184   // Only if the identifier contains at least 5 characters.
3185   EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
3186   EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
3187   // Only if everything is upper case.
3188   EXPECT_EQ("class A : public QObject {\n"
3189             "  Q_Object A() {}\n"
3190             "};",
3191             format("class A  :  public QObject {\n"
3192                    "     Q_Object\n"
3193                    "  A() {\n}\n"
3194                    "}  ;"));
3195 
3196   // Only if the next line can actually start an unwrapped line.
3197   EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
3198             format("SOME_WEIRD_LOG_MACRO\n"
3199                    "<< SomeThing;"));
3200 
3201   verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
3202                "(n, buffers))\n",
3203                getChromiumStyle(FormatStyle::LK_Cpp));
3204 
3205   // See PR41483
3206   EXPECT_EQ("/**/ FOO(a)\n"
3207             "FOO(b)",
3208             format("/**/ FOO(a)\n"
3209                    "FOO(b)"));
3210 }
3211 
3212 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
3213   EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3214             "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3215             "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
3216             "class X {};\n"
3217             "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3218             "int *createScopDetectionPass() { return 0; }",
3219             format("  INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3220                    "  INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3221                    "  INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
3222                    "  class X {};\n"
3223                    "  INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3224                    "  int *createScopDetectionPass() { return 0; }"));
3225   // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
3226   // braces, so that inner block is indented one level more.
3227   EXPECT_EQ("int q() {\n"
3228             "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3229             "  IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3230             "  IPC_END_MESSAGE_MAP()\n"
3231             "}",
3232             format("int q() {\n"
3233                    "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3234                    "    IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3235                    "  IPC_END_MESSAGE_MAP()\n"
3236                    "}"));
3237 
3238   // Same inside macros.
3239   EXPECT_EQ("#define LIST(L) \\\n"
3240             "  L(A)          \\\n"
3241             "  L(B)          \\\n"
3242             "  L(C)",
3243             format("#define LIST(L) \\\n"
3244                    "  L(A) \\\n"
3245                    "  L(B) \\\n"
3246                    "  L(C)",
3247                    getGoogleStyle()));
3248 
3249   // These must not be recognized as macros.
3250   EXPECT_EQ("int q() {\n"
3251             "  f(x);\n"
3252             "  f(x) {}\n"
3253             "  f(x)->g();\n"
3254             "  f(x)->*g();\n"
3255             "  f(x).g();\n"
3256             "  f(x) = x;\n"
3257             "  f(x) += x;\n"
3258             "  f(x) -= x;\n"
3259             "  f(x) *= x;\n"
3260             "  f(x) /= x;\n"
3261             "  f(x) %= x;\n"
3262             "  f(x) &= x;\n"
3263             "  f(x) |= x;\n"
3264             "  f(x) ^= x;\n"
3265             "  f(x) >>= x;\n"
3266             "  f(x) <<= x;\n"
3267             "  f(x)[y].z();\n"
3268             "  LOG(INFO) << x;\n"
3269             "  ifstream(x) >> x;\n"
3270             "}\n",
3271             format("int q() {\n"
3272                    "  f(x)\n;\n"
3273                    "  f(x)\n {}\n"
3274                    "  f(x)\n->g();\n"
3275                    "  f(x)\n->*g();\n"
3276                    "  f(x)\n.g();\n"
3277                    "  f(x)\n = x;\n"
3278                    "  f(x)\n += x;\n"
3279                    "  f(x)\n -= x;\n"
3280                    "  f(x)\n *= x;\n"
3281                    "  f(x)\n /= x;\n"
3282                    "  f(x)\n %= x;\n"
3283                    "  f(x)\n &= x;\n"
3284                    "  f(x)\n |= x;\n"
3285                    "  f(x)\n ^= x;\n"
3286                    "  f(x)\n >>= x;\n"
3287                    "  f(x)\n <<= x;\n"
3288                    "  f(x)\n[y].z();\n"
3289                    "  LOG(INFO)\n << x;\n"
3290                    "  ifstream(x)\n >> x;\n"
3291                    "}\n"));
3292   EXPECT_EQ("int q() {\n"
3293             "  F(x)\n"
3294             "  if (1) {\n"
3295             "  }\n"
3296             "  F(x)\n"
3297             "  while (1) {\n"
3298             "  }\n"
3299             "  F(x)\n"
3300             "  G(x);\n"
3301             "  F(x)\n"
3302             "  try {\n"
3303             "    Q();\n"
3304             "  } catch (...) {\n"
3305             "  }\n"
3306             "}\n",
3307             format("int q() {\n"
3308                    "F(x)\n"
3309                    "if (1) {}\n"
3310                    "F(x)\n"
3311                    "while (1) {}\n"
3312                    "F(x)\n"
3313                    "G(x);\n"
3314                    "F(x)\n"
3315                    "try { Q(); } catch (...) {}\n"
3316                    "}\n"));
3317   EXPECT_EQ("class A {\n"
3318             "  A() : t(0) {}\n"
3319             "  A(int i) noexcept() : {}\n"
3320             "  A(X x)\n" // FIXME: function-level try blocks are broken.
3321             "  try : t(0) {\n"
3322             "  } catch (...) {\n"
3323             "  }\n"
3324             "};",
3325             format("class A {\n"
3326                    "  A()\n : t(0) {}\n"
3327                    "  A(int i)\n noexcept() : {}\n"
3328                    "  A(X x)\n"
3329                    "  try : t(0) {} catch (...) {}\n"
3330                    "};"));
3331   FormatStyle Style = getLLVMStyle();
3332   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
3333   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always;
3334   Style.BraceWrapping.AfterFunction = true;
3335   EXPECT_EQ("void f()\n"
3336             "try\n"
3337             "{\n"
3338             "}",
3339             format("void f() try {\n"
3340                    "}",
3341                    Style));
3342   EXPECT_EQ("class SomeClass {\n"
3343             "public:\n"
3344             "  SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3345             "};",
3346             format("class SomeClass {\n"
3347                    "public:\n"
3348                    "  SomeClass()\n"
3349                    "  EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3350                    "};"));
3351   EXPECT_EQ("class SomeClass {\n"
3352             "public:\n"
3353             "  SomeClass()\n"
3354             "      EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3355             "};",
3356             format("class SomeClass {\n"
3357                    "public:\n"
3358                    "  SomeClass()\n"
3359                    "  EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3360                    "};",
3361                    getLLVMStyleWithColumns(40)));
3362 
3363   verifyFormat("MACRO(>)");
3364 
3365   // Some macros contain an implicit semicolon.
3366   Style = getLLVMStyle();
3367   Style.StatementMacros.push_back("FOO");
3368   verifyFormat("FOO(a) int b = 0;");
3369   verifyFormat("FOO(a)\n"
3370                "int b = 0;",
3371                Style);
3372   verifyFormat("FOO(a);\n"
3373                "int b = 0;",
3374                Style);
3375   verifyFormat("FOO(argc, argv, \"4.0.2\")\n"
3376                "int b = 0;",
3377                Style);
3378   verifyFormat("FOO()\n"
3379                "int b = 0;",
3380                Style);
3381   verifyFormat("FOO\n"
3382                "int b = 0;",
3383                Style);
3384   verifyFormat("void f() {\n"
3385                "  FOO(a)\n"
3386                "  return a;\n"
3387                "}",
3388                Style);
3389   verifyFormat("FOO(a)\n"
3390                "FOO(b)",
3391                Style);
3392   verifyFormat("int a = 0;\n"
3393                "FOO(b)\n"
3394                "int c = 0;",
3395                Style);
3396   verifyFormat("int a = 0;\n"
3397                "int x = FOO(a)\n"
3398                "int b = 0;",
3399                Style);
3400   verifyFormat("void foo(int a) { FOO(a) }\n"
3401                "uint32_t bar() {}",
3402                Style);
3403 }
3404 
3405 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
3406   verifyFormat("#define A \\\n"
3407                "  f({     \\\n"
3408                "    g();  \\\n"
3409                "  });",
3410                getLLVMStyleWithColumns(11));
3411 }
3412 
3413 TEST_F(FormatTest, IndentPreprocessorDirectives) {
3414   FormatStyle Style = getLLVMStyle();
3415   Style.IndentPPDirectives = FormatStyle::PPDIS_None;
3416   Style.ColumnLimit = 40;
3417   verifyFormat("#ifdef _WIN32\n"
3418                "#define A 0\n"
3419                "#ifdef VAR2\n"
3420                "#define B 1\n"
3421                "#include <someheader.h>\n"
3422                "#define MACRO                          \\\n"
3423                "  some_very_long_func_aaaaaaaaaa();\n"
3424                "#endif\n"
3425                "#else\n"
3426                "#define A 1\n"
3427                "#endif",
3428                Style);
3429   Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash;
3430   verifyFormat("#ifdef _WIN32\n"
3431                "#  define A 0\n"
3432                "#  ifdef VAR2\n"
3433                "#    define B 1\n"
3434                "#    include <someheader.h>\n"
3435                "#    define MACRO                      \\\n"
3436                "      some_very_long_func_aaaaaaaaaa();\n"
3437                "#  endif\n"
3438                "#else\n"
3439                "#  define A 1\n"
3440                "#endif",
3441                Style);
3442   verifyFormat("#if A\n"
3443                "#  define MACRO                        \\\n"
3444                "    void a(int x) {                    \\\n"
3445                "      b();                             \\\n"
3446                "      c();                             \\\n"
3447                "      d();                             \\\n"
3448                "      e();                             \\\n"
3449                "      f();                             \\\n"
3450                "    }\n"
3451                "#endif",
3452                Style);
3453   // Comments before include guard.
3454   verifyFormat("// file comment\n"
3455                "// file comment\n"
3456                "#ifndef HEADER_H\n"
3457                "#define HEADER_H\n"
3458                "code();\n"
3459                "#endif",
3460                Style);
3461   // Test with include guards.
3462   verifyFormat("#ifndef HEADER_H\n"
3463                "#define HEADER_H\n"
3464                "code();\n"
3465                "#endif",
3466                Style);
3467   // Include guards must have a #define with the same variable immediately
3468   // after #ifndef.
3469   verifyFormat("#ifndef NOT_GUARD\n"
3470                "#  define FOO\n"
3471                "code();\n"
3472                "#endif",
3473                Style);
3474 
3475   // Include guards must cover the entire file.
3476   verifyFormat("code();\n"
3477                "code();\n"
3478                "#ifndef NOT_GUARD\n"
3479                "#  define NOT_GUARD\n"
3480                "code();\n"
3481                "#endif",
3482                Style);
3483   verifyFormat("#ifndef NOT_GUARD\n"
3484                "#  define NOT_GUARD\n"
3485                "code();\n"
3486                "#endif\n"
3487                "code();",
3488                Style);
3489   // Test with trailing blank lines.
3490   verifyFormat("#ifndef HEADER_H\n"
3491                "#define HEADER_H\n"
3492                "code();\n"
3493                "#endif\n",
3494                Style);
3495   // Include guards don't have #else.
3496   verifyFormat("#ifndef NOT_GUARD\n"
3497                "#  define NOT_GUARD\n"
3498                "code();\n"
3499                "#else\n"
3500                "#endif",
3501                Style);
3502   verifyFormat("#ifndef NOT_GUARD\n"
3503                "#  define NOT_GUARD\n"
3504                "code();\n"
3505                "#elif FOO\n"
3506                "#endif",
3507                Style);
3508   // Non-identifier #define after potential include guard.
3509   verifyFormat("#ifndef FOO\n"
3510                "#  define 1\n"
3511                "#endif\n",
3512                Style);
3513   // #if closes past last non-preprocessor line.
3514   verifyFormat("#ifndef FOO\n"
3515                "#define FOO\n"
3516                "#if 1\n"
3517                "int i;\n"
3518                "#  define A 0\n"
3519                "#endif\n"
3520                "#endif\n",
3521                Style);
3522   // Don't crash if there is an #elif directive without a condition.
3523   verifyFormat("#if 1\n"
3524                "int x;\n"
3525                "#elif\n"
3526                "int y;\n"
3527                "#else\n"
3528                "int z;\n"
3529                "#endif",
3530                Style);
3531   // FIXME: This doesn't handle the case where there's code between the
3532   // #ifndef and #define but all other conditions hold. This is because when
3533   // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the
3534   // previous code line yet, so we can't detect it.
3535   EXPECT_EQ("#ifndef NOT_GUARD\n"
3536             "code();\n"
3537             "#define NOT_GUARD\n"
3538             "code();\n"
3539             "#endif",
3540             format("#ifndef NOT_GUARD\n"
3541                    "code();\n"
3542                    "#  define NOT_GUARD\n"
3543                    "code();\n"
3544                    "#endif",
3545                    Style));
3546   // FIXME: This doesn't handle cases where legitimate preprocessor lines may
3547   // be outside an include guard. Examples are #pragma once and
3548   // #pragma GCC diagnostic, or anything else that does not change the meaning
3549   // of the file if it's included multiple times.
3550   EXPECT_EQ("#ifdef WIN32\n"
3551             "#  pragma once\n"
3552             "#endif\n"
3553             "#ifndef HEADER_H\n"
3554             "#  define HEADER_H\n"
3555             "code();\n"
3556             "#endif",
3557             format("#ifdef WIN32\n"
3558                    "#  pragma once\n"
3559                    "#endif\n"
3560                    "#ifndef HEADER_H\n"
3561                    "#define HEADER_H\n"
3562                    "code();\n"
3563                    "#endif",
3564                    Style));
3565   // FIXME: This does not detect when there is a single non-preprocessor line
3566   // in front of an include-guard-like structure where other conditions hold
3567   // because ScopedLineState hides the line.
3568   EXPECT_EQ("code();\n"
3569             "#ifndef HEADER_H\n"
3570             "#define HEADER_H\n"
3571             "code();\n"
3572             "#endif",
3573             format("code();\n"
3574                    "#ifndef HEADER_H\n"
3575                    "#  define HEADER_H\n"
3576                    "code();\n"
3577                    "#endif",
3578                    Style));
3579   // Keep comments aligned with #, otherwise indent comments normally. These
3580   // tests cannot use verifyFormat because messUp manipulates leading
3581   // whitespace.
3582   {
3583     const char *Expected = ""
3584                            "void f() {\n"
3585                            "#if 1\n"
3586                            "// Preprocessor aligned.\n"
3587                            "#  define A 0\n"
3588                            "  // Code. Separated by blank line.\n"
3589                            "\n"
3590                            "#  define B 0\n"
3591                            "  // Code. Not aligned with #\n"
3592                            "#  define C 0\n"
3593                            "#endif";
3594     const char *ToFormat = ""
3595                            "void f() {\n"
3596                            "#if 1\n"
3597                            "// Preprocessor aligned.\n"
3598                            "#  define A 0\n"
3599                            "// Code. Separated by blank line.\n"
3600                            "\n"
3601                            "#  define B 0\n"
3602                            "   // Code. Not aligned with #\n"
3603                            "#  define C 0\n"
3604                            "#endif";
3605     EXPECT_EQ(Expected, format(ToFormat, Style));
3606     EXPECT_EQ(Expected, format(Expected, Style));
3607   }
3608   // Keep block quotes aligned.
3609   {
3610     const char *Expected = ""
3611                            "void f() {\n"
3612                            "#if 1\n"
3613                            "/* Preprocessor aligned. */\n"
3614                            "#  define A 0\n"
3615                            "  /* Code. Separated by blank line. */\n"
3616                            "\n"
3617                            "#  define B 0\n"
3618                            "  /* Code. Not aligned with # */\n"
3619                            "#  define C 0\n"
3620                            "#endif";
3621     const char *ToFormat = ""
3622                            "void f() {\n"
3623                            "#if 1\n"
3624                            "/* Preprocessor aligned. */\n"
3625                            "#  define A 0\n"
3626                            "/* Code. Separated by blank line. */\n"
3627                            "\n"
3628                            "#  define B 0\n"
3629                            "   /* Code. Not aligned with # */\n"
3630                            "#  define C 0\n"
3631                            "#endif";
3632     EXPECT_EQ(Expected, format(ToFormat, Style));
3633     EXPECT_EQ(Expected, format(Expected, Style));
3634   }
3635   // Keep comments aligned with un-indented directives.
3636   {
3637     const char *Expected = ""
3638                            "void f() {\n"
3639                            "// Preprocessor aligned.\n"
3640                            "#define A 0\n"
3641                            "  // Code. Separated by blank line.\n"
3642                            "\n"
3643                            "#define B 0\n"
3644                            "  // Code. Not aligned with #\n"
3645                            "#define C 0\n";
3646     const char *ToFormat = ""
3647                            "void f() {\n"
3648                            "// Preprocessor aligned.\n"
3649                            "#define A 0\n"
3650                            "// Code. Separated by blank line.\n"
3651                            "\n"
3652                            "#define B 0\n"
3653                            "   // Code. Not aligned with #\n"
3654                            "#define C 0\n";
3655     EXPECT_EQ(Expected, format(ToFormat, Style));
3656     EXPECT_EQ(Expected, format(Expected, Style));
3657   }
3658   // Test AfterHash with tabs.
3659   {
3660     FormatStyle Tabbed = Style;
3661     Tabbed.UseTab = FormatStyle::UT_Always;
3662     Tabbed.IndentWidth = 8;
3663     Tabbed.TabWidth = 8;
3664     verifyFormat("#ifdef _WIN32\n"
3665                  "#\tdefine A 0\n"
3666                  "#\tifdef VAR2\n"
3667                  "#\t\tdefine B 1\n"
3668                  "#\t\tinclude <someheader.h>\n"
3669                  "#\t\tdefine MACRO          \\\n"
3670                  "\t\t\tsome_very_long_func_aaaaaaaaaa();\n"
3671                  "#\tendif\n"
3672                  "#else\n"
3673                  "#\tdefine A 1\n"
3674                  "#endif",
3675                  Tabbed);
3676   }
3677 
3678   // Regression test: Multiline-macro inside include guards.
3679   verifyFormat("#ifndef HEADER_H\n"
3680                "#define HEADER_H\n"
3681                "#define A()        \\\n"
3682                "  int i;           \\\n"
3683                "  int j;\n"
3684                "#endif // HEADER_H",
3685                getLLVMStyleWithColumns(20));
3686 
3687   Style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash;
3688   // Basic before hash indent tests
3689   verifyFormat("#ifdef _WIN32\n"
3690                "  #define A 0\n"
3691                "  #ifdef VAR2\n"
3692                "    #define B 1\n"
3693                "    #include <someheader.h>\n"
3694                "    #define MACRO                      \\\n"
3695                "      some_very_long_func_aaaaaaaaaa();\n"
3696                "  #endif\n"
3697                "#else\n"
3698                "  #define A 1\n"
3699                "#endif",
3700                Style);
3701   verifyFormat("#if A\n"
3702                "  #define MACRO                        \\\n"
3703                "    void a(int x) {                    \\\n"
3704                "      b();                             \\\n"
3705                "      c();                             \\\n"
3706                "      d();                             \\\n"
3707                "      e();                             \\\n"
3708                "      f();                             \\\n"
3709                "    }\n"
3710                "#endif",
3711                Style);
3712   // Keep comments aligned with indented directives. These
3713   // tests cannot use verifyFormat because messUp manipulates leading
3714   // whitespace.
3715   {
3716     const char *Expected = "void f() {\n"
3717                            "// Aligned to preprocessor.\n"
3718                            "#if 1\n"
3719                            "  // Aligned to code.\n"
3720                            "  int a;\n"
3721                            "  #if 1\n"
3722                            "    // Aligned to preprocessor.\n"
3723                            "    #define A 0\n"
3724                            "  // Aligned to code.\n"
3725                            "  int b;\n"
3726                            "  #endif\n"
3727                            "#endif\n"
3728                            "}";
3729     const char *ToFormat = "void f() {\n"
3730                            "// Aligned to preprocessor.\n"
3731                            "#if 1\n"
3732                            "// Aligned to code.\n"
3733                            "int a;\n"
3734                            "#if 1\n"
3735                            "// Aligned to preprocessor.\n"
3736                            "#define A 0\n"
3737                            "// Aligned to code.\n"
3738                            "int b;\n"
3739                            "#endif\n"
3740                            "#endif\n"
3741                            "}";
3742     EXPECT_EQ(Expected, format(ToFormat, Style));
3743     EXPECT_EQ(Expected, format(Expected, Style));
3744   }
3745   {
3746     const char *Expected = "void f() {\n"
3747                            "/* Aligned to preprocessor. */\n"
3748                            "#if 1\n"
3749                            "  /* Aligned to code. */\n"
3750                            "  int a;\n"
3751                            "  #if 1\n"
3752                            "    /* Aligned to preprocessor. */\n"
3753                            "    #define A 0\n"
3754                            "  /* Aligned to code. */\n"
3755                            "  int b;\n"
3756                            "  #endif\n"
3757                            "#endif\n"
3758                            "}";
3759     const char *ToFormat = "void f() {\n"
3760                            "/* Aligned to preprocessor. */\n"
3761                            "#if 1\n"
3762                            "/* Aligned to code. */\n"
3763                            "int a;\n"
3764                            "#if 1\n"
3765                            "/* Aligned to preprocessor. */\n"
3766                            "#define A 0\n"
3767                            "/* Aligned to code. */\n"
3768                            "int b;\n"
3769                            "#endif\n"
3770                            "#endif\n"
3771                            "}";
3772     EXPECT_EQ(Expected, format(ToFormat, Style));
3773     EXPECT_EQ(Expected, format(Expected, Style));
3774   }
3775 
3776   // Test single comment before preprocessor
3777   verifyFormat("// Comment\n"
3778                "\n"
3779                "#if 1\n"
3780                "#endif",
3781                Style);
3782 }
3783 
3784 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
3785   verifyFormat("{\n  { a #c; }\n}");
3786 }
3787 
3788 TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
3789   EXPECT_EQ("#define A \\\n  {       \\\n    {\nint i;",
3790             format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
3791   EXPECT_EQ("#define A \\\n  }       \\\n  }\nint i;",
3792             format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
3793 }
3794 
3795 TEST_F(FormatTest, EscapedNewlines) {
3796   FormatStyle Narrow = getLLVMStyleWithColumns(11);
3797   EXPECT_EQ("#define A \\\n  int i;  \\\n  int j;",
3798             format("#define A \\\nint i;\\\n  int j;", Narrow));
3799   EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
3800   EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
3801   EXPECT_EQ("/* \\  \\  \\\n */", format("\\\n/* \\  \\  \\\n */"));
3802   EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
3803 
3804   FormatStyle AlignLeft = getLLVMStyle();
3805   AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
3806   EXPECT_EQ("#define MACRO(x) \\\n"
3807             "private:         \\\n"
3808             "  int x(int a);\n",
3809             format("#define MACRO(x) \\\n"
3810                    "private:         \\\n"
3811                    "  int x(int a);\n",
3812                    AlignLeft));
3813 
3814   // CRLF line endings
3815   EXPECT_EQ("#define A \\\r\n  int i;  \\\r\n  int j;",
3816             format("#define A \\\r\nint i;\\\r\n  int j;", Narrow));
3817   EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;"));
3818   EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
3819   EXPECT_EQ("/* \\  \\  \\\r\n */", format("\\\r\n/* \\  \\  \\\r\n */"));
3820   EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>"));
3821   EXPECT_EQ("#define MACRO(x) \\\r\n"
3822             "private:         \\\r\n"
3823             "  int x(int a);\r\n",
3824             format("#define MACRO(x) \\\r\n"
3825                    "private:         \\\r\n"
3826                    "  int x(int a);\r\n",
3827                    AlignLeft));
3828 
3829   FormatStyle DontAlign = getLLVMStyle();
3830   DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
3831   DontAlign.MaxEmptyLinesToKeep = 3;
3832   // FIXME: can't use verifyFormat here because the newline before
3833   // "public:" is not inserted the first time it's reformatted
3834   EXPECT_EQ("#define A \\\n"
3835             "  class Foo { \\\n"
3836             "    void bar(); \\\n"
3837             "\\\n"
3838             "\\\n"
3839             "\\\n"
3840             "  public: \\\n"
3841             "    void baz(); \\\n"
3842             "  };",
3843             format("#define A \\\n"
3844                    "  class Foo { \\\n"
3845                    "    void bar(); \\\n"
3846                    "\\\n"
3847                    "\\\n"
3848                    "\\\n"
3849                    "  public: \\\n"
3850                    "    void baz(); \\\n"
3851                    "  };",
3852                    DontAlign));
3853 }
3854 
3855 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
3856   verifyFormat("#define A \\\n"
3857                "  int v(  \\\n"
3858                "      a); \\\n"
3859                "  int i;",
3860                getLLVMStyleWithColumns(11));
3861 }
3862 
3863 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
3864   EXPECT_EQ(
3865       "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3866       "                      \\\n"
3867       "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3868       "\n"
3869       "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3870       "    aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
3871       format("  #define   ALooooooooooooooooooooooooooooooooooooooongMacro("
3872              "\\\n"
3873              "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3874              "  \n"
3875              "   AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3876              "  aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
3877 }
3878 
3879 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
3880   EXPECT_EQ("int\n"
3881             "#define A\n"
3882             "    a;",
3883             format("int\n#define A\na;"));
3884   verifyFormat("functionCallTo(\n"
3885                "    someOtherFunction(\n"
3886                "        withSomeParameters, whichInSequence,\n"
3887                "        areLongerThanALine(andAnotherCall,\n"
3888                "#define A B\n"
3889                "                           withMoreParamters,\n"
3890                "                           whichStronglyInfluenceTheLayout),\n"
3891                "        andMoreParameters),\n"
3892                "    trailing);",
3893                getLLVMStyleWithColumns(69));
3894   verifyFormat("Foo::Foo()\n"
3895                "#ifdef BAR\n"
3896                "    : baz(0)\n"
3897                "#endif\n"
3898                "{\n"
3899                "}");
3900   verifyFormat("void f() {\n"
3901                "  if (true)\n"
3902                "#ifdef A\n"
3903                "    f(42);\n"
3904                "  x();\n"
3905                "#else\n"
3906                "    g();\n"
3907                "  x();\n"
3908                "#endif\n"
3909                "}");
3910   verifyFormat("void f(param1, param2,\n"
3911                "       param3,\n"
3912                "#ifdef A\n"
3913                "       param4(param5,\n"
3914                "#ifdef A1\n"
3915                "              param6,\n"
3916                "#ifdef A2\n"
3917                "              param7),\n"
3918                "#else\n"
3919                "              param8),\n"
3920                "       param9,\n"
3921                "#endif\n"
3922                "       param10,\n"
3923                "#endif\n"
3924                "       param11)\n"
3925                "#else\n"
3926                "       param12)\n"
3927                "#endif\n"
3928                "{\n"
3929                "  x();\n"
3930                "}",
3931                getLLVMStyleWithColumns(28));
3932   verifyFormat("#if 1\n"
3933                "int i;");
3934   verifyFormat("#if 1\n"
3935                "#endif\n"
3936                "#if 1\n"
3937                "#else\n"
3938                "#endif\n");
3939   verifyFormat("DEBUG({\n"
3940                "  return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3941                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
3942                "});\n"
3943                "#if a\n"
3944                "#else\n"
3945                "#endif");
3946 
3947   verifyIncompleteFormat("void f(\n"
3948                          "#if A\n"
3949                          ");\n"
3950                          "#else\n"
3951                          "#endif");
3952 }
3953 
3954 TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
3955   verifyFormat("#endif\n"
3956                "#if B");
3957 }
3958 
3959 TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
3960   FormatStyle SingleLine = getLLVMStyle();
3961   SingleLine.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse;
3962   verifyFormat("#if 0\n"
3963                "#elif 1\n"
3964                "#endif\n"
3965                "void foo() {\n"
3966                "  if (test) foo2();\n"
3967                "}",
3968                SingleLine);
3969 }
3970 
3971 TEST_F(FormatTest, LayoutBlockInsideParens) {
3972   verifyFormat("functionCall({ int i; });");
3973   verifyFormat("functionCall({\n"
3974                "  int i;\n"
3975                "  int j;\n"
3976                "});");
3977   verifyFormat("functionCall(\n"
3978                "    {\n"
3979                "      int i;\n"
3980                "      int j;\n"
3981                "    },\n"
3982                "    aaaa, bbbb, cccc);");
3983   verifyFormat("functionA(functionB({\n"
3984                "            int i;\n"
3985                "            int j;\n"
3986                "          }),\n"
3987                "          aaaa, bbbb, cccc);");
3988   verifyFormat("functionCall(\n"
3989                "    {\n"
3990                "      int i;\n"
3991                "      int j;\n"
3992                "    },\n"
3993                "    aaaa, bbbb, // comment\n"
3994                "    cccc);");
3995   verifyFormat("functionA(functionB({\n"
3996                "            int i;\n"
3997                "            int j;\n"
3998                "          }),\n"
3999                "          aaaa, bbbb, // comment\n"
4000                "          cccc);");
4001   verifyFormat("functionCall(aaaa, bbbb, { int i; });");
4002   verifyFormat("functionCall(aaaa, bbbb, {\n"
4003                "  int i;\n"
4004                "  int j;\n"
4005                "});");
4006   verifyFormat(
4007       "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
4008       "    {\n"
4009       "      int i; // break\n"
4010       "    },\n"
4011       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
4012       "                                     ccccccccccccccccc));");
4013   verifyFormat("DEBUG({\n"
4014                "  if (a)\n"
4015                "    f();\n"
4016                "});");
4017 }
4018 
4019 TEST_F(FormatTest, LayoutBlockInsideStatement) {
4020   EXPECT_EQ("SOME_MACRO { int i; }\n"
4021             "int i;",
4022             format("  SOME_MACRO  {int i;}  int i;"));
4023 }
4024 
4025 TEST_F(FormatTest, LayoutNestedBlocks) {
4026   verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
4027                "  struct s {\n"
4028                "    int i;\n"
4029                "  };\n"
4030                "  s kBitsToOs[] = {{10}};\n"
4031                "  for (int i = 0; i < 10; ++i)\n"
4032                "    return;\n"
4033                "}");
4034   verifyFormat("call(parameter, {\n"
4035                "  something();\n"
4036                "  // Comment using all columns.\n"
4037                "  somethingelse();\n"
4038                "});",
4039                getLLVMStyleWithColumns(40));
4040   verifyFormat("DEBUG( //\n"
4041                "    { f(); }, a);");
4042   verifyFormat("DEBUG( //\n"
4043                "    {\n"
4044                "      f(); //\n"
4045                "    },\n"
4046                "    a);");
4047 
4048   EXPECT_EQ("call(parameter, {\n"
4049             "  something();\n"
4050             "  // Comment too\n"
4051             "  // looooooooooong.\n"
4052             "  somethingElse();\n"
4053             "});",
4054             format("call(parameter, {\n"
4055                    "  something();\n"
4056                    "  // Comment too looooooooooong.\n"
4057                    "  somethingElse();\n"
4058                    "});",
4059                    getLLVMStyleWithColumns(29)));
4060   EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int   i; });"));
4061   EXPECT_EQ("DEBUG({ // comment\n"
4062             "  int i;\n"
4063             "});",
4064             format("DEBUG({ // comment\n"
4065                    "int  i;\n"
4066                    "});"));
4067   EXPECT_EQ("DEBUG({\n"
4068             "  int i;\n"
4069             "\n"
4070             "  // comment\n"
4071             "  int j;\n"
4072             "});",
4073             format("DEBUG({\n"
4074                    "  int  i;\n"
4075                    "\n"
4076                    "  // comment\n"
4077                    "  int  j;\n"
4078                    "});"));
4079 
4080   verifyFormat("DEBUG({\n"
4081                "  if (a)\n"
4082                "    return;\n"
4083                "});");
4084   verifyGoogleFormat("DEBUG({\n"
4085                      "  if (a) return;\n"
4086                      "});");
4087   FormatStyle Style = getGoogleStyle();
4088   Style.ColumnLimit = 45;
4089   verifyFormat("Debug(\n"
4090                "    aaaaa,\n"
4091                "    {\n"
4092                "      if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
4093                "    },\n"
4094                "    a);",
4095                Style);
4096 
4097   verifyFormat("SomeFunction({MACRO({ return output; }), b});");
4098 
4099   verifyNoCrash("^{v^{a}}");
4100 }
4101 
4102 TEST_F(FormatTest, FormatNestedBlocksInMacros) {
4103   EXPECT_EQ("#define MACRO()                     \\\n"
4104             "  Debug(aaa, /* force line break */ \\\n"
4105             "        {                           \\\n"
4106             "          int i;                    \\\n"
4107             "          int j;                    \\\n"
4108             "        })",
4109             format("#define   MACRO()   Debug(aaa,  /* force line break */ \\\n"
4110                    "          {  int   i;  int  j;   })",
4111                    getGoogleStyle()));
4112 
4113   EXPECT_EQ("#define A                                       \\\n"
4114             "  [] {                                          \\\n"
4115             "    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(        \\\n"
4116             "        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
4117             "  }",
4118             format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
4119                    "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
4120                    getGoogleStyle()));
4121 }
4122 
4123 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
4124   EXPECT_EQ("{}", format("{}"));
4125   verifyFormat("enum E {};");
4126   verifyFormat("enum E {}");
4127   FormatStyle Style = getLLVMStyle();
4128   Style.SpaceInEmptyBlock = true;
4129   EXPECT_EQ("void f() { }", format("void f() {}", Style));
4130   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty;
4131   EXPECT_EQ("while (true) { }", format("while (true) {}", Style));
4132 }
4133 
4134 TEST_F(FormatTest, FormatBeginBlockEndMacros) {
4135   FormatStyle Style = getLLVMStyle();
4136   Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
4137   Style.MacroBlockEnd = "^[A-Z_]+_END$";
4138   verifyFormat("FOO_BEGIN\n"
4139                "  FOO_ENTRY\n"
4140                "FOO_END",
4141                Style);
4142   verifyFormat("FOO_BEGIN\n"
4143                "  NESTED_FOO_BEGIN\n"
4144                "    NESTED_FOO_ENTRY\n"
4145                "  NESTED_FOO_END\n"
4146                "FOO_END",
4147                Style);
4148   verifyFormat("FOO_BEGIN(Foo, Bar)\n"
4149                "  int x;\n"
4150                "  x = 1;\n"
4151                "FOO_END(Baz)",
4152                Style);
4153 }
4154 
4155 //===----------------------------------------------------------------------===//
4156 // Line break tests.
4157 //===----------------------------------------------------------------------===//
4158 
4159 TEST_F(FormatTest, PreventConfusingIndents) {
4160   verifyFormat(
4161       "void f() {\n"
4162       "  SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
4163       "                         parameter, parameter, parameter)),\n"
4164       "                     SecondLongCall(parameter));\n"
4165       "}");
4166   verifyFormat(
4167       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4168       "    aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4169       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4170       "    aaaaaaaaaaaaaaaaaaaaaaaa);");
4171   verifyFormat(
4172       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4173       "    [aaaaaaaaaaaaaaaaaaaaaaaa\n"
4174       "         [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
4175       "         [aaaaaaaaaaaaaaaaaaaaaaaa]];");
4176   verifyFormat(
4177       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
4178       "    aaaaaaaaaaaaaaaaaaaaaaaa<\n"
4179       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
4180       "    aaaaaaaaaaaaaaaaaaaaaaaa>;");
4181   verifyFormat("int a = bbbb && ccc &&\n"
4182                "        fffff(\n"
4183                "#define A Just forcing a new line\n"
4184                "            ddd);");
4185 }
4186 
4187 TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
4188   verifyFormat(
4189       "bool aaaaaaa =\n"
4190       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
4191       "    bbbbbbbb();");
4192   verifyFormat(
4193       "bool aaaaaaa =\n"
4194       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
4195       "    bbbbbbbb();");
4196 
4197   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
4198                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
4199                "    ccccccccc == ddddddddddd;");
4200   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
4201                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
4202                "    ccccccccc == ddddddddddd;");
4203   verifyFormat(
4204       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
4205       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
4206       "    ccccccccc == ddddddddddd;");
4207 
4208   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
4209                "                 aaaaaa) &&\n"
4210                "         bbbbbb && cccccc;");
4211   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
4212                "                 aaaaaa) >>\n"
4213                "         bbbbbb;");
4214   verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
4215                "    SourceMgr.getSpellingColumnNumber(\n"
4216                "        TheLine.Last->FormatTok.Tok.getLocation()) -\n"
4217                "    1);");
4218 
4219   verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4220                "     bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
4221                "    cccccc) {\n}");
4222   verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4223                "               bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
4224                "              cccccc) {\n}");
4225   verifyFormat("if CONSTEXPR ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4226                "               bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
4227                "              cccccc) {\n}");
4228   verifyFormat("b = a &&\n"
4229                "    // Comment\n"
4230                "    b.c && d;");
4231 
4232   // If the LHS of a comparison is not a binary expression itself, the
4233   // additional linebreak confuses many people.
4234   verifyFormat(
4235       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4236       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
4237       "}");
4238   verifyFormat(
4239       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4240       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
4241       "}");
4242   verifyFormat(
4243       "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
4244       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
4245       "}");
4246   verifyFormat(
4247       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4248       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n"
4249       "}");
4250   // Even explicit parentheses stress the precedence enough to make the
4251   // additional break unnecessary.
4252   verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4253                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
4254                "}");
4255   // This cases is borderline, but with the indentation it is still readable.
4256   verifyFormat(
4257       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4258       "        aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4259       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
4260       "}",
4261       getLLVMStyleWithColumns(75));
4262 
4263   // If the LHS is a binary expression, we should still use the additional break
4264   // as otherwise the formatting hides the operator precedence.
4265   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4266                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4267                "    5) {\n"
4268                "}");
4269   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4270                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n"
4271                "    5) {\n"
4272                "}");
4273 
4274   FormatStyle OnePerLine = getLLVMStyle();
4275   OnePerLine.BinPackParameters = false;
4276   verifyFormat(
4277       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4278       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4279       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
4280       OnePerLine);
4281 
4282   verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
4283                "                .aaa(aaaaaaaaaaaaa) *\n"
4284                "            aaaaaaa +\n"
4285                "        aaaaaaa;",
4286                getLLVMStyleWithColumns(40));
4287 }
4288 
4289 TEST_F(FormatTest, ExpressionIndentation) {
4290   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4291                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4292                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4293                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4294                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4295                "                     bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
4296                "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4297                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
4298                "                 ccccccccccccccccccccccccccccccccccccccccc;");
4299   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4300                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4301                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4302                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4303   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4304                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4305                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4306                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4307   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4308                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4309                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4310                "        bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4311   verifyFormat("if () {\n"
4312                "} else if (aaaaa && bbbbb > // break\n"
4313                "                        ccccc) {\n"
4314                "}");
4315   verifyFormat("if () {\n"
4316                "} else if constexpr (aaaaa && bbbbb > // break\n"
4317                "                                  ccccc) {\n"
4318                "}");
4319   verifyFormat("if () {\n"
4320                "} else if CONSTEXPR (aaaaa && bbbbb > // break\n"
4321                "                                  ccccc) {\n"
4322                "}");
4323   verifyFormat("if () {\n"
4324                "} else if (aaaaa &&\n"
4325                "           bbbbb > // break\n"
4326                "               ccccc &&\n"
4327                "           ddddd) {\n"
4328                "}");
4329 
4330   // Presence of a trailing comment used to change indentation of b.
4331   verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
4332                "       b;\n"
4333                "return aaaaaaaaaaaaaaaaaaa +\n"
4334                "       b; //",
4335                getLLVMStyleWithColumns(30));
4336 }
4337 
4338 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
4339   // Not sure what the best system is here. Like this, the LHS can be found
4340   // immediately above an operator (everything with the same or a higher
4341   // indent). The RHS is aligned right of the operator and so compasses
4342   // everything until something with the same indent as the operator is found.
4343   // FIXME: Is this a good system?
4344   FormatStyle Style = getLLVMStyle();
4345   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4346   verifyFormat(
4347       "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4348       "                     + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4349       "                     + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4350       "                 == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4351       "                            * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4352       "                        + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4353       "             && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4354       "                        * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4355       "                    > ccccccccccccccccccccccccccccccccccccccccc;",
4356       Style);
4357   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4358                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4359                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4360                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4361                Style);
4362   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4363                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4364                "              * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4365                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4366                Style);
4367   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4368                "    == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4369                "               * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4370                "           + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4371                Style);
4372   verifyFormat("if () {\n"
4373                "} else if (aaaaa\n"
4374                "           && bbbbb // break\n"
4375                "                  > ccccc) {\n"
4376                "}",
4377                Style);
4378   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4379                "       && bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
4380                Style);
4381   verifyFormat("return (a)\n"
4382                "       // comment\n"
4383                "       + b;",
4384                Style);
4385   verifyFormat(
4386       "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4387       "                 * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4388       "             + cc;",
4389       Style);
4390 
4391   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4392                "    = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4393                Style);
4394 
4395   // Forced by comments.
4396   verifyFormat(
4397       "unsigned ContentSize =\n"
4398       "    sizeof(int16_t)   // DWARF ARange version number\n"
4399       "    + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
4400       "    + sizeof(int8_t)  // Pointer Size (in bytes)\n"
4401       "    + sizeof(int8_t); // Segment Size (in bytes)");
4402 
4403   verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
4404                "       == boost::fusion::at_c<1>(iiii).second;",
4405                Style);
4406 
4407   Style.ColumnLimit = 60;
4408   verifyFormat("zzzzzzzzzz\n"
4409                "    = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4410                "      >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
4411                Style);
4412 
4413   Style.ColumnLimit = 80;
4414   Style.IndentWidth = 4;
4415   Style.TabWidth = 4;
4416   Style.UseTab = FormatStyle::UT_Always;
4417   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4418   Style.AlignOperands = FormatStyle::OAS_DontAlign;
4419   EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n"
4420             "\t&& (someOtherLongishConditionPart1\n"
4421             "\t\t|| someOtherEvenLongerNestedConditionPart2);",
4422             format("return someVeryVeryLongConditionThatBarelyFitsOnALine && "
4423                    "(someOtherLongishConditionPart1 || "
4424                    "someOtherEvenLongerNestedConditionPart2);",
4425                    Style));
4426 }
4427 
4428 TEST_F(FormatTest, ExpressionIndentationStrictAlign) {
4429   FormatStyle Style = getLLVMStyle();
4430   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4431   Style.AlignOperands = FormatStyle::OAS_AlignAfterOperator;
4432 
4433   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4434                "                   + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4435                "                   + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4436                "              == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4437                "                         * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4438                "                     + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4439                "          && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4440                "                     * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4441                "                 > ccccccccccccccccccccccccccccccccccccccccc;",
4442                Style);
4443   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4444                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4445                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4446                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4447                Style);
4448   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4449                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4450                "              * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4451                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4452                Style);
4453   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4454                "    == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4455                "               * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4456                "           + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4457                Style);
4458   verifyFormat("if () {\n"
4459                "} else if (aaaaa\n"
4460                "           && bbbbb // break\n"
4461                "                  > ccccc) {\n"
4462                "}",
4463                Style);
4464   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4465                "    && bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
4466                Style);
4467   verifyFormat("return (a)\n"
4468                "     // comment\n"
4469                "     + b;",
4470                Style);
4471   verifyFormat(
4472       "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4473       "               * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4474       "           + cc;",
4475       Style);
4476   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n"
4477                "     : bbbbbbbbbbbbbbbb ? 2222222222222222\n"
4478                "                        : 3333333333333333;",
4479                Style);
4480   verifyFormat(
4481       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaa    ? bbbbbbbbbbbbbbbbbb\n"
4482       "                           : ccccccccccccccc ? dddddddddddddddddd\n"
4483       "                                             : eeeeeeeeeeeeeeeeee)\n"
4484       "     : bbbbbbbbbbbbbbbb ? 2222222222222222\n"
4485       "                        : 3333333333333333;",
4486       Style);
4487   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4488                "    = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4489                Style);
4490 
4491   verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
4492                "    == boost::fusion::at_c<1>(iiii).second;",
4493                Style);
4494 
4495   Style.ColumnLimit = 60;
4496   verifyFormat("zzzzzzzzzzzzz\n"
4497                "    = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4498                "   >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
4499                Style);
4500 
4501   // Forced by comments.
4502   Style.ColumnLimit = 80;
4503   verifyFormat(
4504       "unsigned ContentSize\n"
4505       "    = sizeof(int16_t) // DWARF ARange version number\n"
4506       "    + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
4507       "    + sizeof(int8_t)  // Pointer Size (in bytes)\n"
4508       "    + sizeof(int8_t); // Segment Size (in bytes)",
4509       Style);
4510 
4511   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4512   verifyFormat(
4513       "unsigned ContentSize =\n"
4514       "    sizeof(int16_t)   // DWARF ARange version number\n"
4515       "    + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
4516       "    + sizeof(int8_t)  // Pointer Size (in bytes)\n"
4517       "    + sizeof(int8_t); // Segment Size (in bytes)",
4518       Style);
4519 
4520   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4521   verifyFormat(
4522       "unsigned ContentSize =\n"
4523       "    sizeof(int16_t)   // DWARF ARange version number\n"
4524       "    + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
4525       "    + sizeof(int8_t)  // Pointer Size (in bytes)\n"
4526       "    + sizeof(int8_t); // Segment Size (in bytes)",
4527       Style);
4528 }
4529 
4530 TEST_F(FormatTest, EnforcedOperatorWraps) {
4531   // Here we'd like to wrap after the || operators, but a comment is forcing an
4532   // earlier wrap.
4533   verifyFormat("bool x = aaaaa //\n"
4534                "         || bbbbb\n"
4535                "         //\n"
4536                "         || cccc;");
4537 }
4538 
4539 TEST_F(FormatTest, NoOperandAlignment) {
4540   FormatStyle Style = getLLVMStyle();
4541   Style.AlignOperands = FormatStyle::OAS_DontAlign;
4542   verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
4543                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4544                "                   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4545                Style);
4546   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4547   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4548                "            + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4549                "            + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4550                "        == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4551                "                * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4552                "            + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4553                "    && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4554                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4555                "        > ccccccccccccccccccccccccccccccccccccccccc;",
4556                Style);
4557 
4558   verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4559                "        * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4560                "    + cc;",
4561                Style);
4562   verifyFormat("int a = aa\n"
4563                "    + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4564                "        * cccccccccccccccccccccccccccccccccccc;\n",
4565                Style);
4566 
4567   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4568   verifyFormat("return (a > b\n"
4569                "    // comment1\n"
4570                "    // comment2\n"
4571                "    || c);",
4572                Style);
4573 }
4574 
4575 TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
4576   FormatStyle Style = getLLVMStyle();
4577   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4578   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4579                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4580                "    + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
4581                Style);
4582 }
4583 
4584 TEST_F(FormatTest, AllowBinPackingInsideArguments) {
4585   FormatStyle Style = getLLVMStyle();
4586   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4587   Style.BinPackArguments = false;
4588   Style.ColumnLimit = 40;
4589   verifyFormat("void test() {\n"
4590                "  someFunction(\n"
4591                "      this + argument + is + quite\n"
4592                "      + long + so + it + gets + wrapped\n"
4593                "      + but + remains + bin - packed);\n"
4594                "}",
4595                Style);
4596   verifyFormat("void test() {\n"
4597                "  someFunction(arg1,\n"
4598                "               this + argument + is\n"
4599                "                   + quite + long + so\n"
4600                "                   + it + gets + wrapped\n"
4601                "                   + but + remains + bin\n"
4602                "                   - packed,\n"
4603                "               arg3);\n"
4604                "}",
4605                Style);
4606   verifyFormat("void test() {\n"
4607                "  someFunction(\n"
4608                "      arg1,\n"
4609                "      this + argument + has\n"
4610                "          + anotherFunc(nested,\n"
4611                "                        calls + whose\n"
4612                "                            + arguments\n"
4613                "                            + are + also\n"
4614                "                            + wrapped,\n"
4615                "                        in + addition)\n"
4616                "          + to + being + bin - packed,\n"
4617                "      arg3);\n"
4618                "}",
4619                Style);
4620 
4621   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4622   verifyFormat("void test() {\n"
4623                "  someFunction(\n"
4624                "      arg1,\n"
4625                "      this + argument + has +\n"
4626                "          anotherFunc(nested,\n"
4627                "                      calls + whose +\n"
4628                "                          arguments +\n"
4629                "                          are + also +\n"
4630                "                          wrapped,\n"
4631                "                      in + addition) +\n"
4632                "          to + being + bin - packed,\n"
4633                "      arg3);\n"
4634                "}",
4635                Style);
4636 }
4637 
4638 TEST_F(FormatTest, ConstructorInitializers) {
4639   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
4640   verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
4641                getLLVMStyleWithColumns(45));
4642   verifyFormat("Constructor()\n"
4643                "    : Inttializer(FitsOnTheLine) {}",
4644                getLLVMStyleWithColumns(44));
4645   verifyFormat("Constructor()\n"
4646                "    : Inttializer(FitsOnTheLine) {}",
4647                getLLVMStyleWithColumns(43));
4648 
4649   verifyFormat("template <typename T>\n"
4650                "Constructor() : Initializer(FitsOnTheLine) {}",
4651                getLLVMStyleWithColumns(45));
4652 
4653   verifyFormat(
4654       "SomeClass::Constructor()\n"
4655       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
4656 
4657   verifyFormat(
4658       "SomeClass::Constructor()\n"
4659       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4660       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
4661   verifyFormat(
4662       "SomeClass::Constructor()\n"
4663       "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4664       "      aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
4665   verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4666                "            aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4667                "    : aaaaaaaaaa(aaaaaa) {}");
4668 
4669   verifyFormat("Constructor()\n"
4670                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4671                "      aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4672                "                               aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4673                "      aaaaaaaaaaaaaaaaaaaaaaa() {}");
4674 
4675   verifyFormat("Constructor()\n"
4676                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4677                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
4678 
4679   verifyFormat("Constructor(int Parameter = 0)\n"
4680                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
4681                "      aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
4682   verifyFormat("Constructor()\n"
4683                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
4684                "}",
4685                getLLVMStyleWithColumns(60));
4686   verifyFormat("Constructor()\n"
4687                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4688                "          aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
4689 
4690   // Here a line could be saved by splitting the second initializer onto two
4691   // lines, but that is not desirable.
4692   verifyFormat("Constructor()\n"
4693                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
4694                "      aaaaaaaaaaa(aaaaaaaaaaa),\n"
4695                "      aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
4696 
4697   FormatStyle OnePerLine = getLLVMStyle();
4698   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4699   OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
4700   verifyFormat("SomeClass::Constructor()\n"
4701                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4702                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4703                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4704                OnePerLine);
4705   verifyFormat("SomeClass::Constructor()\n"
4706                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
4707                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4708                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4709                OnePerLine);
4710   verifyFormat("MyClass::MyClass(int var)\n"
4711                "    : some_var_(var),            // 4 space indent\n"
4712                "      some_other_var_(var + 1) { // lined up\n"
4713                "}",
4714                OnePerLine);
4715   verifyFormat("Constructor()\n"
4716                "    : aaaaa(aaaaaa),\n"
4717                "      aaaaa(aaaaaa),\n"
4718                "      aaaaa(aaaaaa),\n"
4719                "      aaaaa(aaaaaa),\n"
4720                "      aaaaa(aaaaaa) {}",
4721                OnePerLine);
4722   verifyFormat("Constructor()\n"
4723                "    : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4724                "            aaaaaaaaaaaaaaaaaaaaaa) {}",
4725                OnePerLine);
4726   OnePerLine.BinPackParameters = false;
4727   verifyFormat(
4728       "Constructor()\n"
4729       "    : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4730       "          aaaaaaaaaaa().aaa(),\n"
4731       "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4732       OnePerLine);
4733   OnePerLine.ColumnLimit = 60;
4734   verifyFormat("Constructor()\n"
4735                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4736                "      bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
4737                OnePerLine);
4738 
4739   EXPECT_EQ("Constructor()\n"
4740             "    : // Comment forcing unwanted break.\n"
4741             "      aaaa(aaaa) {}",
4742             format("Constructor() :\n"
4743                    "    // Comment forcing unwanted break.\n"
4744                    "    aaaa(aaaa) {}"));
4745 }
4746 
4747 TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) {
4748   FormatStyle Style = getLLVMStyle();
4749   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4750   Style.ColumnLimit = 60;
4751   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4752   Style.AllowAllConstructorInitializersOnNextLine = true;
4753   Style.BinPackParameters = false;
4754 
4755   for (int i = 0; i < 4; ++i) {
4756     // Test all combinations of parameters that should not have an effect.
4757     Style.AllowAllParametersOfDeclarationOnNextLine = i & 1;
4758     Style.AllowAllArgumentsOnNextLine = i & 2;
4759 
4760     Style.AllowAllConstructorInitializersOnNextLine = true;
4761     Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4762     verifyFormat("Constructor()\n"
4763                  "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4764                  Style);
4765     verifyFormat("Constructor() : a(a), b(b) {}", Style);
4766 
4767     Style.AllowAllConstructorInitializersOnNextLine = false;
4768     verifyFormat("Constructor()\n"
4769                  "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4770                  "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4771                  Style);
4772     verifyFormat("Constructor() : a(a), b(b) {}", Style);
4773 
4774     Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
4775     Style.AllowAllConstructorInitializersOnNextLine = true;
4776     verifyFormat("Constructor()\n"
4777                  "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4778                  Style);
4779 
4780     Style.AllowAllConstructorInitializersOnNextLine = false;
4781     verifyFormat("Constructor()\n"
4782                  "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4783                  "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4784                  Style);
4785 
4786     Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4787     Style.AllowAllConstructorInitializersOnNextLine = true;
4788     verifyFormat("Constructor() :\n"
4789                  "    aaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4790                  Style);
4791 
4792     Style.AllowAllConstructorInitializersOnNextLine = false;
4793     verifyFormat("Constructor() :\n"
4794                  "    aaaaaaaaaaaaaaaaaa(a),\n"
4795                  "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4796                  Style);
4797   }
4798 
4799   // Test interactions between AllowAllParametersOfDeclarationOnNextLine and
4800   // AllowAllConstructorInitializersOnNextLine in all
4801   // BreakConstructorInitializers modes
4802   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4803   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4804   Style.AllowAllConstructorInitializersOnNextLine = false;
4805   verifyFormat("SomeClassWithALongName::Constructor(\n"
4806                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n"
4807                "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4808                "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4809                Style);
4810 
4811   Style.AllowAllConstructorInitializersOnNextLine = true;
4812   verifyFormat("SomeClassWithALongName::Constructor(\n"
4813                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4814                "    int bbbbbbbbbbbbb,\n"
4815                "    int cccccccccccccccc)\n"
4816                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4817                Style);
4818 
4819   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4820   Style.AllowAllConstructorInitializersOnNextLine = false;
4821   verifyFormat("SomeClassWithALongName::Constructor(\n"
4822                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4823                "    int bbbbbbbbbbbbb)\n"
4824                "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4825                "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4826                Style);
4827 
4828   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
4829 
4830   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4831   verifyFormat("SomeClassWithALongName::Constructor(\n"
4832                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n"
4833                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4834                "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4835                Style);
4836 
4837   Style.AllowAllConstructorInitializersOnNextLine = true;
4838   verifyFormat("SomeClassWithALongName::Constructor(\n"
4839                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4840                "    int bbbbbbbbbbbbb,\n"
4841                "    int cccccccccccccccc)\n"
4842                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4843                Style);
4844 
4845   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4846   Style.AllowAllConstructorInitializersOnNextLine = false;
4847   verifyFormat("SomeClassWithALongName::Constructor(\n"
4848                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4849                "    int bbbbbbbbbbbbb)\n"
4850                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4851                "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4852                Style);
4853 
4854   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4855   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4856   verifyFormat("SomeClassWithALongName::Constructor(\n"
4857                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb) :\n"
4858                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4859                "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4860                Style);
4861 
4862   Style.AllowAllConstructorInitializersOnNextLine = true;
4863   verifyFormat("SomeClassWithALongName::Constructor(\n"
4864                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4865                "    int bbbbbbbbbbbbb,\n"
4866                "    int cccccccccccccccc) :\n"
4867                "    aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4868                Style);
4869 
4870   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4871   Style.AllowAllConstructorInitializersOnNextLine = false;
4872   verifyFormat("SomeClassWithALongName::Constructor(\n"
4873                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4874                "    int bbbbbbbbbbbbb) :\n"
4875                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4876                "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4877                Style);
4878 }
4879 
4880 TEST_F(FormatTest, AllowAllArgumentsOnNextLine) {
4881   FormatStyle Style = getLLVMStyle();
4882   Style.ColumnLimit = 60;
4883   Style.BinPackArguments = false;
4884   for (int i = 0; i < 4; ++i) {
4885     // Test all combinations of parameters that should not have an effect.
4886     Style.AllowAllParametersOfDeclarationOnNextLine = i & 1;
4887     Style.AllowAllConstructorInitializersOnNextLine = i & 2;
4888 
4889     Style.AllowAllArgumentsOnNextLine = true;
4890     verifyFormat("void foo() {\n"
4891                  "  FunctionCallWithReallyLongName(\n"
4892                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb);\n"
4893                  "}",
4894                  Style);
4895     Style.AllowAllArgumentsOnNextLine = false;
4896     verifyFormat("void foo() {\n"
4897                  "  FunctionCallWithReallyLongName(\n"
4898                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4899                  "      bbbbbbbbbbbb);\n"
4900                  "}",
4901                  Style);
4902 
4903     Style.AllowAllArgumentsOnNextLine = true;
4904     verifyFormat("void foo() {\n"
4905                  "  auto VariableWithReallyLongName = {\n"
4906                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb};\n"
4907                  "}",
4908                  Style);
4909     Style.AllowAllArgumentsOnNextLine = false;
4910     verifyFormat("void foo() {\n"
4911                  "  auto VariableWithReallyLongName = {\n"
4912                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4913                  "      bbbbbbbbbbbb};\n"
4914                  "}",
4915                  Style);
4916   }
4917 
4918   // This parameter should not affect declarations.
4919   Style.BinPackParameters = false;
4920   Style.AllowAllArgumentsOnNextLine = false;
4921   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4922   verifyFormat("void FunctionCallWithReallyLongName(\n"
4923                "    int aaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbb);",
4924                Style);
4925   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4926   verifyFormat("void FunctionCallWithReallyLongName(\n"
4927                "    int aaaaaaaaaaaaaaaaaaaaaaa,\n"
4928                "    int bbbbbbbbbbbb);",
4929                Style);
4930 }
4931 
4932 TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
4933   FormatStyle Style = getLLVMStyle();
4934   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4935 
4936   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
4937   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
4938                getStyleWithColumns(Style, 45));
4939   verifyFormat("Constructor() :\n"
4940                "    Initializer(FitsOnTheLine) {}",
4941                getStyleWithColumns(Style, 44));
4942   verifyFormat("Constructor() :\n"
4943                "    Initializer(FitsOnTheLine) {}",
4944                getStyleWithColumns(Style, 43));
4945 
4946   verifyFormat("template <typename T>\n"
4947                "Constructor() : Initializer(FitsOnTheLine) {}",
4948                getStyleWithColumns(Style, 50));
4949   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4950   verifyFormat(
4951       "SomeClass::Constructor() :\n"
4952       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
4953       Style);
4954 
4955   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = false;
4956   verifyFormat(
4957       "SomeClass::Constructor() :\n"
4958       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
4959       Style);
4960 
4961   verifyFormat(
4962       "SomeClass::Constructor() :\n"
4963       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4964       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4965       Style);
4966   verifyFormat(
4967       "SomeClass::Constructor() :\n"
4968       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4969       "    aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
4970       Style);
4971   verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4972                "            aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4973                "    aaaaaaaaaa(aaaaaa) {}",
4974                Style);
4975 
4976   verifyFormat("Constructor() :\n"
4977                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4978                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4979                "                             aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4980                "    aaaaaaaaaaaaaaaaaaaaaaa() {}",
4981                Style);
4982 
4983   verifyFormat("Constructor() :\n"
4984                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4985                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4986                Style);
4987 
4988   verifyFormat("Constructor(int Parameter = 0) :\n"
4989                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
4990                "    aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
4991                Style);
4992   verifyFormat("Constructor() :\n"
4993                "    aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
4994                "}",
4995                getStyleWithColumns(Style, 60));
4996   verifyFormat("Constructor() :\n"
4997                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4998                "        aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
4999                Style);
5000 
5001   // Here a line could be saved by splitting the second initializer onto two
5002   // lines, but that is not desirable.
5003   verifyFormat("Constructor() :\n"
5004                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
5005                "    aaaaaaaaaaa(aaaaaaaaaaa),\n"
5006                "    aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5007                Style);
5008 
5009   FormatStyle OnePerLine = Style;
5010   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
5011   OnePerLine.AllowAllConstructorInitializersOnNextLine = false;
5012   verifyFormat("SomeClass::Constructor() :\n"
5013                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
5014                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
5015                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
5016                OnePerLine);
5017   verifyFormat("SomeClass::Constructor() :\n"
5018                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
5019                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
5020                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
5021                OnePerLine);
5022   verifyFormat("MyClass::MyClass(int var) :\n"
5023                "    some_var_(var),            // 4 space indent\n"
5024                "    some_other_var_(var + 1) { // lined up\n"
5025                "}",
5026                OnePerLine);
5027   verifyFormat("Constructor() :\n"
5028                "    aaaaa(aaaaaa),\n"
5029                "    aaaaa(aaaaaa),\n"
5030                "    aaaaa(aaaaaa),\n"
5031                "    aaaaa(aaaaaa),\n"
5032                "    aaaaa(aaaaaa) {}",
5033                OnePerLine);
5034   verifyFormat("Constructor() :\n"
5035                "    aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5036                "          aaaaaaaaaaaaaaaaaaaaaa) {}",
5037                OnePerLine);
5038   OnePerLine.BinPackParameters = false;
5039   verifyFormat("Constructor() :\n"
5040                "    aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5041                "        aaaaaaaaaaa().aaa(),\n"
5042                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5043                OnePerLine);
5044   OnePerLine.ColumnLimit = 60;
5045   verifyFormat("Constructor() :\n"
5046                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
5047                "    bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
5048                OnePerLine);
5049 
5050   EXPECT_EQ("Constructor() :\n"
5051             "    // Comment forcing unwanted break.\n"
5052             "    aaaa(aaaa) {}",
5053             format("Constructor() :\n"
5054                    "    // Comment forcing unwanted break.\n"
5055                    "    aaaa(aaaa) {}",
5056                    Style));
5057 
5058   Style.ColumnLimit = 0;
5059   verifyFormat("SomeClass::Constructor() :\n"
5060                "    a(a) {}",
5061                Style);
5062   verifyFormat("SomeClass::Constructor() noexcept :\n"
5063                "    a(a) {}",
5064                Style);
5065   verifyFormat("SomeClass::Constructor() :\n"
5066                "    a(a), b(b), c(c) {}",
5067                Style);
5068   verifyFormat("SomeClass::Constructor() :\n"
5069                "    a(a) {\n"
5070                "  foo();\n"
5071                "  bar();\n"
5072                "}",
5073                Style);
5074 
5075   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
5076   verifyFormat("SomeClass::Constructor() :\n"
5077                "    a(a), b(b), c(c) {\n"
5078                "}",
5079                Style);
5080   verifyFormat("SomeClass::Constructor() :\n"
5081                "    a(a) {\n"
5082                "}",
5083                Style);
5084 
5085   Style.ColumnLimit = 80;
5086   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
5087   Style.ConstructorInitializerIndentWidth = 2;
5088   verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}", Style);
5089   verifyFormat("SomeClass::Constructor() :\n"
5090                "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5091                "  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
5092                Style);
5093 
5094   // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as
5095   // well
5096   Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
5097   verifyFormat(
5098       "class SomeClass\n"
5099       "  : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5100       "    public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
5101       Style);
5102   Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
5103   verifyFormat(
5104       "class SomeClass\n"
5105       "  : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5106       "  , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
5107       Style);
5108   Style.BreakInheritanceList = FormatStyle::BILS_AfterColon;
5109   verifyFormat(
5110       "class SomeClass :\n"
5111       "  public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5112       "  public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
5113       Style);
5114 }
5115 
5116 #ifndef EXPENSIVE_CHECKS
5117 // Expensive checks enables libstdc++ checking which includes validating the
5118 // state of ranges used in std::priority_queue - this blows out the
5119 // runtime/scalability of the function and makes this test unacceptably slow.
5120 TEST_F(FormatTest, MemoizationTests) {
5121   // This breaks if the memoization lookup does not take \c Indent and
5122   // \c LastSpace into account.
5123   verifyFormat(
5124       "extern CFRunLoopTimerRef\n"
5125       "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
5126       "                     CFTimeInterval interval, CFOptionFlags flags,\n"
5127       "                     CFIndex order, CFRunLoopTimerCallBack callout,\n"
5128       "                     CFRunLoopTimerContext *context) {}");
5129 
5130   // Deep nesting somewhat works around our memoization.
5131   verifyFormat(
5132       "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
5133       "    aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
5134       "        aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
5135       "            aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
5136       "                aaaaa())))))))))))))))))))))))))))))))))))))));",
5137       getLLVMStyleWithColumns(65));
5138   verifyFormat(
5139       "aaaaa(\n"
5140       "    aaaaa,\n"
5141       "    aaaaa(\n"
5142       "        aaaaa,\n"
5143       "        aaaaa(\n"
5144       "            aaaaa,\n"
5145       "            aaaaa(\n"
5146       "                aaaaa,\n"
5147       "                aaaaa(\n"
5148       "                    aaaaa,\n"
5149       "                    aaaaa(\n"
5150       "                        aaaaa,\n"
5151       "                        aaaaa(\n"
5152       "                            aaaaa,\n"
5153       "                            aaaaa(\n"
5154       "                                aaaaa,\n"
5155       "                                aaaaa(\n"
5156       "                                    aaaaa,\n"
5157       "                                    aaaaa(\n"
5158       "                                        aaaaa,\n"
5159       "                                        aaaaa(\n"
5160       "                                            aaaaa,\n"
5161       "                                            aaaaa(\n"
5162       "                                                aaaaa,\n"
5163       "                                                aaaaa))))))))))));",
5164       getLLVMStyleWithColumns(65));
5165   verifyFormat(
5166       "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"
5167       "                                  a),\n"
5168       "                                a),\n"
5169       "                              a),\n"
5170       "                            a),\n"
5171       "                          a),\n"
5172       "                        a),\n"
5173       "                      a),\n"
5174       "                    a),\n"
5175       "                  a),\n"
5176       "                a),\n"
5177       "              a),\n"
5178       "            a),\n"
5179       "          a),\n"
5180       "        a),\n"
5181       "      a),\n"
5182       "    a),\n"
5183       "  a)",
5184       getLLVMStyleWithColumns(65));
5185 
5186   // This test takes VERY long when memoization is broken.
5187   FormatStyle OnePerLine = getLLVMStyle();
5188   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
5189   OnePerLine.BinPackParameters = false;
5190   std::string input = "Constructor()\n"
5191                       "    : aaaa(a,\n";
5192   for (unsigned i = 0, e = 80; i != e; ++i) {
5193     input += "           a,\n";
5194   }
5195   input += "           a) {}";
5196   verifyFormat(input, OnePerLine);
5197 }
5198 #endif
5199 
5200 TEST_F(FormatTest, BreaksAsHighAsPossible) {
5201   verifyFormat(
5202       "void f() {\n"
5203       "  if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
5204       "      (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
5205       "    f();\n"
5206       "}");
5207   verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
5208                "    Intervals[i - 1].getRange().getLast()) {\n}");
5209 }
5210 
5211 TEST_F(FormatTest, BreaksFunctionDeclarations) {
5212   // Principially, we break function declarations in a certain order:
5213   // 1) break amongst arguments.
5214   verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
5215                "                              Cccccccccccccc cccccccccccccc);");
5216   verifyFormat("template <class TemplateIt>\n"
5217                "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
5218                "                            TemplateIt *stop) {}");
5219 
5220   // 2) break after return type.
5221   verifyFormat(
5222       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5223       "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
5224       getGoogleStyle());
5225 
5226   // 3) break after (.
5227   verifyFormat(
5228       "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
5229       "    Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
5230       getGoogleStyle());
5231 
5232   // 4) break before after nested name specifiers.
5233   verifyFormat(
5234       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5235       "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
5236       "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
5237       getGoogleStyle());
5238 
5239   // However, there are exceptions, if a sufficient amount of lines can be
5240   // saved.
5241   // FIXME: The precise cut-offs wrt. the number of saved lines might need some
5242   // more adjusting.
5243   verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
5244                "                                  Cccccccccccccc cccccccccc,\n"
5245                "                                  Cccccccccccccc cccccccccc,\n"
5246                "                                  Cccccccccccccc cccccccccc,\n"
5247                "                                  Cccccccccccccc cccccccccc);");
5248   verifyFormat(
5249       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5250       "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
5251       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
5252       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
5253       getGoogleStyle());
5254   verifyFormat(
5255       "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
5256       "                                          Cccccccccccccc cccccccccc,\n"
5257       "                                          Cccccccccccccc cccccccccc,\n"
5258       "                                          Cccccccccccccc cccccccccc,\n"
5259       "                                          Cccccccccccccc cccccccccc,\n"
5260       "                                          Cccccccccccccc cccccccccc,\n"
5261       "                                          Cccccccccccccc cccccccccc);");
5262   verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
5263                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
5264                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
5265                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
5266                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
5267 
5268   // Break after multi-line parameters.
5269   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5270                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5271                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5272                "    bbbb bbbb);");
5273   verifyFormat("void SomeLoooooooooooongFunction(\n"
5274                "    std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
5275                "        aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5276                "    int bbbbbbbbbbbbb);");
5277 
5278   // Treat overloaded operators like other functions.
5279   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
5280                "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
5281   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
5282                "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
5283   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
5284                "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
5285   verifyGoogleFormat(
5286       "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
5287       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
5288   verifyGoogleFormat(
5289       "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
5290       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
5291   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5292                "    int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
5293   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
5294                "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
5295   verifyGoogleFormat(
5296       "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
5297       "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5298       "    bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
5299   verifyGoogleFormat("template <typename T>\n"
5300                      "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5301                      "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
5302                      "    aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
5303 
5304   FormatStyle Style = getLLVMStyle();
5305   Style.PointerAlignment = FormatStyle::PAS_Left;
5306   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5307                "    aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
5308                Style);
5309   verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
5310                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5311                Style);
5312 }
5313 
5314 TEST_F(FormatTest, DontBreakBeforeQualifiedOperator) {
5315   // Regression test for https://bugs.llvm.org/show_bug.cgi?id=40516:
5316   // Prefer keeping `::` followed by `operator` together.
5317   EXPECT_EQ("const aaaa::bbbbbbb &\n"
5318             "ccccccccc::operator++() {\n"
5319             "  stuff();\n"
5320             "}",
5321             format("const aaaa::bbbbbbb\n"
5322                    "&ccccccccc::operator++() { stuff(); }",
5323                    getLLVMStyleWithColumns(40)));
5324 }
5325 
5326 TEST_F(FormatTest, TrailingReturnType) {
5327   verifyFormat("auto foo() -> int;\n");
5328   // correct trailing return type spacing
5329   verifyFormat("auto operator->() -> int;\n");
5330   verifyFormat("auto operator++(int) -> int;\n");
5331 
5332   verifyFormat("struct S {\n"
5333                "  auto bar() const -> int;\n"
5334                "};");
5335   verifyFormat("template <size_t Order, typename T>\n"
5336                "auto load_img(const std::string &filename)\n"
5337                "    -> alias::tensor<Order, T, mem::tag::cpu> {}");
5338   verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
5339                "    -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
5340   verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
5341   verifyFormat("template <typename T>\n"
5342                "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
5343                "    -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
5344 
5345   // Not trailing return types.
5346   verifyFormat("void f() { auto a = b->c(); }");
5347 }
5348 
5349 TEST_F(FormatTest, DeductionGuides) {
5350   verifyFormat("template <class T> A(const T &, const T &) -> A<T &>;");
5351   verifyFormat("template <class T> explicit A(T &, T &&) -> A<T>;");
5352   verifyFormat("template <class... Ts> S(Ts...) -> S<Ts...>;");
5353   verifyFormat(
5354       "template <class... T>\n"
5355       "array(T &&...t) -> array<std::common_type_t<T...>, sizeof...(T)>;");
5356   verifyFormat("template <class T> A() -> A<decltype(p->foo<3>())>;");
5357   verifyFormat("template <class T> A() -> A<decltype(foo<traits<1>>)>;");
5358   verifyFormat("template <class T> A() -> A<sizeof(p->foo<1>)>;");
5359   verifyFormat("template <class T> A() -> A<(3 < 2)>;");
5360   verifyFormat("template <class T> A() -> A<((3) < (2))>;");
5361   verifyFormat("template <class T> x() -> x<1>;");
5362   verifyFormat("template <class T> explicit x(T &) -> x<1>;");
5363 
5364   // Ensure not deduction guides.
5365   verifyFormat("c()->f<int>();");
5366   verifyFormat("x()->foo<1>;");
5367   verifyFormat("x = p->foo<3>();");
5368   verifyFormat("x()->x<1>();");
5369   verifyFormat("x()->x<1>;");
5370 }
5371 
5372 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
5373   // Avoid breaking before trailing 'const' or other trailing annotations, if
5374   // they are not function-like.
5375   FormatStyle Style = getGoogleStyle();
5376   Style.ColumnLimit = 47;
5377   verifyFormat("void someLongFunction(\n"
5378                "    int someLoooooooooooooongParameter) const {\n}",
5379                getLLVMStyleWithColumns(47));
5380   verifyFormat("LoooooongReturnType\n"
5381                "someLoooooooongFunction() const {}",
5382                getLLVMStyleWithColumns(47));
5383   verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
5384                "    const {}",
5385                Style);
5386   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
5387                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
5388   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
5389                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
5390   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
5391                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
5392   verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
5393                "                   aaaaaaaaaaa aaaaa) const override;");
5394   verifyGoogleFormat(
5395       "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5396       "    const override;");
5397 
5398   // Even if the first parameter has to be wrapped.
5399   verifyFormat("void someLongFunction(\n"
5400                "    int someLongParameter) const {}",
5401                getLLVMStyleWithColumns(46));
5402   verifyFormat("void someLongFunction(\n"
5403                "    int someLongParameter) const {}",
5404                Style);
5405   verifyFormat("void someLongFunction(\n"
5406                "    int someLongParameter) override {}",
5407                Style);
5408   verifyFormat("void someLongFunction(\n"
5409                "    int someLongParameter) OVERRIDE {}",
5410                Style);
5411   verifyFormat("void someLongFunction(\n"
5412                "    int someLongParameter) final {}",
5413                Style);
5414   verifyFormat("void someLongFunction(\n"
5415                "    int someLongParameter) FINAL {}",
5416                Style);
5417   verifyFormat("void someLongFunction(\n"
5418                "    int parameter) const override {}",
5419                Style);
5420 
5421   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
5422   verifyFormat("void someLongFunction(\n"
5423                "    int someLongParameter) const\n"
5424                "{\n"
5425                "}",
5426                Style);
5427 
5428   Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths;
5429   verifyFormat("void someLongFunction(\n"
5430                "    int someLongParameter) const\n"
5431                "  {\n"
5432                "  }",
5433                Style);
5434 
5435   // Unless these are unknown annotations.
5436   verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
5437                "                  aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5438                "    LONG_AND_UGLY_ANNOTATION;");
5439 
5440   // Breaking before function-like trailing annotations is fine to keep them
5441   // close to their arguments.
5442   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5443                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
5444   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
5445                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
5446   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
5447                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
5448   verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
5449                      "    AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
5450   verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
5451 
5452   verifyFormat(
5453       "void aaaaaaaaaaaaaaaaaa()\n"
5454       "    __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
5455       "                   aaaaaaaaaaaaaaaaaaaaaaaaa));");
5456   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5457                "    __attribute__((unused));");
5458   verifyGoogleFormat(
5459       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5460       "    GUARDED_BY(aaaaaaaaaaaa);");
5461   verifyGoogleFormat(
5462       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5463       "    GUARDED_BY(aaaaaaaaaaaa);");
5464   verifyGoogleFormat(
5465       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
5466       "    aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5467   verifyGoogleFormat(
5468       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
5469       "    aaaaaaaaaaaaaaaaaaaaaaaaa;");
5470 }
5471 
5472 TEST_F(FormatTest, FunctionAnnotations) {
5473   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
5474                "int OldFunction(const string &parameter) {}");
5475   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
5476                "string OldFunction(const string &parameter) {}");
5477   verifyFormat("template <typename T>\n"
5478                "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
5479                "string OldFunction(const string &parameter) {}");
5480 
5481   // Not function annotations.
5482   verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5483                "                << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
5484   verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
5485                "       ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
5486   verifyFormat("MACRO(abc).function() // wrap\n"
5487                "    << abc;");
5488   verifyFormat("MACRO(abc)->function() // wrap\n"
5489                "    << abc;");
5490   verifyFormat("MACRO(abc)::function() // wrap\n"
5491                "    << abc;");
5492 }
5493 
5494 TEST_F(FormatTest, BreaksDesireably) {
5495   verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
5496                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
5497                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
5498   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5499                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
5500                "}");
5501 
5502   verifyFormat(
5503       "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5504       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
5505 
5506   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5507                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5508                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
5509 
5510   verifyFormat(
5511       "aaaaaaaa(aaaaaaaaaaaaa,\n"
5512       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5513       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
5514       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5515       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
5516 
5517   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
5518                "    (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5519 
5520   verifyFormat(
5521       "void f() {\n"
5522       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
5523       "                                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5524       "}");
5525   verifyFormat(
5526       "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5527       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
5528   verifyFormat(
5529       "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5530       "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
5531   verifyFormat(
5532       "aaaaaa(aaa,\n"
5533       "       new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5534       "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5535       "       aaaa);");
5536   verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5537                "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5538                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5539 
5540   // Indent consistently independent of call expression and unary operator.
5541   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
5542                "    dddddddddddddddddddddddddddddd));");
5543   verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
5544                "    dddddddddddddddddddddddddddddd));");
5545   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
5546                "    dddddddddddddddddddddddddddddd));");
5547 
5548   // This test case breaks on an incorrect memoization, i.e. an optimization not
5549   // taking into account the StopAt value.
5550   verifyFormat(
5551       "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
5552       "       aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
5553       "       aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
5554       "       (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5555 
5556   verifyFormat("{\n  {\n    {\n"
5557                "      Annotation.SpaceRequiredBefore =\n"
5558                "          Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
5559                "          Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
5560                "    }\n  }\n}");
5561 
5562   // Break on an outer level if there was a break on an inner level.
5563   EXPECT_EQ("f(g(h(a, // comment\n"
5564             "      b, c),\n"
5565             "    d, e),\n"
5566             "  x, y);",
5567             format("f(g(h(a, // comment\n"
5568                    "    b, c), d, e), x, y);"));
5569 
5570   // Prefer breaking similar line breaks.
5571   verifyFormat(
5572       "const int kTrackingOptions = NSTrackingMouseMoved |\n"
5573       "                             NSTrackingMouseEnteredAndExited |\n"
5574       "                             NSTrackingActiveAlways;");
5575 }
5576 
5577 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
5578   FormatStyle NoBinPacking = getGoogleStyle();
5579   NoBinPacking.BinPackParameters = false;
5580   NoBinPacking.BinPackArguments = true;
5581   verifyFormat("void f() {\n"
5582                "  f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
5583                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5584                "}",
5585                NoBinPacking);
5586   verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
5587                "       int aaaaaaaaaaaaaaaaaaaa,\n"
5588                "       int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5589                NoBinPacking);
5590 
5591   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
5592   verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5593                "                        vector<int> bbbbbbbbbbbbbbb);",
5594                NoBinPacking);
5595   // FIXME: This behavior difference is probably not wanted. However, currently
5596   // we cannot distinguish BreakBeforeParameter being set because of the wrapped
5597   // template arguments from BreakBeforeParameter being set because of the
5598   // one-per-line formatting.
5599   verifyFormat(
5600       "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
5601       "                                             aaaaaaaaaa> aaaaaaaaaa);",
5602       NoBinPacking);
5603   verifyFormat(
5604       "void fffffffffff(\n"
5605       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
5606       "        aaaaaaaaaa);");
5607 }
5608 
5609 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
5610   FormatStyle NoBinPacking = getGoogleStyle();
5611   NoBinPacking.BinPackParameters = false;
5612   NoBinPacking.BinPackArguments = false;
5613   verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
5614                "  aaaaaaaaaaaaaaaaaaaa,\n"
5615                "  aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
5616                NoBinPacking);
5617   verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
5618                "        aaaaaaaaaaaaa,\n"
5619                "        aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
5620                NoBinPacking);
5621   verifyFormat(
5622       "aaaaaaaa(aaaaaaaaaaaaa,\n"
5623       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5624       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
5625       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5626       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
5627       NoBinPacking);
5628   verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
5629                "    .aaaaaaaaaaaaaaaaaa();",
5630                NoBinPacking);
5631   verifyFormat("void f() {\n"
5632                "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5633                "      aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
5634                "}",
5635                NoBinPacking);
5636 
5637   verifyFormat(
5638       "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5639       "             aaaaaaaaaaaa,\n"
5640       "             aaaaaaaaaaaa);",
5641       NoBinPacking);
5642   verifyFormat(
5643       "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
5644       "                               ddddddddddddddddddddddddddddd),\n"
5645       "             test);",
5646       NoBinPacking);
5647 
5648   verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
5649                "            aaaaaaaaaaaaaaaaaaaaaaa,\n"
5650                "            aaaaaaaaaaaaaaaaaaaaaaa>\n"
5651                "    aaaaaaaaaaaaaaaaaa;",
5652                NoBinPacking);
5653   verifyFormat("a(\"a\"\n"
5654                "  \"a\",\n"
5655                "  a);");
5656 
5657   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
5658   verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
5659                "                aaaaaaaaa,\n"
5660                "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5661                NoBinPacking);
5662   verifyFormat(
5663       "void f() {\n"
5664       "  aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
5665       "      .aaaaaaa();\n"
5666       "}",
5667       NoBinPacking);
5668   verifyFormat(
5669       "template <class SomeType, class SomeOtherType>\n"
5670       "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
5671       NoBinPacking);
5672 }
5673 
5674 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
5675   FormatStyle Style = getLLVMStyleWithColumns(15);
5676   Style.ExperimentalAutoDetectBinPacking = true;
5677   EXPECT_EQ("aaa(aaaa,\n"
5678             "    aaaa,\n"
5679             "    aaaa);\n"
5680             "aaa(aaaa,\n"
5681             "    aaaa,\n"
5682             "    aaaa);",
5683             format("aaa(aaaa,\n" // one-per-line
5684                    "  aaaa,\n"
5685                    "    aaaa  );\n"
5686                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
5687                    Style));
5688   EXPECT_EQ("aaa(aaaa, aaaa,\n"
5689             "    aaaa);\n"
5690             "aaa(aaaa, aaaa,\n"
5691             "    aaaa);",
5692             format("aaa(aaaa,  aaaa,\n" // bin-packed
5693                    "    aaaa  );\n"
5694                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
5695                    Style));
5696 }
5697 
5698 TEST_F(FormatTest, FormatsBuilderPattern) {
5699   verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
5700                "    .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
5701                "    .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
5702                "    .StartsWith(\".init\", ORDER_INIT)\n"
5703                "    .StartsWith(\".fini\", ORDER_FINI)\n"
5704                "    .StartsWith(\".hash\", ORDER_HASH)\n"
5705                "    .Default(ORDER_TEXT);\n");
5706 
5707   verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
5708                "       aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
5709   verifyFormat("aaaaaaa->aaaaaaa\n"
5710                "    ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5711                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5712                "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
5713   verifyFormat(
5714       "aaaaaaa->aaaaaaa\n"
5715       "    ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5716       "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
5717   verifyFormat(
5718       "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
5719       "    aaaaaaaaaaaaaa);");
5720   verifyFormat(
5721       "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
5722       "    aaaaaa->aaaaaaaaaaaa()\n"
5723       "        ->aaaaaaaaaaaaaaaa(\n"
5724       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5725       "        ->aaaaaaaaaaaaaaaaa();");
5726   verifyGoogleFormat(
5727       "void f() {\n"
5728       "  someo->Add((new util::filetools::Handler(dir))\n"
5729       "                 ->OnEvent1(NewPermanentCallback(\n"
5730       "                     this, &HandlerHolderClass::EventHandlerCBA))\n"
5731       "                 ->OnEvent2(NewPermanentCallback(\n"
5732       "                     this, &HandlerHolderClass::EventHandlerCBB))\n"
5733       "                 ->OnEvent3(NewPermanentCallback(\n"
5734       "                     this, &HandlerHolderClass::EventHandlerCBC))\n"
5735       "                 ->OnEvent5(NewPermanentCallback(\n"
5736       "                     this, &HandlerHolderClass::EventHandlerCBD))\n"
5737       "                 ->OnEvent6(NewPermanentCallback(\n"
5738       "                     this, &HandlerHolderClass::EventHandlerCBE)));\n"
5739       "}");
5740 
5741   verifyFormat(
5742       "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
5743   verifyFormat("aaaaaaaaaaaaaaa()\n"
5744                "    .aaaaaaaaaaaaaaa()\n"
5745                "    .aaaaaaaaaaaaaaa()\n"
5746                "    .aaaaaaaaaaaaaaa()\n"
5747                "    .aaaaaaaaaaaaaaa();");
5748   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
5749                "    .aaaaaaaaaaaaaaa()\n"
5750                "    .aaaaaaaaaaaaaaa()\n"
5751                "    .aaaaaaaaaaaaaaa();");
5752   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
5753                "    .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
5754                "    .aaaaaaaaaaaaaaa();");
5755   verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
5756                "    ->aaaaaaaaaaaaaae(0)\n"
5757                "    ->aaaaaaaaaaaaaaa();");
5758 
5759   // Don't linewrap after very short segments.
5760   verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5761                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5762                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5763   verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5764                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5765                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5766   verifyFormat("aaa()\n"
5767                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5768                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5769                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5770 
5771   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
5772                "    .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5773                "    .has<bbbbbbbbbbbbbbbbbbbbb>();");
5774   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
5775                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
5776                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
5777 
5778   // Prefer not to break after empty parentheses.
5779   verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
5780                "    First->LastNewlineOffset);");
5781 
5782   // Prefer not to create "hanging" indents.
5783   verifyFormat(
5784       "return !soooooooooooooome_map\n"
5785       "            .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5786       "            .second;");
5787   verifyFormat(
5788       "return aaaaaaaaaaaaaaaa\n"
5789       "    .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
5790       "    .aaaa(aaaaaaaaaaaaaa);");
5791   // No hanging indent here.
5792   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
5793                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5794   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
5795                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5796   verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
5797                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5798                getLLVMStyleWithColumns(60));
5799   verifyFormat("aaaaaaaaaaaaaaaaaa\n"
5800                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
5801                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5802                getLLVMStyleWithColumns(59));
5803   verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5804                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5805                "    .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5806 
5807   // Dont break if only closing statements before member call
5808   verifyFormat("test() {\n"
5809                "  ([]() -> {\n"
5810                "    int b = 32;\n"
5811                "    return 3;\n"
5812                "  }).foo();\n"
5813                "}");
5814   verifyFormat("test() {\n"
5815                "  (\n"
5816                "      []() -> {\n"
5817                "        int b = 32;\n"
5818                "        return 3;\n"
5819                "      },\n"
5820                "      foo, bar)\n"
5821                "      .foo();\n"
5822                "}");
5823   verifyFormat("test() {\n"
5824                "  ([]() -> {\n"
5825                "    int b = 32;\n"
5826                "    return 3;\n"
5827                "  })\n"
5828                "      .foo()\n"
5829                "      .bar();\n"
5830                "}");
5831   verifyFormat("test() {\n"
5832                "  ([]() -> {\n"
5833                "    int b = 32;\n"
5834                "    return 3;\n"
5835                "  })\n"
5836                "      .foo(\"aaaaaaaaaaaaaaaaa\"\n"
5837                "           \"bbbb\");\n"
5838                "}",
5839                getLLVMStyleWithColumns(30));
5840 }
5841 
5842 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
5843   verifyFormat(
5844       "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
5845       "    bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
5846   verifyFormat(
5847       "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
5848       "    bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
5849 
5850   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
5851                "    ccccccccccccccccccccccccc) {\n}");
5852   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
5853                "    ccccccccccccccccccccccccc) {\n}");
5854 
5855   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
5856                "    ccccccccccccccccccccccccc) {\n}");
5857   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
5858                "    ccccccccccccccccccccccccc) {\n}");
5859 
5860   verifyFormat(
5861       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
5862       "    ccccccccccccccccccccccccc) {\n}");
5863   verifyFormat(
5864       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
5865       "    ccccccccccccccccccccccccc) {\n}");
5866 
5867   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
5868                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
5869                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
5870                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
5871   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
5872                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
5873                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
5874                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
5875 
5876   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
5877                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
5878                "    aaaaaaaaaaaaaaa != aa) {\n}");
5879   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
5880                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
5881                "    aaaaaaaaaaaaaaa != aa) {\n}");
5882 }
5883 
5884 TEST_F(FormatTest, BreaksAfterAssignments) {
5885   verifyFormat(
5886       "unsigned Cost =\n"
5887       "    TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
5888       "                        SI->getPointerAddressSpaceee());\n");
5889   verifyFormat(
5890       "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
5891       "    Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
5892 
5893   verifyFormat(
5894       "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
5895       "    aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
5896   verifyFormat("unsigned OriginalStartColumn =\n"
5897                "    SourceMgr.getSpellingColumnNumber(\n"
5898                "        Current.FormatTok.getStartOfNonWhitespace()) -\n"
5899                "    1;");
5900 }
5901 
5902 TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
5903   FormatStyle Style = getLLVMStyle();
5904   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5905                "    bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
5906                Style);
5907 
5908   Style.PenaltyBreakAssignment = 20;
5909   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
5910                "                                 cccccccccccccccccccccccccc;",
5911                Style);
5912 }
5913 
5914 TEST_F(FormatTest, AlignsAfterAssignments) {
5915   verifyFormat(
5916       "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5917       "             aaaaaaaaaaaaaaaaaaaaaaaaa;");
5918   verifyFormat(
5919       "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5920       "          aaaaaaaaaaaaaaaaaaaaaaaaa;");
5921   verifyFormat(
5922       "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5923       "           aaaaaaaaaaaaaaaaaaaaaaaaa;");
5924   verifyFormat(
5925       "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5926       "              aaaaaaaaaaaaaaaaaaaaaaaaa);");
5927   verifyFormat(
5928       "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5929       "                                            aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5930       "                                            aaaaaaaaaaaaaaaaaaaaaaaa;");
5931 }
5932 
5933 TEST_F(FormatTest, AlignsAfterReturn) {
5934   verifyFormat(
5935       "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5936       "       aaaaaaaaaaaaaaaaaaaaaaaaa;");
5937   verifyFormat(
5938       "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5939       "        aaaaaaaaaaaaaaaaaaaaaaaaa);");
5940   verifyFormat(
5941       "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
5942       "       aaaaaaaaaaaaaaaaaaaaaa();");
5943   verifyFormat(
5944       "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
5945       "        aaaaaaaaaaaaaaaaaaaaaa());");
5946   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5947                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5948   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5949                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
5950                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5951   verifyFormat("return\n"
5952                "    // true if code is one of a or b.\n"
5953                "    code == a || code == b;");
5954 }
5955 
5956 TEST_F(FormatTest, AlignsAfterOpenBracket) {
5957   verifyFormat(
5958       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5959       "                                                aaaaaaaaa aaaaaaa) {}");
5960   verifyFormat(
5961       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5962       "                                               aaaaaaaaaaa aaaaaaaaa);");
5963   verifyFormat(
5964       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5965       "                                             aaaaaaaaaaaaaaaaaaaaa));");
5966   FormatStyle Style = getLLVMStyle();
5967   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5968   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5969                "    aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
5970                Style);
5971   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5972                "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
5973                Style);
5974   verifyFormat("SomeLongVariableName->someFunction(\n"
5975                "    foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
5976                Style);
5977   verifyFormat(
5978       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5979       "    aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5980       Style);
5981   verifyFormat(
5982       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5983       "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5984       Style);
5985   verifyFormat(
5986       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5987       "    aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
5988       Style);
5989 
5990   verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
5991                "    ccccccc(aaaaaaaaaaaaaaaaa,         //\n"
5992                "        b));",
5993                Style);
5994 
5995   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5996   Style.BinPackArguments = false;
5997   Style.BinPackParameters = false;
5998   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5999                "    aaaaaaaaaaa aaaaaaaa,\n"
6000                "    aaaaaaaaa aaaaaaa,\n"
6001                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
6002                Style);
6003   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
6004                "    aaaaaaaaaaa aaaaaaaaa,\n"
6005                "    aaaaaaaaaaa aaaaaaaaa,\n"
6006                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6007                Style);
6008   verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
6009                "    aaaaaaaaaaaaaaa,\n"
6010                "    aaaaaaaaaaaaaaaaaaaaa,\n"
6011                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
6012                Style);
6013   verifyFormat(
6014       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
6015       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
6016       Style);
6017   verifyFormat(
6018       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
6019       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
6020       Style);
6021   verifyFormat(
6022       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
6023       "    aaaaaaaaaaaaaaaaaaaaa(\n"
6024       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
6025       "    aaaaaaaaaaaaaaaa);",
6026       Style);
6027   verifyFormat(
6028       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
6029       "    aaaaaaaaaaaaaaaaaaaaa(\n"
6030       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
6031       "    aaaaaaaaaaaaaaaa);",
6032       Style);
6033 }
6034 
6035 TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
6036   FormatStyle Style = getLLVMStyleWithColumns(40);
6037   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
6038                "          bbbbbbbbbbbbbbbbbbbbbb);",
6039                Style);
6040   Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
6041   Style.AlignOperands = FormatStyle::OAS_DontAlign;
6042   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
6043                "          bbbbbbbbbbbbbbbbbbbbbb);",
6044                Style);
6045   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
6046   Style.AlignOperands = FormatStyle::OAS_Align;
6047   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
6048                "          bbbbbbbbbbbbbbbbbbbbbb);",
6049                Style);
6050   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
6051   Style.AlignOperands = FormatStyle::OAS_DontAlign;
6052   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
6053                "    bbbbbbbbbbbbbbbbbbbbbb);",
6054                Style);
6055 }
6056 
6057 TEST_F(FormatTest, BreaksConditionalExpressions) {
6058   verifyFormat(
6059       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6060       "                               ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6061       "                               : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6062   verifyFormat(
6063       "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
6064       "     aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6065       "                                : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6066   verifyFormat(
6067       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6068       "                                   : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6069   verifyFormat("aaaa(aaaaaaaaa, aaaaaaaaa,\n"
6070                "     aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6071                "             : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6072   verifyFormat(
6073       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
6074       "                                                    : aaaaaaaaaaaaa);");
6075   verifyFormat(
6076       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6077       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6078       "                                    : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6079       "                   aaaaaaaaaaaaa);");
6080   verifyFormat(
6081       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6082       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6083       "                   aaaaaaaaaaaaa);");
6084   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6085                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6086                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6087                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6088                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6089   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6090                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6091                "           ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6092                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6093                "           : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6094                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
6095                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6096   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6097                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6098                "           ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6099                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
6100                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6101   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6102                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6103                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6104   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
6105                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6106                "        ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6107                "        : aaaaaaaaaaaaaaaa;");
6108   verifyFormat(
6109       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6110       "    ? aaaaaaaaaaaaaaa\n"
6111       "    : aaaaaaaaaaaaaaa;");
6112   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
6113                "          aaaaaaaaa\n"
6114                "      ? b\n"
6115                "      : c);");
6116   verifyFormat("return aaaa == bbbb\n"
6117                "           // comment\n"
6118                "           ? aaaa\n"
6119                "           : bbbb;");
6120   verifyFormat("unsigned Indent =\n"
6121                "    format(TheLine.First,\n"
6122                "           IndentForLevel[TheLine.Level] >= 0\n"
6123                "               ? IndentForLevel[TheLine.Level]\n"
6124                "               : TheLine * 2,\n"
6125                "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
6126                getLLVMStyleWithColumns(60));
6127   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
6128                "                  ? aaaaaaaaaaaaaaa\n"
6129                "                  : bbbbbbbbbbbbbbb //\n"
6130                "                        ? ccccccccccccccc\n"
6131                "                        : ddddddddddddddd;");
6132   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
6133                "                  ? aaaaaaaaaaaaaaa\n"
6134                "                  : (bbbbbbbbbbbbbbb //\n"
6135                "                         ? ccccccccccccccc\n"
6136                "                         : ddddddddddddddd);");
6137   verifyFormat(
6138       "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6139       "                                      ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
6140       "                                            aaaaaaaaaaaaaaaaaaaaa +\n"
6141       "                                            aaaaaaaaaaaaaaaaaaaaa\n"
6142       "                                      : aaaaaaaaaa;");
6143   verifyFormat(
6144       "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6145       "                                   : aaaaaaaaaaaaaaaaaaaaaa\n"
6146       "                      : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6147 
6148   FormatStyle NoBinPacking = getLLVMStyle();
6149   NoBinPacking.BinPackArguments = false;
6150   verifyFormat(
6151       "void f() {\n"
6152       "  g(aaa,\n"
6153       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
6154       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6155       "        ? aaaaaaaaaaaaaaa\n"
6156       "        : aaaaaaaaaaaaaaa);\n"
6157       "}",
6158       NoBinPacking);
6159   verifyFormat(
6160       "void f() {\n"
6161       "  g(aaa,\n"
6162       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
6163       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6164       "        ?: aaaaaaaaaaaaaaa);\n"
6165       "}",
6166       NoBinPacking);
6167 
6168   verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
6169                "             // comment.\n"
6170                "             ccccccccccccccccccccccccccccccccccccccc\n"
6171                "                 ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6172                "                 : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
6173 
6174   // Assignments in conditional expressions. Apparently not uncommon :-(.
6175   verifyFormat("return a != b\n"
6176                "           // comment\n"
6177                "           ? a = b\n"
6178                "           : a = b;");
6179   verifyFormat("return a != b\n"
6180                "           // comment\n"
6181                "           ? a = a != b\n"
6182                "                     // comment\n"
6183                "                     ? a = b\n"
6184                "                     : a\n"
6185                "           : a;\n");
6186   verifyFormat("return a != b\n"
6187                "           // comment\n"
6188                "           ? a\n"
6189                "           : a = a != b\n"
6190                "                     // comment\n"
6191                "                     ? a = b\n"
6192                "                     : a;");
6193 
6194   // Chained conditionals
6195   FormatStyle Style = getLLVMStyle();
6196   Style.ColumnLimit = 70;
6197   Style.AlignOperands = FormatStyle::OAS_Align;
6198   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n"
6199                "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6200                "                        : 3333333333333333;",
6201                Style);
6202   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n"
6203                "       : bbbbbbbbbb     ? 2222222222222222\n"
6204                "                        : 3333333333333333;",
6205                Style);
6206   verifyFormat("return aaaaaaaaaa         ? 1111111111111111\n"
6207                "       : bbbbbbbbbbbbbbbb ? 2222222222222222\n"
6208                "                          : 3333333333333333;",
6209                Style);
6210   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n"
6211                "       : bbbbbbbbbbbbbb ? 222222\n"
6212                "                        : 333333;",
6213                Style);
6214   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n"
6215                "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6216                "       : cccccccccccccc ? 3333333333333333\n"
6217                "                        : 4444444444444444;",
6218                Style);
6219   verifyFormat("return aaaaaaaaaaaaaaaa ? (aaa ? bbb : ccc)\n"
6220                "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6221                "                        : 3333333333333333;",
6222                Style);
6223   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n"
6224                "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6225                "                        : (aaa ? bbb : ccc);",
6226                Style);
6227   verifyFormat(
6228       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6229       "                                             : cccccccccccccccccc)\n"
6230       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6231       "                        : 3333333333333333;",
6232       Style);
6233   verifyFormat(
6234       "return aaaaaaaaa        ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6235       "                                             : cccccccccccccccccc)\n"
6236       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6237       "                        : 3333333333333333;",
6238       Style);
6239   verifyFormat(
6240       "return aaaaaaaaa        ? a = (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6241       "                                             : dddddddddddddddddd)\n"
6242       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6243       "                        : 3333333333333333;",
6244       Style);
6245   verifyFormat(
6246       "return aaaaaaaaa        ? a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6247       "                                             : dddddddddddddddddd)\n"
6248       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6249       "                        : 3333333333333333;",
6250       Style);
6251   verifyFormat(
6252       "return aaaaaaaaa        ? 1111111111111111\n"
6253       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6254       "                        : a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6255       "                                             : dddddddddddddddddd)\n",
6256       Style);
6257   verifyFormat(
6258       "return aaaaaaaaaaaaaaaa ? 1111111111111111\n"
6259       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6260       "                        : (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6261       "                                             : cccccccccccccccccc);",
6262       Style);
6263   verifyFormat(
6264       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6265       "                           : ccccccccccccccc ? dddddddddddddddddd\n"
6266       "                                             : eeeeeeeeeeeeeeeeee)\n"
6267       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6268       "                        : 3333333333333333;",
6269       Style);
6270   verifyFormat(
6271       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaa    ? bbbbbbbbbbbbbbbbbb\n"
6272       "                           : ccccccccccccccc ? dddddddddddddddddd\n"
6273       "                                             : eeeeeeeeeeeeeeeeee)\n"
6274       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6275       "                        : 3333333333333333;",
6276       Style);
6277   verifyFormat(
6278       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6279       "                           : cccccccccccc    ? dddddddddddddddddd\n"
6280       "                                             : eeeeeeeeeeeeeeeeee)\n"
6281       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6282       "                        : 3333333333333333;",
6283       Style);
6284   verifyFormat(
6285       "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6286       "                                             : cccccccccccccccccc\n"
6287       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6288       "                        : 3333333333333333;",
6289       Style);
6290   verifyFormat(
6291       "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6292       "                          : cccccccccccccccc ? dddddddddddddddddd\n"
6293       "                                             : eeeeeeeeeeeeeeeeee\n"
6294       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6295       "                        : 3333333333333333;",
6296       Style);
6297   verifyFormat("return aaaaaaaaaaaaaaaaaaaaa\n"
6298                "           ? (aaaaaaaaaaaaaaaaaa   ? bbbbbbbbbbbbbbbbbb\n"
6299                "              : cccccccccccccccccc ? dddddddddddddddddd\n"
6300                "                                   : eeeeeeeeeeeeeeeeee)\n"
6301                "       : bbbbbbbbbbbbbbbbbbb ? 2222222222222222\n"
6302                "                             : 3333333333333333;",
6303                Style);
6304   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaa\n"
6305                "           ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6306                "             : cccccccccccccccc ? dddddddddddddddddd\n"
6307                "                                : eeeeeeeeeeeeeeeeee\n"
6308                "       : bbbbbbbbbbbbbbbbbbbbbbb ? 2222222222222222\n"
6309                "                                 : 3333333333333333;",
6310                Style);
6311 
6312   Style.AlignOperands = FormatStyle::OAS_DontAlign;
6313   Style.BreakBeforeTernaryOperators = false;
6314   // FIXME: Aligning the question marks is weird given DontAlign.
6315   // Consider disabling this alignment in this case. Also check whether this
6316   // will render the adjustment from https://reviews.llvm.org/D82199
6317   // unnecessary.
6318   verifyFormat("int x = aaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa :\n"
6319                "    bbbb                ? cccccccccccccccccc :\n"
6320                "                          ddddd;\n",
6321                Style);
6322 }
6323 
6324 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
6325   FormatStyle Style = getLLVMStyle();
6326   Style.BreakBeforeTernaryOperators = false;
6327   Style.ColumnLimit = 70;
6328   verifyFormat(
6329       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6330       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6331       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6332       Style);
6333   verifyFormat(
6334       "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
6335       "     aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6336       "                                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6337       Style);
6338   verifyFormat(
6339       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6340       "                                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6341       Style);
6342   verifyFormat("aaaa(aaaaaaaa, aaaaaaaaaa,\n"
6343                "     aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6344                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6345                Style);
6346   verifyFormat(
6347       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
6348       "                                                      aaaaaaaaaaaaa);",
6349       Style);
6350   verifyFormat(
6351       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6352       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6353       "                                      aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6354       "                   aaaaaaaaaaaaa);",
6355       Style);
6356   verifyFormat(
6357       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6358       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6359       "                   aaaaaaaaaaaaa);",
6360       Style);
6361   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6362                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6363                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
6364                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6365                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6366                Style);
6367   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6368                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6369                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6370                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
6371                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6372                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
6373                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6374                Style);
6375   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6376                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
6377                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6378                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
6379                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6380                Style);
6381   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6382                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6383                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
6384                Style);
6385   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
6386                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6387                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6388                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
6389                Style);
6390   verifyFormat(
6391       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6392       "    aaaaaaaaaaaaaaa :\n"
6393       "    aaaaaaaaaaaaaaa;",
6394       Style);
6395   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
6396                "          aaaaaaaaa ?\n"
6397                "      b :\n"
6398                "      c);",
6399                Style);
6400   verifyFormat("unsigned Indent =\n"
6401                "    format(TheLine.First,\n"
6402                "           IndentForLevel[TheLine.Level] >= 0 ?\n"
6403                "               IndentForLevel[TheLine.Level] :\n"
6404                "               TheLine * 2,\n"
6405                "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
6406                Style);
6407   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
6408                "                  aaaaaaaaaaaaaaa :\n"
6409                "                  bbbbbbbbbbbbbbb ? //\n"
6410                "                      ccccccccccccccc :\n"
6411                "                      ddddddddddddddd;",
6412                Style);
6413   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
6414                "                  aaaaaaaaaaaaaaa :\n"
6415                "                  (bbbbbbbbbbbbbbb ? //\n"
6416                "                       ccccccccccccccc :\n"
6417                "                       ddddddddddddddd);",
6418                Style);
6419   verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6420                "            /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
6421                "            ccccccccccccccccccccccccccc;",
6422                Style);
6423   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6424                "           aaaaa :\n"
6425                "           bbbbbbbbbbbbbbb + cccccccccccccccc;",
6426                Style);
6427 
6428   // Chained conditionals
6429   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n"
6430                "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6431                "                          3333333333333333;",
6432                Style);
6433   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n"
6434                "       bbbbbbbbbb       ? 2222222222222222 :\n"
6435                "                          3333333333333333;",
6436                Style);
6437   verifyFormat("return aaaaaaaaaa       ? 1111111111111111 :\n"
6438                "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6439                "                          3333333333333333;",
6440                Style);
6441   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n"
6442                "       bbbbbbbbbbbbbbbb ? 222222 :\n"
6443                "                          333333;",
6444                Style);
6445   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n"
6446                "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6447                "       cccccccccccccccc ? 3333333333333333 :\n"
6448                "                          4444444444444444;",
6449                Style);
6450   verifyFormat("return aaaaaaaaaaaaaaaa ? (aaa ? bbb : ccc) :\n"
6451                "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6452                "                          3333333333333333;",
6453                Style);
6454   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n"
6455                "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6456                "                          (aaa ? bbb : ccc);",
6457                Style);
6458   verifyFormat(
6459       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6460       "                                               cccccccccccccccccc) :\n"
6461       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6462       "                          3333333333333333;",
6463       Style);
6464   verifyFormat(
6465       "return aaaaaaaaa        ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6466       "                                               cccccccccccccccccc) :\n"
6467       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6468       "                          3333333333333333;",
6469       Style);
6470   verifyFormat(
6471       "return aaaaaaaaa        ? a = (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6472       "                                               dddddddddddddddddd) :\n"
6473       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6474       "                          3333333333333333;",
6475       Style);
6476   verifyFormat(
6477       "return aaaaaaaaa        ? a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6478       "                                               dddddddddddddddddd) :\n"
6479       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6480       "                          3333333333333333;",
6481       Style);
6482   verifyFormat(
6483       "return aaaaaaaaa        ? 1111111111111111 :\n"
6484       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6485       "                          a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6486       "                                               dddddddddddddddddd)\n",
6487       Style);
6488   verifyFormat(
6489       "return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n"
6490       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6491       "                          (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6492       "                                               cccccccccccccccccc);",
6493       Style);
6494   verifyFormat(
6495       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6496       "                           ccccccccccccccccc ? dddddddddddddddddd :\n"
6497       "                                               eeeeeeeeeeeeeeeeee) :\n"
6498       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6499       "                          3333333333333333;",
6500       Style);
6501   verifyFormat(
6502       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6503       "                           ccccccccccccc     ? dddddddddddddddddd :\n"
6504       "                                               eeeeeeeeeeeeeeeeee) :\n"
6505       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6506       "                          3333333333333333;",
6507       Style);
6508   verifyFormat(
6509       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaa     ? bbbbbbbbbbbbbbbbbb :\n"
6510       "                           ccccccccccccccccc ? dddddddddddddddddd :\n"
6511       "                                               eeeeeeeeeeeeeeeeee) :\n"
6512       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6513       "                          3333333333333333;",
6514       Style);
6515   verifyFormat(
6516       "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6517       "                                               cccccccccccccccccc :\n"
6518       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6519       "                          3333333333333333;",
6520       Style);
6521   verifyFormat(
6522       "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6523       "                          cccccccccccccccccc ? dddddddddddddddddd :\n"
6524       "                                               eeeeeeeeeeeeeeeeee :\n"
6525       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6526       "                          3333333333333333;",
6527       Style);
6528   verifyFormat("return aaaaaaaaaaaaaaaaaaaaa ?\n"
6529                "           (aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6530                "            cccccccccccccccccc ? dddddddddddddddddd :\n"
6531                "                                 eeeeeeeeeeeeeeeeee) :\n"
6532                "       bbbbbbbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6533                "                               3333333333333333;",
6534                Style);
6535   verifyFormat("return aaaaaaaaaaaaaaaaaaaaa ?\n"
6536                "           aaaaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6537                "           cccccccccccccccccccc ? dddddddddddddddddd :\n"
6538                "                                  eeeeeeeeeeeeeeeeee :\n"
6539                "       bbbbbbbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6540                "                               3333333333333333;",
6541                Style);
6542 }
6543 
6544 TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
6545   verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
6546                "     aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
6547   verifyFormat("bool a = true, b = false;");
6548 
6549   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6550                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
6551                "     bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
6552                "         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
6553   verifyFormat(
6554       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
6555       "         bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
6556       "     d = e && f;");
6557   verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
6558                "          c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
6559   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
6560                "          *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
6561   verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
6562                "          ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
6563 
6564   FormatStyle Style = getGoogleStyle();
6565   Style.PointerAlignment = FormatStyle::PAS_Left;
6566   Style.DerivePointerAlignment = false;
6567   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6568                "    *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
6569                "    *b = bbbbbbbbbbbbbbbbbbb;",
6570                Style);
6571   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
6572                "          *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
6573                Style);
6574   verifyFormat("vector<int*> a, b;", Style);
6575   verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
6576 }
6577 
6578 TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
6579   verifyFormat("arr[foo ? bar : baz];");
6580   verifyFormat("f()[foo ? bar : baz];");
6581   verifyFormat("(a + b)[foo ? bar : baz];");
6582   verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
6583 }
6584 
6585 TEST_F(FormatTest, AlignsStringLiterals) {
6586   verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
6587                "                                      \"short literal\");");
6588   verifyFormat(
6589       "looooooooooooooooooooooooongFunction(\n"
6590       "    \"short literal\"\n"
6591       "    \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
6592   verifyFormat("someFunction(\"Always break between multi-line\"\n"
6593                "             \" string literals\",\n"
6594                "             and, other, parameters);");
6595   EXPECT_EQ("fun + \"1243\" /* comment */\n"
6596             "      \"5678\";",
6597             format("fun + \"1243\" /* comment */\n"
6598                    "    \"5678\";",
6599                    getLLVMStyleWithColumns(28)));
6600   EXPECT_EQ(
6601       "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6602       "         \"aaaaaaaaaaaaaaaaaaaaa\"\n"
6603       "         \"aaaaaaaaaaaaaaaa\";",
6604       format("aaaaaa ="
6605              "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
6606              "aaaaaaaaaaaaaaaaaaaaa\" "
6607              "\"aaaaaaaaaaaaaaaa\";"));
6608   verifyFormat("a = a + \"a\"\n"
6609                "        \"a\"\n"
6610                "        \"a\";");
6611   verifyFormat("f(\"a\", \"b\"\n"
6612                "       \"c\");");
6613 
6614   verifyFormat(
6615       "#define LL_FORMAT \"ll\"\n"
6616       "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
6617       "       \"d, ddddddddd: %\" LL_FORMAT \"d\");");
6618 
6619   verifyFormat("#define A(X)          \\\n"
6620                "  \"aaaaa\" #X \"bbbbbb\" \\\n"
6621                "  \"ccccc\"",
6622                getLLVMStyleWithColumns(23));
6623   verifyFormat("#define A \"def\"\n"
6624                "f(\"abc\" A \"ghi\"\n"
6625                "  \"jkl\");");
6626 
6627   verifyFormat("f(L\"a\"\n"
6628                "  L\"b\");");
6629   verifyFormat("#define A(X)            \\\n"
6630                "  L\"aaaaa\" #X L\"bbbbbb\" \\\n"
6631                "  L\"ccccc\"",
6632                getLLVMStyleWithColumns(25));
6633 
6634   verifyFormat("f(@\"a\"\n"
6635                "  @\"b\");");
6636   verifyFormat("NSString s = @\"a\"\n"
6637                "             @\"b\"\n"
6638                "             @\"c\";");
6639   verifyFormat("NSString s = @\"a\"\n"
6640                "              \"b\"\n"
6641                "              \"c\";");
6642 }
6643 
6644 TEST_F(FormatTest, ReturnTypeBreakingStyle) {
6645   FormatStyle Style = getLLVMStyle();
6646   // No declarations or definitions should be moved to own line.
6647   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
6648   verifyFormat("class A {\n"
6649                "  int f() { return 1; }\n"
6650                "  int g();\n"
6651                "};\n"
6652                "int f() { return 1; }\n"
6653                "int g();\n",
6654                Style);
6655 
6656   // All declarations and definitions should have the return type moved to its
6657   // own
6658   // line.
6659   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
6660   verifyFormat("class E {\n"
6661                "  int\n"
6662                "  f() {\n"
6663                "    return 1;\n"
6664                "  }\n"
6665                "  int\n"
6666                "  g();\n"
6667                "};\n"
6668                "int\n"
6669                "f() {\n"
6670                "  return 1;\n"
6671                "}\n"
6672                "int\n"
6673                "g();\n",
6674                Style);
6675 
6676   // Top-level definitions, and no kinds of declarations should have the
6677   // return type moved to its own line.
6678   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
6679   verifyFormat("class B {\n"
6680                "  int f() { return 1; }\n"
6681                "  int g();\n"
6682                "};\n"
6683                "int\n"
6684                "f() {\n"
6685                "  return 1;\n"
6686                "}\n"
6687                "int g();\n",
6688                Style);
6689 
6690   // Top-level definitions and declarations should have the return type moved
6691   // to its own line.
6692   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
6693   verifyFormat("class C {\n"
6694                "  int f() { return 1; }\n"
6695                "  int g();\n"
6696                "};\n"
6697                "int\n"
6698                "f() {\n"
6699                "  return 1;\n"
6700                "}\n"
6701                "int\n"
6702                "g();\n",
6703                Style);
6704 
6705   // All definitions should have the return type moved to its own line, but no
6706   // kinds of declarations.
6707   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
6708   verifyFormat("class D {\n"
6709                "  int\n"
6710                "  f() {\n"
6711                "    return 1;\n"
6712                "  }\n"
6713                "  int g();\n"
6714                "};\n"
6715                "int\n"
6716                "f() {\n"
6717                "  return 1;\n"
6718                "}\n"
6719                "int g();\n",
6720                Style);
6721   verifyFormat("const char *\n"
6722                "f(void) {\n" // Break here.
6723                "  return \"\";\n"
6724                "}\n"
6725                "const char *bar(void);\n", // No break here.
6726                Style);
6727   verifyFormat("template <class T>\n"
6728                "T *\n"
6729                "f(T &c) {\n" // Break here.
6730                "  return NULL;\n"
6731                "}\n"
6732                "template <class T> T *f(T &c);\n", // No break here.
6733                Style);
6734   verifyFormat("class C {\n"
6735                "  int\n"
6736                "  operator+() {\n"
6737                "    return 1;\n"
6738                "  }\n"
6739                "  int\n"
6740                "  operator()() {\n"
6741                "    return 1;\n"
6742                "  }\n"
6743                "};\n",
6744                Style);
6745   verifyFormat("void\n"
6746                "A::operator()() {}\n"
6747                "void\n"
6748                "A::operator>>() {}\n"
6749                "void\n"
6750                "A::operator+() {}\n"
6751                "void\n"
6752                "A::operator*() {}\n"
6753                "void\n"
6754                "A::operator->() {}\n"
6755                "void\n"
6756                "A::operator void *() {}\n"
6757                "void\n"
6758                "A::operator void &() {}\n"
6759                "void\n"
6760                "A::operator void &&() {}\n"
6761                "void\n"
6762                "A::operator char *() {}\n"
6763                "void\n"
6764                "A::operator[]() {}\n"
6765                "void\n"
6766                "A::operator!() {}\n"
6767                "void\n"
6768                "A::operator**() {}\n"
6769                "void\n"
6770                "A::operator<Foo> *() {}\n"
6771                "void\n"
6772                "A::operator<Foo> **() {}\n"
6773                "void\n"
6774                "A::operator<Foo> &() {}\n"
6775                "void\n"
6776                "A::operator void **() {}\n",
6777                Style);
6778   verifyFormat("constexpr auto\n"
6779                "operator()() const -> reference {}\n"
6780                "constexpr auto\n"
6781                "operator>>() const -> reference {}\n"
6782                "constexpr auto\n"
6783                "operator+() const -> reference {}\n"
6784                "constexpr auto\n"
6785                "operator*() const -> reference {}\n"
6786                "constexpr auto\n"
6787                "operator->() const -> reference {}\n"
6788                "constexpr auto\n"
6789                "operator++() const -> reference {}\n"
6790                "constexpr auto\n"
6791                "operator void *() const -> reference {}\n"
6792                "constexpr auto\n"
6793                "operator void **() const -> reference {}\n"
6794                "constexpr auto\n"
6795                "operator void *() const -> reference {}\n"
6796                "constexpr auto\n"
6797                "operator void &() const -> reference {}\n"
6798                "constexpr auto\n"
6799                "operator void &&() const -> reference {}\n"
6800                "constexpr auto\n"
6801                "operator char *() const -> reference {}\n"
6802                "constexpr auto\n"
6803                "operator!() const -> reference {}\n"
6804                "constexpr auto\n"
6805                "operator[]() const -> reference {}\n",
6806                Style);
6807   verifyFormat("void *operator new(std::size_t s);", // No break here.
6808                Style);
6809   verifyFormat("void *\n"
6810                "operator new(std::size_t s) {}",
6811                Style);
6812   verifyFormat("void *\n"
6813                "operator delete[](void *ptr) {}",
6814                Style);
6815   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
6816   verifyFormat("const char *\n"
6817                "f(void)\n" // Break here.
6818                "{\n"
6819                "  return \"\";\n"
6820                "}\n"
6821                "const char *bar(void);\n", // No break here.
6822                Style);
6823   verifyFormat("template <class T>\n"
6824                "T *\n"     // Problem here: no line break
6825                "f(T &c)\n" // Break here.
6826                "{\n"
6827                "  return NULL;\n"
6828                "}\n"
6829                "template <class T> T *f(T &c);\n", // No break here.
6830                Style);
6831   verifyFormat("int\n"
6832                "foo(A<bool> a)\n"
6833                "{\n"
6834                "  return a;\n"
6835                "}\n",
6836                Style);
6837   verifyFormat("int\n"
6838                "foo(A<8> a)\n"
6839                "{\n"
6840                "  return a;\n"
6841                "}\n",
6842                Style);
6843   verifyFormat("int\n"
6844                "foo(A<B<bool>, 8> a)\n"
6845                "{\n"
6846                "  return a;\n"
6847                "}\n",
6848                Style);
6849   verifyFormat("int\n"
6850                "foo(A<B<8>, bool> a)\n"
6851                "{\n"
6852                "  return a;\n"
6853                "}\n",
6854                Style);
6855   verifyFormat("int\n"
6856                "foo(A<B<bool>, bool> a)\n"
6857                "{\n"
6858                "  return a;\n"
6859                "}\n",
6860                Style);
6861   verifyFormat("int\n"
6862                "foo(A<B<8>, 8> a)\n"
6863                "{\n"
6864                "  return a;\n"
6865                "}\n",
6866                Style);
6867 
6868   Style = getGNUStyle();
6869 
6870   // Test for comments at the end of function declarations.
6871   verifyFormat("void\n"
6872                "foo (int a, /*abc*/ int b) // def\n"
6873                "{\n"
6874                "}\n",
6875                Style);
6876 
6877   verifyFormat("void\n"
6878                "foo (int a, /* abc */ int b) /* def */\n"
6879                "{\n"
6880                "}\n",
6881                Style);
6882 
6883   // Definitions that should not break after return type
6884   verifyFormat("void foo (int a, int b); // def\n", Style);
6885   verifyFormat("void foo (int a, int b); /* def */\n", Style);
6886   verifyFormat("void foo (int a, int b);\n", Style);
6887 }
6888 
6889 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
6890   FormatStyle NoBreak = getLLVMStyle();
6891   NoBreak.AlwaysBreakBeforeMultilineStrings = false;
6892   FormatStyle Break = getLLVMStyle();
6893   Break.AlwaysBreakBeforeMultilineStrings = true;
6894   verifyFormat("aaaa = \"bbbb\"\n"
6895                "       \"cccc\";",
6896                NoBreak);
6897   verifyFormat("aaaa =\n"
6898                "    \"bbbb\"\n"
6899                "    \"cccc\";",
6900                Break);
6901   verifyFormat("aaaa(\"bbbb\"\n"
6902                "     \"cccc\");",
6903                NoBreak);
6904   verifyFormat("aaaa(\n"
6905                "    \"bbbb\"\n"
6906                "    \"cccc\");",
6907                Break);
6908   verifyFormat("aaaa(qqq, \"bbbb\"\n"
6909                "          \"cccc\");",
6910                NoBreak);
6911   verifyFormat("aaaa(qqq,\n"
6912                "     \"bbbb\"\n"
6913                "     \"cccc\");",
6914                Break);
6915   verifyFormat("aaaa(qqq,\n"
6916                "     L\"bbbb\"\n"
6917                "     L\"cccc\");",
6918                Break);
6919   verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
6920                "                      \"bbbb\"));",
6921                Break);
6922   verifyFormat("string s = someFunction(\n"
6923                "    \"abc\"\n"
6924                "    \"abc\");",
6925                Break);
6926 
6927   // As we break before unary operators, breaking right after them is bad.
6928   verifyFormat("string foo = abc ? \"x\"\n"
6929                "                   \"blah blah blah blah blah blah\"\n"
6930                "                 : \"y\";",
6931                Break);
6932 
6933   // Don't break if there is no column gain.
6934   verifyFormat("f(\"aaaa\"\n"
6935                "  \"bbbb\");",
6936                Break);
6937 
6938   // Treat literals with escaped newlines like multi-line string literals.
6939   EXPECT_EQ("x = \"a\\\n"
6940             "b\\\n"
6941             "c\";",
6942             format("x = \"a\\\n"
6943                    "b\\\n"
6944                    "c\";",
6945                    NoBreak));
6946   EXPECT_EQ("xxxx =\n"
6947             "    \"a\\\n"
6948             "b\\\n"
6949             "c\";",
6950             format("xxxx = \"a\\\n"
6951                    "b\\\n"
6952                    "c\";",
6953                    Break));
6954 
6955   EXPECT_EQ("NSString *const kString =\n"
6956             "    @\"aaaa\"\n"
6957             "    @\"bbbb\";",
6958             format("NSString *const kString = @\"aaaa\"\n"
6959                    "@\"bbbb\";",
6960                    Break));
6961 
6962   Break.ColumnLimit = 0;
6963   verifyFormat("const char *hello = \"hello llvm\";", Break);
6964 }
6965 
6966 TEST_F(FormatTest, AlignsPipes) {
6967   verifyFormat(
6968       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6969       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6970       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6971   verifyFormat(
6972       "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
6973       "                     << aaaaaaaaaaaaaaaaaaaa;");
6974   verifyFormat(
6975       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6976       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6977   verifyFormat(
6978       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
6979       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6980   verifyFormat(
6981       "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
6982       "                \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
6983       "             << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
6984   verifyFormat(
6985       "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6986       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6987       "         << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6988   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6989                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6990                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6991                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
6992   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
6993                "             << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
6994   verifyFormat(
6995       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6996       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6997   verifyFormat(
6998       "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
6999       "                                       aaaaaaaaaaaaaaaaaaaaaaaaaa);");
7000 
7001   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
7002                "             << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
7003   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7004                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7005                "                    aaaaaaaaaaaaaaaaaaaaa)\n"
7006                "             << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
7007   verifyFormat("LOG_IF(aaa == //\n"
7008                "       bbb)\n"
7009                "    << a << b;");
7010 
7011   // But sometimes, breaking before the first "<<" is desirable.
7012   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
7013                "    << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
7014   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
7015                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7016                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7017   verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
7018                "    << BEF << IsTemplate << Description << E->getType();");
7019   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
7020                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7021                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7022   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
7023                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7024                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
7025                "    << aaa;");
7026 
7027   verifyFormat(
7028       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7029       "                    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
7030 
7031   // Incomplete string literal.
7032   EXPECT_EQ("llvm::errs() << \"\n"
7033             "             << a;",
7034             format("llvm::errs() << \"\n<<a;"));
7035 
7036   verifyFormat("void f() {\n"
7037                "  CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
7038                "      << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
7039                "}");
7040 
7041   // Handle 'endl'.
7042   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
7043                "             << bbbbbbbbbbbbbbbbbbbbbb << endl;");
7044   verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
7045 
7046   // Handle '\n'.
7047   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
7048                "             << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
7049   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
7050                "             << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
7051   verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
7052                "             << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
7053   verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
7054 }
7055 
7056 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
7057   verifyFormat("return out << \"somepacket = {\\n\"\n"
7058                "           << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
7059                "           << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
7060                "           << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
7061                "           << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
7062                "           << \"}\";");
7063 
7064   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
7065                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
7066                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
7067   verifyFormat(
7068       "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
7069       "             << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
7070       "             << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
7071       "             << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
7072       "             << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
7073   verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
7074                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
7075   verifyFormat(
7076       "void f() {\n"
7077       "  llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
7078       "               << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
7079       "}");
7080 
7081   // Breaking before the first "<<" is generally not desirable.
7082   verifyFormat(
7083       "llvm::errs()\n"
7084       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7085       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7086       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7087       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
7088       getLLVMStyleWithColumns(70));
7089   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
7090                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7091                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
7092                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7093                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
7094                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
7095                getLLVMStyleWithColumns(70));
7096 
7097   verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
7098                "           \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
7099                "           \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
7100   verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
7101                "                  \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
7102                "                  \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
7103   verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
7104                "           (aaaa + aaaa);",
7105                getLLVMStyleWithColumns(40));
7106   verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
7107                "                  (aaaaaaa + aaaaa));",
7108                getLLVMStyleWithColumns(40));
7109   verifyFormat(
7110       "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
7111       "                  SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
7112       "                  bbbbbbbbbbbbbbbbbbbbbbb);");
7113 }
7114 
7115 TEST_F(FormatTest, UnderstandsEquals) {
7116   verifyFormat(
7117       "aaaaaaaaaaaaaaaaa =\n"
7118       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7119   verifyFormat(
7120       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7121       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
7122   verifyFormat(
7123       "if (a) {\n"
7124       "  f();\n"
7125       "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7126       "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
7127       "}");
7128 
7129   verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7130                "        100000000 + 10000000) {\n}");
7131 }
7132 
7133 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
7134   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
7135                "    .looooooooooooooooooooooooooooooooooooooongFunction();");
7136 
7137   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
7138                "    ->looooooooooooooooooooooooooooooooooooooongFunction();");
7139 
7140   verifyFormat(
7141       "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
7142       "                                                          Parameter2);");
7143 
7144   verifyFormat(
7145       "ShortObject->shortFunction(\n"
7146       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
7147       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
7148 
7149   verifyFormat("loooooooooooooongFunction(\n"
7150                "    LoooooooooooooongObject->looooooooooooooooongFunction());");
7151 
7152   verifyFormat(
7153       "function(LoooooooooooooooooooooooooooooooooooongObject\n"
7154       "             ->loooooooooooooooooooooooooooooooooooooooongFunction());");
7155 
7156   verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
7157                "    .WillRepeatedly(Return(SomeValue));");
7158   verifyFormat("void f() {\n"
7159                "  EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
7160                "      .Times(2)\n"
7161                "      .WillRepeatedly(Return(SomeValue));\n"
7162                "}");
7163   verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
7164                "    ccccccccccccccccccccccc);");
7165   verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7166                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
7167                "          .aaaaa(aaaaa),\n"
7168                "      aaaaaaaaaaaaaaaaaaaaa);");
7169   verifyFormat("void f() {\n"
7170                "  aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7171                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
7172                "}");
7173   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7174                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
7175                "    .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7176                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7177                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
7178   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7179                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7180                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7181                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
7182                "}");
7183 
7184   // Here, it is not necessary to wrap at "." or "->".
7185   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
7186                "    aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
7187   verifyFormat(
7188       "aaaaaaaaaaa->aaaaaaaaa(\n"
7189       "    aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7190       "    aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
7191 
7192   verifyFormat(
7193       "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7194       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
7195   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
7196                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
7197   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
7198                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
7199 
7200   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7201                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
7202                "    .a();");
7203 
7204   FormatStyle NoBinPacking = getLLVMStyle();
7205   NoBinPacking.BinPackParameters = false;
7206   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
7207                "    .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
7208                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
7209                "                         aaaaaaaaaaaaaaaaaaa,\n"
7210                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
7211                NoBinPacking);
7212 
7213   // If there is a subsequent call, change to hanging indentation.
7214   verifyFormat(
7215       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7216       "                         aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
7217       "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
7218   verifyFormat(
7219       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7220       "    aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
7221   verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7222                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
7223                "                 .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
7224   verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7225                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
7226                "               .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
7227 }
7228 
7229 TEST_F(FormatTest, WrapsTemplateDeclarations) {
7230   verifyFormat("template <typename T>\n"
7231                "virtual void loooooooooooongFunction(int Param1, int Param2);");
7232   verifyFormat("template <typename T>\n"
7233                "// T should be one of {A, B}.\n"
7234                "virtual void loooooooooooongFunction(int Param1, int Param2);");
7235   verifyFormat(
7236       "template <typename T>\n"
7237       "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
7238   verifyFormat("template <typename T>\n"
7239                "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
7240                "       int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
7241   verifyFormat(
7242       "template <typename T>\n"
7243       "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
7244       "                                      int Paaaaaaaaaaaaaaaaaaaaram2);");
7245   verifyFormat(
7246       "template <typename T>\n"
7247       "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
7248       "                    aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
7249       "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7250   verifyFormat("template <typename T>\n"
7251                "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7252                "    int aaaaaaaaaaaaaaaaaaaaaa);");
7253   verifyFormat(
7254       "template <typename T1, typename T2 = char, typename T3 = char,\n"
7255       "          typename T4 = char>\n"
7256       "void f();");
7257   verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
7258                "          template <typename> class cccccccccccccccccccccc,\n"
7259                "          typename ddddddddddddd>\n"
7260                "class C {};");
7261   verifyFormat(
7262       "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
7263       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7264 
7265   verifyFormat("void f() {\n"
7266                "  a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
7267                "      a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
7268                "}");
7269 
7270   verifyFormat("template <typename T> class C {};");
7271   verifyFormat("template <typename T> void f();");
7272   verifyFormat("template <typename T> void f() {}");
7273   verifyFormat(
7274       "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
7275       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7276       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
7277       "    new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
7278       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7279       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
7280       "        bbbbbbbbbbbbbbbbbbbbbbbb);",
7281       getLLVMStyleWithColumns(72));
7282   EXPECT_EQ("static_cast<A< //\n"
7283             "    B> *>(\n"
7284             "\n"
7285             ");",
7286             format("static_cast<A<//\n"
7287                    "    B>*>(\n"
7288                    "\n"
7289                    "    );"));
7290   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7291                "    const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
7292 
7293   FormatStyle AlwaysBreak = getLLVMStyle();
7294   AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
7295   verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
7296   verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
7297   verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
7298   verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7299                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
7300                "    ccccccccccccccccccccccccccccccccccccccccccccccc);");
7301   verifyFormat("template <template <typename> class Fooooooo,\n"
7302                "          template <typename> class Baaaaaaar>\n"
7303                "struct C {};",
7304                AlwaysBreak);
7305   verifyFormat("template <typename T> // T can be A, B or C.\n"
7306                "struct C {};",
7307                AlwaysBreak);
7308   verifyFormat("template <enum E> class A {\n"
7309                "public:\n"
7310                "  E *f();\n"
7311                "};");
7312 
7313   FormatStyle NeverBreak = getLLVMStyle();
7314   NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No;
7315   verifyFormat("template <typename T> class C {};", NeverBreak);
7316   verifyFormat("template <typename T> void f();", NeverBreak);
7317   verifyFormat("template <typename T> void f() {}", NeverBreak);
7318   verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa "
7319                "bbbbbbbbbbbbbbbbbbbb) {}",
7320                NeverBreak);
7321   verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7322                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
7323                "    ccccccccccccccccccccccccccccccccccccccccccccccc);",
7324                NeverBreak);
7325   verifyFormat("template <template <typename> class Fooooooo,\n"
7326                "          template <typename> class Baaaaaaar>\n"
7327                "struct C {};",
7328                NeverBreak);
7329   verifyFormat("template <typename T> // T can be A, B or C.\n"
7330                "struct C {};",
7331                NeverBreak);
7332   verifyFormat("template <enum E> class A {\n"
7333                "public:\n"
7334                "  E *f();\n"
7335                "};",
7336                NeverBreak);
7337   NeverBreak.PenaltyBreakTemplateDeclaration = 100;
7338   verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa "
7339                "bbbbbbbbbbbbbbbbbbbb) {}",
7340                NeverBreak);
7341 }
7342 
7343 TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) {
7344   FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
7345   Style.ColumnLimit = 60;
7346   EXPECT_EQ("// Baseline - no comments.\n"
7347             "template <\n"
7348             "    typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
7349             "void f() {}",
7350             format("// Baseline - no comments.\n"
7351                    "template <\n"
7352                    "    typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
7353                    "void f() {}",
7354                    Style));
7355 
7356   EXPECT_EQ("template <\n"
7357             "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  // trailing\n"
7358             "void f() {}",
7359             format("template <\n"
7360                    "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
7361                    "void f() {}",
7362                    Style));
7363 
7364   EXPECT_EQ(
7365       "template <\n"
7366       "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n"
7367       "void f() {}",
7368       format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  /* line */\n"
7369              "void f() {}",
7370              Style));
7371 
7372   EXPECT_EQ(
7373       "template <\n"
7374       "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  // trailing\n"
7375       "                                               // multiline\n"
7376       "void f() {}",
7377       format("template <\n"
7378              "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
7379              "                                              // multiline\n"
7380              "void f() {}",
7381              Style));
7382 
7383   EXPECT_EQ(
7384       "template <typename aaaaaaaaaa<\n"
7385       "    bbbbbbbbbbbb>::value>  // trailing loooong\n"
7386       "void f() {}",
7387       format(
7388           "template <\n"
7389           "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n"
7390           "void f() {}",
7391           Style));
7392 }
7393 
7394 TEST_F(FormatTest, WrapsTemplateParameters) {
7395   FormatStyle Style = getLLVMStyle();
7396   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
7397   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
7398   verifyFormat(
7399       "template <typename... a> struct q {};\n"
7400       "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
7401       "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
7402       "    y;",
7403       Style);
7404   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
7405   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
7406   verifyFormat(
7407       "template <typename... a> struct r {};\n"
7408       "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
7409       "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
7410       "    y;",
7411       Style);
7412   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
7413   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
7414   verifyFormat("template <typename... a> struct s {};\n"
7415                "extern s<\n"
7416                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
7417                "aaaaaaaaaaaaaaaaaaaaaa,\n"
7418                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
7419                "aaaaaaaaaaaaaaaaaaaaaa>\n"
7420                "    y;",
7421                Style);
7422   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
7423   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
7424   verifyFormat("template <typename... a> struct t {};\n"
7425                "extern t<\n"
7426                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
7427                "aaaaaaaaaaaaaaaaaaaaaa,\n"
7428                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
7429                "aaaaaaaaaaaaaaaaaaaaaa>\n"
7430                "    y;",
7431                Style);
7432 }
7433 
7434 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
7435   verifyFormat(
7436       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
7437       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
7438   verifyFormat(
7439       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
7440       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7441       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
7442 
7443   // FIXME: Should we have the extra indent after the second break?
7444   verifyFormat(
7445       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
7446       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
7447       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
7448 
7449   verifyFormat(
7450       "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
7451       "                    cccccccccccccccccccccccccccccccccccccccccccccc());");
7452 
7453   // Breaking at nested name specifiers is generally not desirable.
7454   verifyFormat(
7455       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7456       "    aaaaaaaaaaaaaaaaaaaaaaa);");
7457 
7458   verifyFormat("aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
7459                "                   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
7460                "                       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7461                "                   aaaaaaaaaaaaaaaaaaaaa);",
7462                getLLVMStyleWithColumns(74));
7463 
7464   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
7465                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7466                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
7467 }
7468 
7469 TEST_F(FormatTest, UnderstandsTemplateParameters) {
7470   verifyFormat("A<int> a;");
7471   verifyFormat("A<A<A<int>>> a;");
7472   verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
7473   verifyFormat("bool x = a < 1 || 2 > a;");
7474   verifyFormat("bool x = 5 < f<int>();");
7475   verifyFormat("bool x = f<int>() > 5;");
7476   verifyFormat("bool x = 5 < a<int>::x;");
7477   verifyFormat("bool x = a < 4 ? a > 2 : false;");
7478   verifyFormat("bool x = f() ? a < 2 : a > 2;");
7479 
7480   verifyGoogleFormat("A<A<int>> a;");
7481   verifyGoogleFormat("A<A<A<int>>> a;");
7482   verifyGoogleFormat("A<A<A<A<int>>>> a;");
7483   verifyGoogleFormat("A<A<int> > a;");
7484   verifyGoogleFormat("A<A<A<int> > > a;");
7485   verifyGoogleFormat("A<A<A<A<int> > > > a;");
7486   verifyGoogleFormat("A<::A<int>> a;");
7487   verifyGoogleFormat("A<::A> a;");
7488   verifyGoogleFormat("A< ::A> a;");
7489   verifyGoogleFormat("A< ::A<int> > a;");
7490   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
7491   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
7492   EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
7493   EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
7494   EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
7495             format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
7496 
7497   verifyFormat("A<A<int>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
7498 
7499   // template closer followed by a token that starts with > or =
7500   verifyFormat("bool b = a<1> > 1;");
7501   verifyFormat("bool b = a<1> >= 1;");
7502   verifyFormat("int i = a<1> >> 1;");
7503   FormatStyle Style = getLLVMStyle();
7504   Style.SpaceBeforeAssignmentOperators = false;
7505   verifyFormat("bool b= a<1> == 1;", Style);
7506   verifyFormat("a<int> = 1;", Style);
7507   verifyFormat("a<int> >>= 1;", Style);
7508 
7509   verifyFormat("test >> a >> b;");
7510   verifyFormat("test << a >> b;");
7511 
7512   verifyFormat("f<int>();");
7513   verifyFormat("template <typename T> void f() {}");
7514   verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
7515   verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
7516                "sizeof(char)>::type>;");
7517   verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
7518   verifyFormat("f(a.operator()<A>());");
7519   verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7520                "      .template operator()<A>());",
7521                getLLVMStyleWithColumns(35));
7522 
7523   // Not template parameters.
7524   verifyFormat("return a < b && c > d;");
7525   verifyFormat("void f() {\n"
7526                "  while (a < b && c > d) {\n"
7527                "  }\n"
7528                "}");
7529   verifyFormat("template <typename... Types>\n"
7530                "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
7531 
7532   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7533                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
7534                getLLVMStyleWithColumns(60));
7535   verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
7536   verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
7537   verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
7538 }
7539 
7540 TEST_F(FormatTest, BitshiftOperatorWidth) {
7541   EXPECT_EQ("int a = 1 << 2; /* foo\n"
7542             "                   bar */",
7543             format("int    a=1<<2;  /* foo\n"
7544                    "                   bar */"));
7545 
7546   EXPECT_EQ("int b = 256 >> 1; /* foo\n"
7547             "                     bar */",
7548             format("int  b  =256>>1 ;  /* foo\n"
7549                    "                      bar */"));
7550 }
7551 
7552 TEST_F(FormatTest, UnderstandsBinaryOperators) {
7553   verifyFormat("COMPARE(a, ==, b);");
7554   verifyFormat("auto s = sizeof...(Ts) - 1;");
7555 }
7556 
7557 TEST_F(FormatTest, UnderstandsPointersToMembers) {
7558   verifyFormat("int A::*x;");
7559   verifyFormat("int (S::*func)(void *);");
7560   verifyFormat("void f() { int (S::*func)(void *); }");
7561   verifyFormat("typedef bool *(Class::*Member)() const;");
7562   verifyFormat("void f() {\n"
7563                "  (a->*f)();\n"
7564                "  a->*x;\n"
7565                "  (a.*f)();\n"
7566                "  ((*a).*f)();\n"
7567                "  a.*x;\n"
7568                "}");
7569   verifyFormat("void f() {\n"
7570                "  (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
7571                "      aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
7572                "}");
7573   verifyFormat(
7574       "(aaaaaaaaaa->*bbbbbbb)(\n"
7575       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
7576   FormatStyle Style = getLLVMStyle();
7577   Style.PointerAlignment = FormatStyle::PAS_Left;
7578   verifyFormat("typedef bool* (Class::*Member)() const;", Style);
7579 }
7580 
7581 TEST_F(FormatTest, UnderstandsUnaryOperators) {
7582   verifyFormat("int a = -2;");
7583   verifyFormat("f(-1, -2, -3);");
7584   verifyFormat("a[-1] = 5;");
7585   verifyFormat("int a = 5 + -2;");
7586   verifyFormat("if (i == -1) {\n}");
7587   verifyFormat("if (i != -1) {\n}");
7588   verifyFormat("if (i > -1) {\n}");
7589   verifyFormat("if (i < -1) {\n}");
7590   verifyFormat("++(a->f());");
7591   verifyFormat("--(a->f());");
7592   verifyFormat("(a->f())++;");
7593   verifyFormat("a[42]++;");
7594   verifyFormat("if (!(a->f())) {\n}");
7595   verifyFormat("if (!+i) {\n}");
7596   verifyFormat("~&a;");
7597 
7598   verifyFormat("a-- > b;");
7599   verifyFormat("b ? -a : c;");
7600   verifyFormat("n * sizeof char16;");
7601   verifyFormat("n * alignof char16;", getGoogleStyle());
7602   verifyFormat("sizeof(char);");
7603   verifyFormat("alignof(char);", getGoogleStyle());
7604 
7605   verifyFormat("return -1;");
7606   verifyFormat("throw -1;");
7607   verifyFormat("switch (a) {\n"
7608                "case -1:\n"
7609                "  break;\n"
7610                "}");
7611   verifyFormat("#define X -1");
7612   verifyFormat("#define X -kConstant");
7613 
7614   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
7615   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
7616 
7617   verifyFormat("int a = /* confusing comment */ -1;");
7618   // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
7619   verifyFormat("int a = i /* confusing comment */++;");
7620 
7621   verifyFormat("co_yield -1;");
7622   verifyFormat("co_return -1;");
7623 }
7624 
7625 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
7626   verifyFormat("if (!aaaaaaaaaa( // break\n"
7627                "        aaaaa)) {\n"
7628                "}");
7629   verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
7630                "    aaaaa));");
7631   verifyFormat("*aaa = aaaaaaa( // break\n"
7632                "    bbbbbb);");
7633 }
7634 
7635 TEST_F(FormatTest, UnderstandsOverloadedOperators) {
7636   verifyFormat("bool operator<();");
7637   verifyFormat("bool operator>();");
7638   verifyFormat("bool operator=();");
7639   verifyFormat("bool operator==();");
7640   verifyFormat("bool operator!=();");
7641   verifyFormat("int operator+();");
7642   verifyFormat("int operator++();");
7643   verifyFormat("int operator++(int) volatile noexcept;");
7644   verifyFormat("bool operator,();");
7645   verifyFormat("bool operator();");
7646   verifyFormat("bool operator()();");
7647   verifyFormat("bool operator[]();");
7648   verifyFormat("operator bool();");
7649   verifyFormat("operator int();");
7650   verifyFormat("operator void *();");
7651   verifyFormat("operator SomeType<int>();");
7652   verifyFormat("operator SomeType<int, int>();");
7653   verifyFormat("operator SomeType<SomeType<int>>();");
7654   verifyFormat("void *operator new(std::size_t size);");
7655   verifyFormat("void *operator new[](std::size_t size);");
7656   verifyFormat("void operator delete(void *ptr);");
7657   verifyFormat("void operator delete[](void *ptr);");
7658   verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
7659                "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
7660   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
7661                "    aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
7662 
7663   verifyFormat(
7664       "ostream &operator<<(ostream &OutputStream,\n"
7665       "                    SomeReallyLongType WithSomeReallyLongValue);");
7666   verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
7667                "               const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
7668                "  return left.group < right.group;\n"
7669                "}");
7670   verifyFormat("SomeType &operator=(const SomeType &S);");
7671   verifyFormat("f.template operator()<int>();");
7672 
7673   verifyGoogleFormat("operator void*();");
7674   verifyGoogleFormat("operator SomeType<SomeType<int>>();");
7675   verifyGoogleFormat("operator ::A();");
7676 
7677   verifyFormat("using A::operator+;");
7678   verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
7679                "int i;");
7680 }
7681 
7682 TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
7683   verifyFormat("Deleted &operator=(const Deleted &) & = default;");
7684   verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
7685   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
7686   verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
7687   verifyFormat("Deleted &operator=(const Deleted &) &;");
7688   verifyFormat("Deleted &operator=(const Deleted &) &&;");
7689   verifyFormat("SomeType MemberFunction(const Deleted &) &;");
7690   verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
7691   verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
7692   verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
7693   verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
7694   verifyFormat("void Fn(T const &) const &;");
7695   verifyFormat("void Fn(T const volatile &&) const volatile &&;");
7696   verifyFormat("template <typename T>\n"
7697                "void F(T) && = delete;",
7698                getGoogleStyle());
7699 
7700   FormatStyle AlignLeft = getLLVMStyle();
7701   AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
7702   verifyFormat("void A::b() && {}", AlignLeft);
7703   verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
7704   verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
7705                AlignLeft);
7706   verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
7707   verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
7708   verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
7709   verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
7710   verifyFormat("auto Function(T) & -> void {}", AlignLeft);
7711   verifyFormat("auto Function(T) & -> void;", AlignLeft);
7712   verifyFormat("void Fn(T const&) const&;", AlignLeft);
7713   verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
7714 
7715   FormatStyle Spaces = getLLVMStyle();
7716   Spaces.SpacesInCStyleCastParentheses = true;
7717   verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
7718   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
7719   verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
7720   verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
7721 
7722   Spaces.SpacesInCStyleCastParentheses = false;
7723   Spaces.SpacesInParentheses = true;
7724   verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
7725   verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;",
7726                Spaces);
7727   verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
7728   verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
7729 
7730   FormatStyle BreakTemplate = getLLVMStyle();
7731   BreakTemplate.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
7732 
7733   verifyFormat("struct f {\n"
7734                "  template <class T>\n"
7735                "  int &foo(const std::string &str) &noexcept {}\n"
7736                "};",
7737                BreakTemplate);
7738 
7739   verifyFormat("struct f {\n"
7740                "  template <class T>\n"
7741                "  int &foo(const std::string &str) &&noexcept {}\n"
7742                "};",
7743                BreakTemplate);
7744 
7745   verifyFormat("struct f {\n"
7746                "  template <class T>\n"
7747                "  int &foo(const std::string &str) const &noexcept {}\n"
7748                "};",
7749                BreakTemplate);
7750 
7751   verifyFormat("struct f {\n"
7752                "  template <class T>\n"
7753                "  int &foo(const std::string &str) const &noexcept {}\n"
7754                "};",
7755                BreakTemplate);
7756 
7757   verifyFormat("struct f {\n"
7758                "  template <class T>\n"
7759                "  auto foo(const std::string &str) &&noexcept -> int & {}\n"
7760                "};",
7761                BreakTemplate);
7762 
7763   FormatStyle AlignLeftBreakTemplate = getLLVMStyle();
7764   AlignLeftBreakTemplate.AlwaysBreakTemplateDeclarations =
7765       FormatStyle::BTDS_Yes;
7766   AlignLeftBreakTemplate.PointerAlignment = FormatStyle::PAS_Left;
7767 
7768   verifyFormat("struct f {\n"
7769                "  template <class T>\n"
7770                "  int& foo(const std::string& str) & noexcept {}\n"
7771                "};",
7772                AlignLeftBreakTemplate);
7773 
7774   verifyFormat("struct f {\n"
7775                "  template <class T>\n"
7776                "  int& foo(const std::string& str) && noexcept {}\n"
7777                "};",
7778                AlignLeftBreakTemplate);
7779 
7780   verifyFormat("struct f {\n"
7781                "  template <class T>\n"
7782                "  int& foo(const std::string& str) const& noexcept {}\n"
7783                "};",
7784                AlignLeftBreakTemplate);
7785 
7786   verifyFormat("struct f {\n"
7787                "  template <class T>\n"
7788                "  int& foo(const std::string& str) const&& noexcept {}\n"
7789                "};",
7790                AlignLeftBreakTemplate);
7791 
7792   verifyFormat("struct f {\n"
7793                "  template <class T>\n"
7794                "  auto foo(const std::string& str) && noexcept -> int& {}\n"
7795                "};",
7796                AlignLeftBreakTemplate);
7797 
7798   // The `&` in `Type&` should not be confused with a trailing `&` of
7799   // DEPRECATED(reason) member function.
7800   verifyFormat("struct f {\n"
7801                "  template <class T>\n"
7802                "  DEPRECATED(reason)\n"
7803                "  Type &foo(arguments) {}\n"
7804                "};",
7805                BreakTemplate);
7806 
7807   verifyFormat("struct f {\n"
7808                "  template <class T>\n"
7809                "  DEPRECATED(reason)\n"
7810                "  Type& foo(arguments) {}\n"
7811                "};",
7812                AlignLeftBreakTemplate);
7813 
7814   verifyFormat("void (*foopt)(int) = &func;");
7815 }
7816 
7817 TEST_F(FormatTest, UnderstandsNewAndDelete) {
7818   verifyFormat("void f() {\n"
7819                "  A *a = new A;\n"
7820                "  A *a = new (placement) A;\n"
7821                "  delete a;\n"
7822                "  delete (A *)a;\n"
7823                "}");
7824   verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
7825                "    typename aaaaaaaaaaaaaaaaaaaaaaaa();");
7826   verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7827                "    new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
7828                "        typename aaaaaaaaaaaaaaaaaaaaaaaa();");
7829   verifyFormat("delete[] h->p;");
7830 }
7831 
7832 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
7833   verifyFormat("int *f(int *a) {}");
7834   verifyFormat("int main(int argc, char **argv) {}");
7835   verifyFormat("Test::Test(int b) : a(b * b) {}");
7836   verifyIndependentOfContext("f(a, *a);");
7837   verifyFormat("void g() { f(*a); }");
7838   verifyIndependentOfContext("int a = b * 10;");
7839   verifyIndependentOfContext("int a = 10 * b;");
7840   verifyIndependentOfContext("int a = b * c;");
7841   verifyIndependentOfContext("int a += b * c;");
7842   verifyIndependentOfContext("int a -= b * c;");
7843   verifyIndependentOfContext("int a *= b * c;");
7844   verifyIndependentOfContext("int a /= b * c;");
7845   verifyIndependentOfContext("int a = *b;");
7846   verifyIndependentOfContext("int a = *b * c;");
7847   verifyIndependentOfContext("int a = b * *c;");
7848   verifyIndependentOfContext("int a = b * (10);");
7849   verifyIndependentOfContext("S << b * (10);");
7850   verifyIndependentOfContext("return 10 * b;");
7851   verifyIndependentOfContext("return *b * *c;");
7852   verifyIndependentOfContext("return a & ~b;");
7853   verifyIndependentOfContext("f(b ? *c : *d);");
7854   verifyIndependentOfContext("int a = b ? *c : *d;");
7855   verifyIndependentOfContext("*b = a;");
7856   verifyIndependentOfContext("a * ~b;");
7857   verifyIndependentOfContext("a * !b;");
7858   verifyIndependentOfContext("a * +b;");
7859   verifyIndependentOfContext("a * -b;");
7860   verifyIndependentOfContext("a * ++b;");
7861   verifyIndependentOfContext("a * --b;");
7862   verifyIndependentOfContext("a[4] * b;");
7863   verifyIndependentOfContext("a[a * a] = 1;");
7864   verifyIndependentOfContext("f() * b;");
7865   verifyIndependentOfContext("a * [self dostuff];");
7866   verifyIndependentOfContext("int x = a * (a + b);");
7867   verifyIndependentOfContext("(a *)(a + b);");
7868   verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
7869   verifyIndependentOfContext("int *pa = (int *)&a;");
7870   verifyIndependentOfContext("return sizeof(int **);");
7871   verifyIndependentOfContext("return sizeof(int ******);");
7872   verifyIndependentOfContext("return (int **&)a;");
7873   verifyIndependentOfContext("f((*PointerToArray)[10]);");
7874   verifyFormat("void f(Type (*parameter)[10]) {}");
7875   verifyFormat("void f(Type (&parameter)[10]) {}");
7876   verifyGoogleFormat("return sizeof(int**);");
7877   verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
7878   verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
7879   verifyFormat("auto a = [](int **&, int ***) {};");
7880   verifyFormat("auto PointerBinding = [](const char *S) {};");
7881   verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
7882   verifyFormat("[](const decltype(*a) &value) {}");
7883   verifyFormat("decltype(a * b) F();");
7884   verifyFormat("#define MACRO() [](A *a) { return 1; }");
7885   verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
7886   verifyIndependentOfContext("typedef void (*f)(int *a);");
7887   verifyIndependentOfContext("int i{a * b};");
7888   verifyIndependentOfContext("aaa && aaa->f();");
7889   verifyIndependentOfContext("int x = ~*p;");
7890   verifyFormat("Constructor() : a(a), area(width * height) {}");
7891   verifyFormat("Constructor() : a(a), area(a, width * height) {}");
7892   verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
7893   verifyFormat("void f() { f(a, c * d); }");
7894   verifyFormat("void f() { f(new a(), c * d); }");
7895   verifyFormat("void f(const MyOverride &override);");
7896   verifyFormat("void f(const MyFinal &final);");
7897   verifyIndependentOfContext("bool a = f() && override.f();");
7898   verifyIndependentOfContext("bool a = f() && final.f();");
7899 
7900   verifyIndependentOfContext("InvalidRegions[*R] = 0;");
7901 
7902   verifyIndependentOfContext("A<int *> a;");
7903   verifyIndependentOfContext("A<int **> a;");
7904   verifyIndependentOfContext("A<int *, int *> a;");
7905   verifyIndependentOfContext("A<int *[]> a;");
7906   verifyIndependentOfContext(
7907       "const char *const p = reinterpret_cast<const char *const>(q);");
7908   verifyIndependentOfContext("A<int **, int **> a;");
7909   verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
7910   verifyFormat("for (char **a = b; *a; ++a) {\n}");
7911   verifyFormat("for (; a && b;) {\n}");
7912   verifyFormat("bool foo = true && [] { return false; }();");
7913 
7914   verifyFormat(
7915       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7916       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7917 
7918   verifyGoogleFormat("int const* a = &b;");
7919   verifyGoogleFormat("**outparam = 1;");
7920   verifyGoogleFormat("*outparam = a * b;");
7921   verifyGoogleFormat("int main(int argc, char** argv) {}");
7922   verifyGoogleFormat("A<int*> a;");
7923   verifyGoogleFormat("A<int**> a;");
7924   verifyGoogleFormat("A<int*, int*> a;");
7925   verifyGoogleFormat("A<int**, int**> a;");
7926   verifyGoogleFormat("f(b ? *c : *d);");
7927   verifyGoogleFormat("int a = b ? *c : *d;");
7928   verifyGoogleFormat("Type* t = **x;");
7929   verifyGoogleFormat("Type* t = *++*x;");
7930   verifyGoogleFormat("*++*x;");
7931   verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
7932   verifyGoogleFormat("Type* t = x++ * y;");
7933   verifyGoogleFormat(
7934       "const char* const p = reinterpret_cast<const char* const>(q);");
7935   verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
7936   verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
7937   verifyGoogleFormat("template <typename T>\n"
7938                      "void f(int i = 0, SomeType** temps = NULL);");
7939 
7940   FormatStyle Left = getLLVMStyle();
7941   Left.PointerAlignment = FormatStyle::PAS_Left;
7942   verifyFormat("x = *a(x) = *a(y);", Left);
7943   verifyFormat("for (;; *a = b) {\n}", Left);
7944   verifyFormat("return *this += 1;", Left);
7945   verifyFormat("throw *x;", Left);
7946   verifyFormat("delete *x;", Left);
7947   verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
7948   verifyFormat("[](const decltype(*a)* ptr) {}", Left);
7949   verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
7950   verifyFormat("auto x(A&&, B&&, C&&) -> D;", Left);
7951   verifyFormat("auto x = [](A&&, B&&, C&&) -> D {};", Left);
7952   verifyFormat("template <class T> X(T&&, T&&, T&&) -> X<T>;", Left);
7953 
7954   verifyIndependentOfContext("a = *(x + y);");
7955   verifyIndependentOfContext("a = &(x + y);");
7956   verifyIndependentOfContext("*(x + y).call();");
7957   verifyIndependentOfContext("&(x + y)->call();");
7958   verifyFormat("void f() { &(*I).first; }");
7959 
7960   verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
7961   verifyFormat(
7962       "int *MyValues = {\n"
7963       "    *A, // Operator detection might be confused by the '{'\n"
7964       "    *BB // Operator detection might be confused by previous comment\n"
7965       "};");
7966 
7967   verifyIndependentOfContext("if (int *a = &b)");
7968   verifyIndependentOfContext("if (int &a = *b)");
7969   verifyIndependentOfContext("if (a & b[i])");
7970   verifyIndependentOfContext("if constexpr (a & b[i])");
7971   verifyIndependentOfContext("if CONSTEXPR (a & b[i])");
7972   verifyIndependentOfContext("if (a * (b * c))");
7973   verifyIndependentOfContext("if constexpr (a * (b * c))");
7974   verifyIndependentOfContext("if CONSTEXPR (a * (b * c))");
7975   verifyIndependentOfContext("if (a::b::c::d & b[i])");
7976   verifyIndependentOfContext("if (*b[i])");
7977   verifyIndependentOfContext("if (int *a = (&b))");
7978   verifyIndependentOfContext("while (int *a = &b)");
7979   verifyIndependentOfContext("while (a * (b * c))");
7980   verifyIndependentOfContext("size = sizeof *a;");
7981   verifyIndependentOfContext("if (a && (b = c))");
7982   verifyFormat("void f() {\n"
7983                "  for (const int &v : Values) {\n"
7984                "  }\n"
7985                "}");
7986   verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
7987   verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
7988   verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
7989 
7990   verifyFormat("#define A (!a * b)");
7991   verifyFormat("#define MACRO     \\\n"
7992                "  int *i = a * b; \\\n"
7993                "  void f(a *b);",
7994                getLLVMStyleWithColumns(19));
7995 
7996   verifyIndependentOfContext("A = new SomeType *[Length];");
7997   verifyIndependentOfContext("A = new SomeType *[Length]();");
7998   verifyIndependentOfContext("T **t = new T *;");
7999   verifyIndependentOfContext("T **t = new T *();");
8000   verifyGoogleFormat("A = new SomeType*[Length]();");
8001   verifyGoogleFormat("A = new SomeType*[Length];");
8002   verifyGoogleFormat("T** t = new T*;");
8003   verifyGoogleFormat("T** t = new T*();");
8004 
8005   verifyFormat("STATIC_ASSERT((a & b) == 0);");
8006   verifyFormat("STATIC_ASSERT(0 == (a & b));");
8007   verifyFormat("template <bool a, bool b> "
8008                "typename t::if<x && y>::type f() {}");
8009   verifyFormat("template <int *y> f() {}");
8010   verifyFormat("vector<int *> v;");
8011   verifyFormat("vector<int *const> v;");
8012   verifyFormat("vector<int *const **const *> v;");
8013   verifyFormat("vector<int *volatile> v;");
8014   verifyFormat("vector<a * b> v;");
8015   verifyFormat("foo<b && false>();");
8016   verifyFormat("foo<b & 1>();");
8017   verifyFormat("decltype(*::std::declval<const T &>()) void F();");
8018   verifyFormat(
8019       "template <class T, class = typename std::enable_if<\n"
8020       "                       std::is_integral<T>::value &&\n"
8021       "                       (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
8022       "void F();",
8023       getLLVMStyleWithColumns(70));
8024   verifyFormat("template <class T,\n"
8025                "          class = typename std::enable_if<\n"
8026                "              std::is_integral<T>::value &&\n"
8027                "              (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
8028                "          class U>\n"
8029                "void F();",
8030                getLLVMStyleWithColumns(70));
8031   verifyFormat(
8032       "template <class T,\n"
8033       "          class = typename ::std::enable_if<\n"
8034       "              ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
8035       "void F();",
8036       getGoogleStyleWithColumns(68));
8037 
8038   verifyIndependentOfContext("MACRO(int *i);");
8039   verifyIndependentOfContext("MACRO(auto *a);");
8040   verifyIndependentOfContext("MACRO(const A *a);");
8041   verifyIndependentOfContext("MACRO(A *const a);");
8042   verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
8043   verifyFormat("void f() { f(float{1}, a * a); }");
8044   // FIXME: Is there a way to make this work?
8045   // verifyIndependentOfContext("MACRO(A *a);");
8046 
8047   verifyFormat("DatumHandle const *operator->() const { return input_; }");
8048   verifyFormat("return options != nullptr && operator==(*options);");
8049 
8050   EXPECT_EQ("#define OP(x)                                    \\\n"
8051             "  ostream &operator<<(ostream &s, const A &a) {  \\\n"
8052             "    return s << a.DebugString();                 \\\n"
8053             "  }",
8054             format("#define OP(x) \\\n"
8055                    "  ostream &operator<<(ostream &s, const A &a) { \\\n"
8056                    "    return s << a.DebugString(); \\\n"
8057                    "  }",
8058                    getLLVMStyleWithColumns(50)));
8059 
8060   // FIXME: We cannot handle this case yet; we might be able to figure out that
8061   // foo<x> d > v; doesn't make sense.
8062   verifyFormat("foo<a<b && c> d> v;");
8063 
8064   FormatStyle PointerMiddle = getLLVMStyle();
8065   PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
8066   verifyFormat("delete *x;", PointerMiddle);
8067   verifyFormat("int * x;", PointerMiddle);
8068   verifyFormat("int *[] x;", PointerMiddle);
8069   verifyFormat("template <int * y> f() {}", PointerMiddle);
8070   verifyFormat("int * f(int * a) {}", PointerMiddle);
8071   verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
8072   verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
8073   verifyFormat("A<int *> a;", PointerMiddle);
8074   verifyFormat("A<int **> a;", PointerMiddle);
8075   verifyFormat("A<int *, int *> a;", PointerMiddle);
8076   verifyFormat("A<int *[]> a;", PointerMiddle);
8077   verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
8078   verifyFormat("A = new SomeType *[Length];", PointerMiddle);
8079   verifyFormat("T ** t = new T *;", PointerMiddle);
8080 
8081   // Member function reference qualifiers aren't binary operators.
8082   verifyFormat("string // break\n"
8083                "operator()() & {}");
8084   verifyFormat("string // break\n"
8085                "operator()() && {}");
8086   verifyGoogleFormat("template <typename T>\n"
8087                      "auto x() & -> int {}");
8088 }
8089 
8090 TEST_F(FormatTest, UnderstandsAttributes) {
8091   verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
8092   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
8093                "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
8094   FormatStyle AfterType = getLLVMStyle();
8095   AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
8096   verifyFormat("__attribute__((nodebug)) void\n"
8097                "foo() {}\n",
8098                AfterType);
8099 }
8100 
8101 TEST_F(FormatTest, UnderstandsSquareAttributes) {
8102   verifyFormat("SomeType s [[unused]] (InitValue);");
8103   verifyFormat("SomeType s [[gnu::unused]] (InitValue);");
8104   verifyFormat("SomeType s [[using gnu: unused]] (InitValue);");
8105   verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}");
8106   verifyFormat("void f() [[deprecated(\"so sorry\")]];");
8107   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8108                "    [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);");
8109   verifyFormat("[[nodiscard]] bool f() { return false; }");
8110   verifyFormat("class [[nodiscard]] f {\npublic:\n  f() {}\n}");
8111   verifyFormat("class [[deprecated(\"so sorry\")]] f {\npublic:\n  f() {}\n}");
8112   verifyFormat("class [[gnu::unused]] f {\npublic:\n  f() {}\n}");
8113 
8114   // Make sure we do not mistake attributes for array subscripts.
8115   verifyFormat("int a() {}\n"
8116                "[[unused]] int b() {}\n");
8117   verifyFormat("NSArray *arr;\n"
8118                "arr[[Foo() bar]];");
8119 
8120   // On the other hand, we still need to correctly find array subscripts.
8121   verifyFormat("int a = std::vector<int>{1, 2, 3}[0];");
8122 
8123   // Make sure that we do not mistake Objective-C method inside array literals
8124   // as attributes, even if those method names are also keywords.
8125   verifyFormat("@[ [foo bar] ];");
8126   verifyFormat("@[ [NSArray class] ];");
8127   verifyFormat("@[ [foo enum] ];");
8128 
8129   verifyFormat("template <typename T> [[nodiscard]] int a() { return 1; }");
8130 
8131   // Make sure we do not parse attributes as lambda introducers.
8132   FormatStyle MultiLineFunctions = getLLVMStyle();
8133   MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
8134   verifyFormat("[[unused]] int b() {\n"
8135                "  return 42;\n"
8136                "}\n",
8137                MultiLineFunctions);
8138 }
8139 
8140 TEST_F(FormatTest, AttributeClass) {
8141   FormatStyle Style = getChromiumStyle(FormatStyle::LK_Cpp);
8142   verifyFormat("class S {\n"
8143                "  S(S&&) = default;\n"
8144                "};",
8145                Style);
8146   verifyFormat("class [[nodiscard]] S {\n"
8147                "  S(S&&) = default;\n"
8148                "};",
8149                Style);
8150   verifyFormat("class __attribute((maybeunused)) S {\n"
8151                "  S(S&&) = default;\n"
8152                "};",
8153                Style);
8154   verifyFormat("struct S {\n"
8155                "  S(S&&) = default;\n"
8156                "};",
8157                Style);
8158   verifyFormat("struct [[nodiscard]] S {\n"
8159                "  S(S&&) = default;\n"
8160                "};",
8161                Style);
8162 }
8163 
8164 TEST_F(FormatTest, AttributesAfterMacro) {
8165   FormatStyle Style = getLLVMStyle();
8166   verifyFormat("MACRO;\n"
8167                "__attribute__((maybe_unused)) int foo() {\n"
8168                "  //...\n"
8169                "}");
8170 
8171   verifyFormat("MACRO;\n"
8172                "[[nodiscard]] int foo() {\n"
8173                "  //...\n"
8174                "}");
8175 
8176   EXPECT_EQ("MACRO\n\n"
8177             "__attribute__((maybe_unused)) int foo() {\n"
8178             "  //...\n"
8179             "}",
8180             format("MACRO\n\n"
8181                    "__attribute__((maybe_unused)) int foo() {\n"
8182                    "  //...\n"
8183                    "}"));
8184 
8185   EXPECT_EQ("MACRO\n\n"
8186             "[[nodiscard]] int foo() {\n"
8187             "  //...\n"
8188             "}",
8189             format("MACRO\n\n"
8190                    "[[nodiscard]] int foo() {\n"
8191                    "  //...\n"
8192                    "}"));
8193 }
8194 
8195 TEST_F(FormatTest, AttributePenaltyBreaking) {
8196   FormatStyle Style = getLLVMStyle();
8197   verifyFormat("void ABCDEFGH::ABCDEFGHIJKLMN(\n"
8198                "    [[maybe_unused]] const shared_ptr<ALongTypeName> &C d) {}",
8199                Style);
8200   verifyFormat("void ABCDEFGH::ABCDEFGHIJK(\n"
8201                "    [[maybe_unused]] const shared_ptr<ALongTypeName> &C d) {}",
8202                Style);
8203   verifyFormat("void ABCDEFGH::ABCDEFGH([[maybe_unused]] const "
8204                "shared_ptr<ALongTypeName> &C d) {\n}",
8205                Style);
8206 }
8207 
8208 TEST_F(FormatTest, UnderstandsEllipsis) {
8209   FormatStyle Style = getLLVMStyle();
8210   verifyFormat("int printf(const char *fmt, ...);");
8211   verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
8212   verifyFormat("template <class... Ts> void Foo(Ts *...ts) {}");
8213 
8214   verifyFormat("template <int *...PP> a;", Style);
8215 
8216   Style.PointerAlignment = FormatStyle::PAS_Left;
8217   verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", Style);
8218 
8219   verifyFormat("template <int*... PP> a;", Style);
8220 
8221   Style.PointerAlignment = FormatStyle::PAS_Middle;
8222   verifyFormat("template <int *... PP> a;", Style);
8223 }
8224 
8225 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
8226   EXPECT_EQ("int *a;\n"
8227             "int *a;\n"
8228             "int *a;",
8229             format("int *a;\n"
8230                    "int* a;\n"
8231                    "int *a;",
8232                    getGoogleStyle()));
8233   EXPECT_EQ("int* a;\n"
8234             "int* a;\n"
8235             "int* a;",
8236             format("int* a;\n"
8237                    "int* a;\n"
8238                    "int *a;",
8239                    getGoogleStyle()));
8240   EXPECT_EQ("int *a;\n"
8241             "int *a;\n"
8242             "int *a;",
8243             format("int *a;\n"
8244                    "int * a;\n"
8245                    "int *  a;",
8246                    getGoogleStyle()));
8247   EXPECT_EQ("auto x = [] {\n"
8248             "  int *a;\n"
8249             "  int *a;\n"
8250             "  int *a;\n"
8251             "};",
8252             format("auto x=[]{int *a;\n"
8253                    "int * a;\n"
8254                    "int *  a;};",
8255                    getGoogleStyle()));
8256 }
8257 
8258 TEST_F(FormatTest, UnderstandsRvalueReferences) {
8259   verifyFormat("int f(int &&a) {}");
8260   verifyFormat("int f(int a, char &&b) {}");
8261   verifyFormat("void f() { int &&a = b; }");
8262   verifyGoogleFormat("int f(int a, char&& b) {}");
8263   verifyGoogleFormat("void f() { int&& a = b; }");
8264 
8265   verifyIndependentOfContext("A<int &&> a;");
8266   verifyIndependentOfContext("A<int &&, int &&> a;");
8267   verifyGoogleFormat("A<int&&> a;");
8268   verifyGoogleFormat("A<int&&, int&&> a;");
8269 
8270   // Not rvalue references:
8271   verifyFormat("template <bool B, bool C> class A {\n"
8272                "  static_assert(B && C, \"Something is wrong\");\n"
8273                "};");
8274   verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
8275   verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
8276   verifyFormat("#define A(a, b) (a && b)");
8277 }
8278 
8279 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
8280   verifyFormat("void f() {\n"
8281                "  x[aaaaaaaaa -\n"
8282                "    b] = 23;\n"
8283                "}",
8284                getLLVMStyleWithColumns(15));
8285 }
8286 
8287 TEST_F(FormatTest, FormatsCasts) {
8288   verifyFormat("Type *A = static_cast<Type *>(P);");
8289   verifyFormat("Type *A = (Type *)P;");
8290   verifyFormat("Type *A = (vector<Type *, int *>)P;");
8291   verifyFormat("int a = (int)(2.0f);");
8292   verifyFormat("int a = (int)2.0f;");
8293   verifyFormat("x[(int32)y];");
8294   verifyFormat("x = (int32)y;");
8295   verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
8296   verifyFormat("int a = (int)*b;");
8297   verifyFormat("int a = (int)2.0f;");
8298   verifyFormat("int a = (int)~0;");
8299   verifyFormat("int a = (int)++a;");
8300   verifyFormat("int a = (int)sizeof(int);");
8301   verifyFormat("int a = (int)+2;");
8302   verifyFormat("my_int a = (my_int)2.0f;");
8303   verifyFormat("my_int a = (my_int)sizeof(int);");
8304   verifyFormat("return (my_int)aaa;");
8305   verifyFormat("#define x ((int)-1)");
8306   verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
8307   verifyFormat("#define p(q) ((int *)&q)");
8308   verifyFormat("fn(a)(b) + 1;");
8309 
8310   verifyFormat("void f() { my_int a = (my_int)*b; }");
8311   verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
8312   verifyFormat("my_int a = (my_int)~0;");
8313   verifyFormat("my_int a = (my_int)++a;");
8314   verifyFormat("my_int a = (my_int)-2;");
8315   verifyFormat("my_int a = (my_int)1;");
8316   verifyFormat("my_int a = (my_int *)1;");
8317   verifyFormat("my_int a = (const my_int)-1;");
8318   verifyFormat("my_int a = (const my_int *)-1;");
8319   verifyFormat("my_int a = (my_int)(my_int)-1;");
8320   verifyFormat("my_int a = (ns::my_int)-2;");
8321   verifyFormat("case (my_int)ONE:");
8322   verifyFormat("auto x = (X)this;");
8323   // Casts in Obj-C style calls used to not be recognized as such.
8324   verifyFormat("int a = [(type*)[((type*)val) arg] arg];", getGoogleStyle());
8325 
8326   // FIXME: single value wrapped with paren will be treated as cast.
8327   verifyFormat("void f(int i = (kValue)*kMask) {}");
8328 
8329   verifyFormat("{ (void)F; }");
8330 
8331   // Don't break after a cast's
8332   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
8333                "    (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
8334                "                                   bbbbbbbbbbbbbbbbbbbbbb);");
8335 
8336   // These are not casts.
8337   verifyFormat("void f(int *) {}");
8338   verifyFormat("f(foo)->b;");
8339   verifyFormat("f(foo).b;");
8340   verifyFormat("f(foo)(b);");
8341   verifyFormat("f(foo)[b];");
8342   verifyFormat("[](foo) { return 4; }(bar);");
8343   verifyFormat("(*funptr)(foo)[4];");
8344   verifyFormat("funptrs[4](foo)[4];");
8345   verifyFormat("void f(int *);");
8346   verifyFormat("void f(int *) = 0;");
8347   verifyFormat("void f(SmallVector<int>) {}");
8348   verifyFormat("void f(SmallVector<int>);");
8349   verifyFormat("void f(SmallVector<int>) = 0;");
8350   verifyFormat("void f(int i = (kA * kB) & kMask) {}");
8351   verifyFormat("int a = sizeof(int) * b;");
8352   verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
8353   verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
8354   verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
8355   verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
8356 
8357   // These are not casts, but at some point were confused with casts.
8358   verifyFormat("virtual void foo(int *) override;");
8359   verifyFormat("virtual void foo(char &) const;");
8360   verifyFormat("virtual void foo(int *a, char *) const;");
8361   verifyFormat("int a = sizeof(int *) + b;");
8362   verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
8363   verifyFormat("bool b = f(g<int>) && c;");
8364   verifyFormat("typedef void (*f)(int i) func;");
8365   verifyFormat("void operator++(int) noexcept;");
8366   verifyFormat("void operator++(int &) noexcept;");
8367   verifyFormat("void operator delete(void *, std::size_t, const std::nothrow_t "
8368                "&) noexcept;");
8369   verifyFormat(
8370       "void operator delete(std::size_t, const std::nothrow_t &) noexcept;");
8371   verifyFormat("void operator delete(const std::nothrow_t &) noexcept;");
8372   verifyFormat("void operator delete(std::nothrow_t &) noexcept;");
8373   verifyFormat("void operator delete(nothrow_t &) noexcept;");
8374   verifyFormat("void operator delete(foo &) noexcept;");
8375   verifyFormat("void operator delete(foo) noexcept;");
8376   verifyFormat("void operator delete(int) noexcept;");
8377   verifyFormat("void operator delete(int &) noexcept;");
8378   verifyFormat("void operator delete(int &) volatile noexcept;");
8379   verifyFormat("void operator delete(int &) const");
8380   verifyFormat("void operator delete(int &) = default");
8381   verifyFormat("void operator delete(int &) = delete");
8382   verifyFormat("void operator delete(int &) [[noreturn]]");
8383   verifyFormat("void operator delete(int &) throw();");
8384   verifyFormat("void operator delete(int &) throw(int);");
8385   verifyFormat("auto operator delete(int &) -> int;");
8386   verifyFormat("auto operator delete(int &) override");
8387   verifyFormat("auto operator delete(int &) final");
8388 
8389   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
8390                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
8391   // FIXME: The indentation here is not ideal.
8392   verifyFormat(
8393       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8394       "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
8395       "        [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
8396 }
8397 
8398 TEST_F(FormatTest, FormatsFunctionTypes) {
8399   verifyFormat("A<bool()> a;");
8400   verifyFormat("A<SomeType()> a;");
8401   verifyFormat("A<void (*)(int, std::string)> a;");
8402   verifyFormat("A<void *(int)>;");
8403   verifyFormat("void *(*a)(int *, SomeType *);");
8404   verifyFormat("int (*func)(void *);");
8405   verifyFormat("void f() { int (*func)(void *); }");
8406   verifyFormat("template <class CallbackClass>\n"
8407                "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
8408 
8409   verifyGoogleFormat("A<void*(int*, SomeType*)>;");
8410   verifyGoogleFormat("void* (*a)(int);");
8411   verifyGoogleFormat(
8412       "template <class CallbackClass>\n"
8413       "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
8414 
8415   // Other constructs can look somewhat like function types:
8416   verifyFormat("A<sizeof(*x)> a;");
8417   verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
8418   verifyFormat("some_var = function(*some_pointer_var)[0];");
8419   verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
8420   verifyFormat("int x = f(&h)();");
8421   verifyFormat("returnsFunction(&param1, &param2)(param);");
8422   verifyFormat("std::function<\n"
8423                "    LooooooooooongTemplatedType<\n"
8424                "        SomeType>*(\n"
8425                "        LooooooooooooooooongType type)>\n"
8426                "    function;",
8427                getGoogleStyleWithColumns(40));
8428 }
8429 
8430 TEST_F(FormatTest, FormatsPointersToArrayTypes) {
8431   verifyFormat("A (*foo_)[6];");
8432   verifyFormat("vector<int> (*foo_)[6];");
8433 }
8434 
8435 TEST_F(FormatTest, BreaksLongVariableDeclarations) {
8436   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
8437                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
8438   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
8439                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
8440   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
8441                "    *LoooooooooooooooooooooooooooooooooooooooongVariable;");
8442 
8443   // Different ways of ()-initializiation.
8444   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
8445                "    LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
8446   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
8447                "    LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
8448   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
8449                "    LoooooooooooooooooooooooooooooooooooooooongVariable({});");
8450   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
8451                "    LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
8452 
8453   // Lambdas should not confuse the variable declaration heuristic.
8454   verifyFormat("LooooooooooooooooongType\n"
8455                "    variable(nullptr, [](A *a) {});",
8456                getLLVMStyleWithColumns(40));
8457 }
8458 
8459 TEST_F(FormatTest, BreaksLongDeclarations) {
8460   verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
8461                "    AnotherNameForTheLongType;");
8462   verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
8463                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
8464   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
8465                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
8466   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
8467                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
8468   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
8469                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
8470   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
8471                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
8472   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
8473                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
8474   verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
8475                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
8476   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
8477                "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
8478   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
8479                "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
8480   FormatStyle Indented = getLLVMStyle();
8481   Indented.IndentWrappedFunctionNames = true;
8482   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
8483                "    LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
8484                Indented);
8485   verifyFormat(
8486       "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
8487       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
8488       Indented);
8489   verifyFormat(
8490       "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
8491       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
8492       Indented);
8493   verifyFormat(
8494       "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
8495       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
8496       Indented);
8497 
8498   // FIXME: Without the comment, this breaks after "(".
8499   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType  // break\n"
8500                "    (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
8501                getGoogleStyle());
8502 
8503   verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
8504                "                  int LoooooooooooooooooooongParam2) {}");
8505   verifyFormat(
8506       "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
8507       "                                   SourceLocation L, IdentifierIn *II,\n"
8508       "                                   Type *T) {}");
8509   verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
8510                "ReallyReaaallyLongFunctionName(\n"
8511                "    const std::string &SomeParameter,\n"
8512                "    const SomeType<string, SomeOtherTemplateParameter>\n"
8513                "        &ReallyReallyLongParameterName,\n"
8514                "    const SomeType<string, SomeOtherTemplateParameter>\n"
8515                "        &AnotherLongParameterName) {}");
8516   verifyFormat("template <typename A>\n"
8517                "SomeLoooooooooooooooooooooongType<\n"
8518                "    typename some_namespace::SomeOtherType<A>::Type>\n"
8519                "Function() {}");
8520 
8521   verifyGoogleFormat(
8522       "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
8523       "    aaaaaaaaaaaaaaaaaaaaaaa;");
8524   verifyGoogleFormat(
8525       "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
8526       "                                   SourceLocation L) {}");
8527   verifyGoogleFormat(
8528       "some_namespace::LongReturnType\n"
8529       "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
8530       "    int first_long_parameter, int second_parameter) {}");
8531 
8532   verifyGoogleFormat("template <typename T>\n"
8533                      "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
8534                      "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
8535   verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8536                      "                   int aaaaaaaaaaaaaaaaaaaaaaa);");
8537 
8538   verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
8539                "    const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8540                "        *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
8541   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
8542                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
8543                "        aaaaaaaaaaaaaaaaaaaaaaaa);");
8544   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
8545                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
8546                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
8547                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
8548 
8549   verifyFormat("template <typename T> // Templates on own line.\n"
8550                "static int            // Some comment.\n"
8551                "MyFunction(int a);",
8552                getLLVMStyle());
8553 }
8554 
8555 TEST_F(FormatTest, FormatsArrays) {
8556   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
8557                "                         [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
8558   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
8559                "                         [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
8560   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
8561                "    aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
8562   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8563                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
8564   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8565                "    [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
8566   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8567                "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
8568                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
8569   verifyFormat(
8570       "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
8571       "             << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
8572       "                                  [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
8573   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
8574                "    .aaaaaaaaaaaaaaaaaaaaaa();");
8575 
8576   verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
8577                      "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
8578   verifyFormat(
8579       "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
8580       "                                  .aaaaaaa[0]\n"
8581       "                                  .aaaaaaaaaaaaaaaaaaaaaa();");
8582   verifyFormat("a[::b::c];");
8583 
8584   verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
8585 
8586   FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
8587   verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
8588 }
8589 
8590 TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
8591   verifyFormat("(a)->b();");
8592   verifyFormat("--a;");
8593 }
8594 
8595 TEST_F(FormatTest, HandlesIncludeDirectives) {
8596   verifyFormat("#include <string>\n"
8597                "#include <a/b/c.h>\n"
8598                "#include \"a/b/string\"\n"
8599                "#include \"string.h\"\n"
8600                "#include \"string.h\"\n"
8601                "#include <a-a>\n"
8602                "#include < path with space >\n"
8603                "#include_next <test.h>"
8604                "#include \"abc.h\" // this is included for ABC\n"
8605                "#include \"some long include\" // with a comment\n"
8606                "#include \"some very long include path\"\n"
8607                "#include <some/very/long/include/path>\n",
8608                getLLVMStyleWithColumns(35));
8609   EXPECT_EQ("#include \"a.h\"", format("#include  \"a.h\""));
8610   EXPECT_EQ("#include <a>", format("#include<a>"));
8611 
8612   verifyFormat("#import <string>");
8613   verifyFormat("#import <a/b/c.h>");
8614   verifyFormat("#import \"a/b/string\"");
8615   verifyFormat("#import \"string.h\"");
8616   verifyFormat("#import \"string.h\"");
8617   verifyFormat("#if __has_include(<strstream>)\n"
8618                "#include <strstream>\n"
8619                "#endif");
8620 
8621   verifyFormat("#define MY_IMPORT <a/b>");
8622 
8623   verifyFormat("#if __has_include(<a/b>)");
8624   verifyFormat("#if __has_include_next(<a/b>)");
8625   verifyFormat("#define F __has_include(<a/b>)");
8626   verifyFormat("#define F __has_include_next(<a/b>)");
8627 
8628   // Protocol buffer definition or missing "#".
8629   verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
8630                getLLVMStyleWithColumns(30));
8631 
8632   FormatStyle Style = getLLVMStyle();
8633   Style.AlwaysBreakBeforeMultilineStrings = true;
8634   Style.ColumnLimit = 0;
8635   verifyFormat("#import \"abc.h\"", Style);
8636 
8637   // But 'import' might also be a regular C++ namespace.
8638   verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8639                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
8640 }
8641 
8642 //===----------------------------------------------------------------------===//
8643 // Error recovery tests.
8644 //===----------------------------------------------------------------------===//
8645 
8646 TEST_F(FormatTest, IncompleteParameterLists) {
8647   FormatStyle NoBinPacking = getLLVMStyle();
8648   NoBinPacking.BinPackParameters = false;
8649   verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
8650                "                        double *min_x,\n"
8651                "                        double *max_x,\n"
8652                "                        double *min_y,\n"
8653                "                        double *max_y,\n"
8654                "                        double *min_z,\n"
8655                "                        double *max_z, ) {}",
8656                NoBinPacking);
8657 }
8658 
8659 TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
8660   verifyFormat("void f() { return; }\n42");
8661   verifyFormat("void f() {\n"
8662                "  if (0)\n"
8663                "    return;\n"
8664                "}\n"
8665                "42");
8666   verifyFormat("void f() { return }\n42");
8667   verifyFormat("void f() {\n"
8668                "  if (0)\n"
8669                "    return\n"
8670                "}\n"
8671                "42");
8672 }
8673 
8674 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
8675   EXPECT_EQ("void f() { return }", format("void  f ( )  {  return  }"));
8676   EXPECT_EQ("void f() {\n"
8677             "  if (a)\n"
8678             "    return\n"
8679             "}",
8680             format("void  f  (  )  {  if  ( a )  return  }"));
8681   EXPECT_EQ("namespace N {\n"
8682             "void f()\n"
8683             "}",
8684             format("namespace  N  {  void f()  }"));
8685   EXPECT_EQ("namespace N {\n"
8686             "void f() {}\n"
8687             "void g()\n"
8688             "} // namespace N",
8689             format("namespace N  { void f( ) { } void g( ) }"));
8690 }
8691 
8692 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
8693   verifyFormat("int aaaaaaaa =\n"
8694                "    // Overlylongcomment\n"
8695                "    b;",
8696                getLLVMStyleWithColumns(20));
8697   verifyFormat("function(\n"
8698                "    ShortArgument,\n"
8699                "    LoooooooooooongArgument);\n",
8700                getLLVMStyleWithColumns(20));
8701 }
8702 
8703 TEST_F(FormatTest, IncorrectAccessSpecifier) {
8704   verifyFormat("public:");
8705   verifyFormat("class A {\n"
8706                "public\n"
8707                "  void f() {}\n"
8708                "};");
8709   verifyFormat("public\n"
8710                "int qwerty;");
8711   verifyFormat("public\n"
8712                "B {}");
8713   verifyFormat("public\n"
8714                "{}");
8715   verifyFormat("public\n"
8716                "B { int x; }");
8717 }
8718 
8719 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
8720   verifyFormat("{");
8721   verifyFormat("#})");
8722   verifyNoCrash("(/**/[:!] ?[).");
8723 }
8724 
8725 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) {
8726   // Found by oss-fuzz:
8727   // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212
8728   FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
8729   Style.ColumnLimit = 60;
8730   verifyNoCrash(
8731       "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20"
8732       "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20"
8733       "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a",
8734       Style);
8735 }
8736 
8737 TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
8738   verifyFormat("do {\n}");
8739   verifyFormat("do {\n}\n"
8740                "f();");
8741   verifyFormat("do {\n}\n"
8742                "wheeee(fun);");
8743   verifyFormat("do {\n"
8744                "  f();\n"
8745                "}");
8746 }
8747 
8748 TEST_F(FormatTest, IncorrectCodeMissingParens) {
8749   verifyFormat("if {\n  foo;\n  foo();\n}");
8750   verifyFormat("switch {\n  foo;\n  foo();\n}");
8751   verifyIncompleteFormat("for {\n  foo;\n  foo();\n}");
8752   verifyFormat("while {\n  foo;\n  foo();\n}");
8753   verifyFormat("do {\n  foo;\n  foo();\n} while;");
8754 }
8755 
8756 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
8757   verifyIncompleteFormat("namespace {\n"
8758                          "class Foo { Foo (\n"
8759                          "};\n"
8760                          "} // namespace");
8761 }
8762 
8763 TEST_F(FormatTest, IncorrectCodeErrorDetection) {
8764   EXPECT_EQ("{\n  {}\n", format("{\n{\n}\n"));
8765   EXPECT_EQ("{\n  {}\n", format("{\n  {\n}\n"));
8766   EXPECT_EQ("{\n  {}\n", format("{\n  {\n  }\n"));
8767   EXPECT_EQ("{\n  {}\n}\n}\n", format("{\n  {\n    }\n  }\n}\n"));
8768 
8769   EXPECT_EQ("{\n"
8770             "  {\n"
8771             "    breakme(\n"
8772             "        qwe);\n"
8773             "  }\n",
8774             format("{\n"
8775                    "    {\n"
8776                    " breakme(qwe);\n"
8777                    "}\n",
8778                    getLLVMStyleWithColumns(10)));
8779 }
8780 
8781 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
8782   verifyFormat("int x = {\n"
8783                "    avariable,\n"
8784                "    b(alongervariable)};",
8785                getLLVMStyleWithColumns(25));
8786 }
8787 
8788 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
8789   verifyFormat("return (a)(b){1, 2, 3};");
8790 }
8791 
8792 TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
8793   verifyFormat("vector<int> x{1, 2, 3, 4};");
8794   verifyFormat("vector<int> x{\n"
8795                "    1,\n"
8796                "    2,\n"
8797                "    3,\n"
8798                "    4,\n"
8799                "};");
8800   verifyFormat("vector<T> x{{}, {}, {}, {}};");
8801   verifyFormat("f({1, 2});");
8802   verifyFormat("auto v = Foo{-1};");
8803   verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
8804   verifyFormat("Class::Class : member{1, 2, 3} {}");
8805   verifyFormat("new vector<int>{1, 2, 3};");
8806   verifyFormat("new int[3]{1, 2, 3};");
8807   verifyFormat("new int{1};");
8808   verifyFormat("return {arg1, arg2};");
8809   verifyFormat("return {arg1, SomeType{parameter}};");
8810   verifyFormat("int count = set<int>{f(), g(), h()}.size();");
8811   verifyFormat("new T{arg1, arg2};");
8812   verifyFormat("f(MyMap[{composite, key}]);");
8813   verifyFormat("class Class {\n"
8814                "  T member = {arg1, arg2};\n"
8815                "};");
8816   verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
8817   verifyFormat("const struct A a = {.a = 1, .b = 2};");
8818   verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
8819   verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
8820   verifyFormat("int a = std::is_integral<int>{} + 0;");
8821 
8822   verifyFormat("int foo(int i) { return fo1{}(i); }");
8823   verifyFormat("int foo(int i) { return fo1{}(i); }");
8824   verifyFormat("auto i = decltype(x){};");
8825   verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
8826   verifyFormat("Node n{1, Node{1000}, //\n"
8827                "       2};");
8828   verifyFormat("Aaaa aaaaaaa{\n"
8829                "    {\n"
8830                "        aaaa,\n"
8831                "    },\n"
8832                "};");
8833   verifyFormat("class C : public D {\n"
8834                "  SomeClass SC{2};\n"
8835                "};");
8836   verifyFormat("class C : public A {\n"
8837                "  class D : public B {\n"
8838                "    void f() { int i{2}; }\n"
8839                "  };\n"
8840                "};");
8841   verifyFormat("#define A {a, a},");
8842 
8843   // Avoid breaking between equal sign and opening brace
8844   FormatStyle AvoidBreakingFirstArgument = getLLVMStyle();
8845   AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200;
8846   verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n"
8847                "    {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n"
8848                "     {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n"
8849                "     {\"ccccccccccccccccccccc\", 2}};",
8850                AvoidBreakingFirstArgument);
8851 
8852   // Binpacking only if there is no trailing comma
8853   verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
8854                "                      cccccccccc, dddddddddd};",
8855                getLLVMStyleWithColumns(50));
8856   verifyFormat("const Aaaaaa aaaaa = {\n"
8857                "    aaaaaaaaaaa,\n"
8858                "    bbbbbbbbbbb,\n"
8859                "    ccccccccccc,\n"
8860                "    ddddddddddd,\n"
8861                "};",
8862                getLLVMStyleWithColumns(50));
8863 
8864   // Cases where distinguising braced lists and blocks is hard.
8865   verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
8866   verifyFormat("void f() {\n"
8867                "  return; // comment\n"
8868                "}\n"
8869                "SomeType t;");
8870   verifyFormat("void f() {\n"
8871                "  if (a) {\n"
8872                "    f();\n"
8873                "  }\n"
8874                "}\n"
8875                "SomeType t;");
8876 
8877   // In combination with BinPackArguments = false.
8878   FormatStyle NoBinPacking = getLLVMStyle();
8879   NoBinPacking.BinPackArguments = false;
8880   verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
8881                "                      bbbbb,\n"
8882                "                      ccccc,\n"
8883                "                      ddddd,\n"
8884                "                      eeeee,\n"
8885                "                      ffffff,\n"
8886                "                      ggggg,\n"
8887                "                      hhhhhh,\n"
8888                "                      iiiiii,\n"
8889                "                      jjjjjj,\n"
8890                "                      kkkkkk};",
8891                NoBinPacking);
8892   verifyFormat("const Aaaaaa aaaaa = {\n"
8893                "    aaaaa,\n"
8894                "    bbbbb,\n"
8895                "    ccccc,\n"
8896                "    ddddd,\n"
8897                "    eeeee,\n"
8898                "    ffffff,\n"
8899                "    ggggg,\n"
8900                "    hhhhhh,\n"
8901                "    iiiiii,\n"
8902                "    jjjjjj,\n"
8903                "    kkkkkk,\n"
8904                "};",
8905                NoBinPacking);
8906   verifyFormat(
8907       "const Aaaaaa aaaaa = {\n"
8908       "    aaaaa,  bbbbb,  ccccc,  ddddd,  eeeee,  ffffff, ggggg, hhhhhh,\n"
8909       "    iiiiii, jjjjjj, kkkkkk, aaaaa,  bbbbb,  ccccc,  ddddd, eeeee,\n"
8910       "    ffffff, ggggg,  hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
8911       "};",
8912       NoBinPacking);
8913 
8914   NoBinPacking.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8915   EXPECT_EQ("static uint8 CddDp83848Reg[] = {\n"
8916             "    CDDDP83848_BMCR_REGISTER,\n"
8917             "    CDDDP83848_BMSR_REGISTER,\n"
8918             "    CDDDP83848_RBR_REGISTER};",
8919             format("static uint8 CddDp83848Reg[] = {CDDDP83848_BMCR_REGISTER,\n"
8920                    "                                CDDDP83848_BMSR_REGISTER,\n"
8921                    "                                CDDDP83848_RBR_REGISTER};",
8922                    NoBinPacking));
8923 
8924   // FIXME: The alignment of these trailing comments might be bad. Then again,
8925   // this might be utterly useless in real code.
8926   verifyFormat("Constructor::Constructor()\n"
8927                "    : some_value{         //\n"
8928                "                 aaaaaaa, //\n"
8929                "                 bbbbbbb} {}");
8930 
8931   // In braced lists, the first comment is always assumed to belong to the
8932   // first element. Thus, it can be moved to the next or previous line as
8933   // appropriate.
8934   EXPECT_EQ("function({// First element:\n"
8935             "          1,\n"
8936             "          // Second element:\n"
8937             "          2});",
8938             format("function({\n"
8939                    "    // First element:\n"
8940                    "    1,\n"
8941                    "    // Second element:\n"
8942                    "    2});"));
8943   EXPECT_EQ("std::vector<int> MyNumbers{\n"
8944             "    // First element:\n"
8945             "    1,\n"
8946             "    // Second element:\n"
8947             "    2};",
8948             format("std::vector<int> MyNumbers{// First element:\n"
8949                    "                           1,\n"
8950                    "                           // Second element:\n"
8951                    "                           2};",
8952                    getLLVMStyleWithColumns(30)));
8953   // A trailing comma should still lead to an enforced line break and no
8954   // binpacking.
8955   EXPECT_EQ("vector<int> SomeVector = {\n"
8956             "    // aaa\n"
8957             "    1,\n"
8958             "    2,\n"
8959             "};",
8960             format("vector<int> SomeVector = { // aaa\n"
8961                    "    1, 2, };"));
8962 
8963   // C++11 brace initializer list l-braces should not be treated any differently
8964   // when breaking before lambda bodies is enabled
8965   FormatStyle BreakBeforeLambdaBody = getLLVMStyle();
8966   BreakBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom;
8967   BreakBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true;
8968   BreakBeforeLambdaBody.AlwaysBreakBeforeMultilineStrings = true;
8969   verifyFormat(
8970       "std::runtime_error{\n"
8971       "    \"Long string which will force a break onto the next line...\"};",
8972       BreakBeforeLambdaBody);
8973 
8974   FormatStyle ExtraSpaces = getLLVMStyle();
8975   ExtraSpaces.Cpp11BracedListStyle = false;
8976   ExtraSpaces.ColumnLimit = 75;
8977   verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
8978   verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
8979   verifyFormat("f({ 1, 2 });", ExtraSpaces);
8980   verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
8981   verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
8982   verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
8983   verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
8984   verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
8985   verifyFormat("return { arg1, arg2 };", ExtraSpaces);
8986   verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
8987   verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
8988   verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
8989   verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
8990   verifyFormat("class Class {\n"
8991                "  T member = { arg1, arg2 };\n"
8992                "};",
8993                ExtraSpaces);
8994   verifyFormat(
8995       "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8996       "                                 aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
8997       "                  : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
8998       "                                 bbbbbbbbbbbbbbbbbbbb, bbbbb };",
8999       ExtraSpaces);
9000   verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
9001   verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
9002                ExtraSpaces);
9003   verifyFormat(
9004       "someFunction(OtherParam,\n"
9005       "             BracedList{ // comment 1 (Forcing interesting break)\n"
9006       "                         param1, param2,\n"
9007       "                         // comment 2\n"
9008       "                         param3, param4 });",
9009       ExtraSpaces);
9010   verifyFormat(
9011       "std::this_thread::sleep_for(\n"
9012       "    std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
9013       ExtraSpaces);
9014   verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
9015                "    aaaaaaa,\n"
9016                "    aaaaaaaaaa,\n"
9017                "    aaaaa,\n"
9018                "    aaaaaaaaaaaaaaa,\n"
9019                "    aaa,\n"
9020                "    aaaaaaaaaa,\n"
9021                "    a,\n"
9022                "    aaaaaaaaaaaaaaaaaaaaa,\n"
9023                "    aaaaaaaaaaaa,\n"
9024                "    aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
9025                "    aaaaaaa,\n"
9026                "    a};");
9027   verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
9028   verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
9029   verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
9030 
9031   // Avoid breaking between initializer/equal sign and opening brace
9032   ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200;
9033   verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n"
9034                "  { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
9035                "  { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
9036                "  { \"ccccccccccccccccccccc\", 2 }\n"
9037                "};",
9038                ExtraSpaces);
9039   verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n"
9040                "  { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
9041                "  { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
9042                "  { \"ccccccccccccccccccccc\", 2 }\n"
9043                "};",
9044                ExtraSpaces);
9045 
9046   FormatStyle SpaceBeforeBrace = getLLVMStyle();
9047   SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true;
9048   verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace);
9049   verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace);
9050 
9051   FormatStyle SpaceBetweenBraces = getLLVMStyle();
9052   SpaceBetweenBraces.SpacesInAngles = true;
9053   SpaceBetweenBraces.SpacesInParentheses = true;
9054   SpaceBetweenBraces.SpacesInSquareBrackets = true;
9055   verifyFormat("vector< int > x{ 1, 2, 3, 4 };", SpaceBetweenBraces);
9056   verifyFormat("f( {}, { {}, {} }, MyMap[ { k, v } ] );", SpaceBetweenBraces);
9057   verifyFormat("vector< int > x{ // comment 1\n"
9058                "                 1, 2, 3, 4 };",
9059                SpaceBetweenBraces);
9060   SpaceBetweenBraces.ColumnLimit = 20;
9061   EXPECT_EQ("vector< int > x{\n"
9062             "    1, 2, 3, 4 };",
9063             format("vector<int>x{1,2,3,4};", SpaceBetweenBraces));
9064   SpaceBetweenBraces.ColumnLimit = 24;
9065   EXPECT_EQ("vector< int > x{ 1, 2,\n"
9066             "                 3, 4 };",
9067             format("vector<int>x{1,2,3,4};", SpaceBetweenBraces));
9068   EXPECT_EQ("vector< int > x{\n"
9069             "    1,\n"
9070             "    2,\n"
9071             "    3,\n"
9072             "    4,\n"
9073             "};",
9074             format("vector<int>x{1,2,3,4,};", SpaceBetweenBraces));
9075   verifyFormat("vector< int > x{};", SpaceBetweenBraces);
9076   SpaceBetweenBraces.SpaceInEmptyParentheses = true;
9077   verifyFormat("vector< int > x{ };", SpaceBetweenBraces);
9078 }
9079 
9080 TEST_F(FormatTest, FormatSpacesInAngles) {
9081   FormatStyle SpaceInAngles = getLLVMStyle();
9082   SpaceInAngles.SpacesInAngles = true;
9083   verifyFormat("vector< ::std::string > x1;", SpaceInAngles);
9084   verifyFormat("Foo< int, Bar > x2;", SpaceInAngles);
9085   verifyFormat("Foo< ::int, ::Bar > x3;", SpaceInAngles);
9086 
9087   SpaceInAngles.SpacesInAngles = false;
9088   verifyFormat("vector<::std::string> x4;", SpaceInAngles);
9089   verifyFormat("vector<int> x5;", SpaceInAngles);
9090   verifyFormat("Foo<int, Bar> x6;", SpaceInAngles);
9091   verifyFormat("Foo<::int, ::Bar> x7;", SpaceInAngles);
9092 }
9093 
9094 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
9095   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9096                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9097                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9098                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9099                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9100                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
9101   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
9102                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9103                "                 1, 22, 333, 4444, 55555, //\n"
9104                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9105                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
9106   verifyFormat(
9107       "vector<int> x = {1,       22, 333, 4444, 55555, 666666, 7777777,\n"
9108       "                 1,       22, 333, 4444, 55555, 666666, 7777777,\n"
9109       "                 1,       22, 333, 4444, 55555, 666666, // comment\n"
9110       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
9111       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
9112       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
9113       "                 7777777};");
9114   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
9115                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
9116                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
9117   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
9118                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
9119                "    // Separating comment.\n"
9120                "    X86::R8, X86::R9, X86::R10, X86::R11, 0};");
9121   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
9122                "    // Leading comment\n"
9123                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
9124                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
9125   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
9126                "                 1, 1, 1, 1};",
9127                getLLVMStyleWithColumns(39));
9128   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
9129                "                 1, 1, 1, 1};",
9130                getLLVMStyleWithColumns(38));
9131   verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
9132                "    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
9133                getLLVMStyleWithColumns(43));
9134   verifyFormat(
9135       "static unsigned SomeValues[10][3] = {\n"
9136       "    {1, 4, 0},  {4, 9, 0},  {4, 5, 9},  {8, 5, 4}, {1, 8, 4},\n"
9137       "    {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
9138   verifyFormat("static auto fields = new vector<string>{\n"
9139                "    \"aaaaaaaaaaaaa\",\n"
9140                "    \"aaaaaaaaaaaaa\",\n"
9141                "    \"aaaaaaaaaaaa\",\n"
9142                "    \"aaaaaaaaaaaaaa\",\n"
9143                "    \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
9144                "    \"aaaaaaaaaaaa\",\n"
9145                "    \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
9146                "};");
9147   verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
9148   verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
9149                "                 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
9150                "                 3, cccccccccccccccccccccc};",
9151                getLLVMStyleWithColumns(60));
9152 
9153   // Trailing commas.
9154   verifyFormat("vector<int> x = {\n"
9155                "    1, 1, 1, 1, 1, 1, 1, 1,\n"
9156                "};",
9157                getLLVMStyleWithColumns(39));
9158   verifyFormat("vector<int> x = {\n"
9159                "    1, 1, 1, 1, 1, 1, 1, 1, //\n"
9160                "};",
9161                getLLVMStyleWithColumns(39));
9162   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
9163                "                 1, 1, 1, 1,\n"
9164                "                 /**/ /**/};",
9165                getLLVMStyleWithColumns(39));
9166 
9167   // Trailing comment in the first line.
9168   verifyFormat("vector<int> iiiiiiiiiiiiiii = {                      //\n"
9169                "    1111111111, 2222222222, 33333333333, 4444444444, //\n"
9170                "    111111111,  222222222,  3333333333,  444444444,  //\n"
9171                "    11111111,   22222222,   333333333,   44444444};");
9172   // Trailing comment in the last line.
9173   verifyFormat("int aaaaa[] = {\n"
9174                "    1, 2, 3, // comment\n"
9175                "    4, 5, 6  // comment\n"
9176                "};");
9177 
9178   // With nested lists, we should either format one item per line or all nested
9179   // lists one on line.
9180   // FIXME: For some nested lists, we can do better.
9181   verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
9182                "        {aaaaaaaaaaaaaaaaaaa},\n"
9183                "        {aaaaaaaaaaaaaaaaaaaaa},\n"
9184                "        {aaaaaaaaaaaaaaaaa}};",
9185                getLLVMStyleWithColumns(60));
9186   verifyFormat(
9187       "SomeStruct my_struct_array = {\n"
9188       "    {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
9189       "     aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
9190       "    {aaa, aaa},\n"
9191       "    {aaa, aaa},\n"
9192       "    {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
9193       "    {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
9194       "     aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
9195 
9196   // No column layout should be used here.
9197   verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
9198                "                   bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
9199 
9200   verifyNoCrash("a<,");
9201 
9202   // No braced initializer here.
9203   verifyFormat("void f() {\n"
9204                "  struct Dummy {};\n"
9205                "  f(v);\n"
9206                "}");
9207 
9208   // Long lists should be formatted in columns even if they are nested.
9209   verifyFormat(
9210       "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9211       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9212       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9213       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9214       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9215       "                          1, 22, 333, 4444, 55555, 666666, 7777777});");
9216 
9217   // Allow "single-column" layout even if that violates the column limit. There
9218   // isn't going to be a better way.
9219   verifyFormat("std::vector<int> a = {\n"
9220                "    aaaaaaaa,\n"
9221                "    aaaaaaaa,\n"
9222                "    aaaaaaaa,\n"
9223                "    aaaaaaaa,\n"
9224                "    aaaaaaaaaa,\n"
9225                "    aaaaaaaa,\n"
9226                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
9227                getLLVMStyleWithColumns(30));
9228   verifyFormat("vector<int> aaaa = {\n"
9229                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
9230                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
9231                "    aaaaaa.aaaaaaa,\n"
9232                "    aaaaaa.aaaaaaa,\n"
9233                "    aaaaaa.aaaaaaa,\n"
9234                "    aaaaaa.aaaaaaa,\n"
9235                "};");
9236 
9237   // Don't create hanging lists.
9238   verifyFormat("someFunction(Param, {List1, List2,\n"
9239                "                     List3});",
9240                getLLVMStyleWithColumns(35));
9241   verifyFormat("someFunction(Param, Param,\n"
9242                "             {List1, List2,\n"
9243                "              List3});",
9244                getLLVMStyleWithColumns(35));
9245   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
9246                "                               aaaaaaaaaaaaaaaaaaaaaaa);");
9247 }
9248 
9249 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
9250   FormatStyle DoNotMerge = getLLVMStyle();
9251   DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
9252 
9253   verifyFormat("void f() { return 42; }");
9254   verifyFormat("void f() {\n"
9255                "  return 42;\n"
9256                "}",
9257                DoNotMerge);
9258   verifyFormat("void f() {\n"
9259                "  // Comment\n"
9260                "}");
9261   verifyFormat("{\n"
9262                "#error {\n"
9263                "  int a;\n"
9264                "}");
9265   verifyFormat("{\n"
9266                "  int a;\n"
9267                "#error {\n"
9268                "}");
9269   verifyFormat("void f() {} // comment");
9270   verifyFormat("void f() { int a; } // comment");
9271   verifyFormat("void f() {\n"
9272                "} // comment",
9273                DoNotMerge);
9274   verifyFormat("void f() {\n"
9275                "  int a;\n"
9276                "} // comment",
9277                DoNotMerge);
9278   verifyFormat("void f() {\n"
9279                "} // comment",
9280                getLLVMStyleWithColumns(15));
9281 
9282   verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
9283   verifyFormat("void f() {\n  return 42;\n}", getLLVMStyleWithColumns(22));
9284 
9285   verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
9286   verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
9287   verifyFormat("class C {\n"
9288                "  C()\n"
9289                "      : iiiiiiii(nullptr),\n"
9290                "        kkkkkkk(nullptr),\n"
9291                "        mmmmmmm(nullptr),\n"
9292                "        nnnnnnn(nullptr) {}\n"
9293                "};",
9294                getGoogleStyle());
9295 
9296   FormatStyle NoColumnLimit = getLLVMStyle();
9297   NoColumnLimit.ColumnLimit = 0;
9298   EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
9299   EXPECT_EQ("class C {\n"
9300             "  A() : b(0) {}\n"
9301             "};",
9302             format("class C{A():b(0){}};", NoColumnLimit));
9303   EXPECT_EQ("A()\n"
9304             "    : b(0) {\n"
9305             "}",
9306             format("A()\n:b(0)\n{\n}", NoColumnLimit));
9307 
9308   FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
9309   DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
9310       FormatStyle::SFS_None;
9311   EXPECT_EQ("A()\n"
9312             "    : b(0) {\n"
9313             "}",
9314             format("A():b(0){}", DoNotMergeNoColumnLimit));
9315   EXPECT_EQ("A()\n"
9316             "    : b(0) {\n"
9317             "}",
9318             format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
9319 
9320   verifyFormat("#define A          \\\n"
9321                "  void f() {       \\\n"
9322                "    int i;         \\\n"
9323                "  }",
9324                getLLVMStyleWithColumns(20));
9325   verifyFormat("#define A           \\\n"
9326                "  void f() { int i; }",
9327                getLLVMStyleWithColumns(21));
9328   verifyFormat("#define A            \\\n"
9329                "  void f() {         \\\n"
9330                "    int i;           \\\n"
9331                "  }                  \\\n"
9332                "  int j;",
9333                getLLVMStyleWithColumns(22));
9334   verifyFormat("#define A             \\\n"
9335                "  void f() { int i; } \\\n"
9336                "  int j;",
9337                getLLVMStyleWithColumns(23));
9338 }
9339 
9340 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
9341   FormatStyle MergeEmptyOnly = getLLVMStyle();
9342   MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
9343   verifyFormat("class C {\n"
9344                "  int f() {}\n"
9345                "};",
9346                MergeEmptyOnly);
9347   verifyFormat("class C {\n"
9348                "  int f() {\n"
9349                "    return 42;\n"
9350                "  }\n"
9351                "};",
9352                MergeEmptyOnly);
9353   verifyFormat("int f() {}", MergeEmptyOnly);
9354   verifyFormat("int f() {\n"
9355                "  return 42;\n"
9356                "}",
9357                MergeEmptyOnly);
9358 
9359   // Also verify behavior when BraceWrapping.AfterFunction = true
9360   MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
9361   MergeEmptyOnly.BraceWrapping.AfterFunction = true;
9362   verifyFormat("int f() {}", MergeEmptyOnly);
9363   verifyFormat("class C {\n"
9364                "  int f() {}\n"
9365                "};",
9366                MergeEmptyOnly);
9367 }
9368 
9369 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
9370   FormatStyle MergeInlineOnly = getLLVMStyle();
9371   MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
9372   verifyFormat("class C {\n"
9373                "  int f() { return 42; }\n"
9374                "};",
9375                MergeInlineOnly);
9376   verifyFormat("int f() {\n"
9377                "  return 42;\n"
9378                "}",
9379                MergeInlineOnly);
9380 
9381   // SFS_Inline implies SFS_Empty
9382   verifyFormat("class C {\n"
9383                "  int f() {}\n"
9384                "};",
9385                MergeInlineOnly);
9386   verifyFormat("int f() {}", MergeInlineOnly);
9387 
9388   // Also verify behavior when BraceWrapping.AfterFunction = true
9389   MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
9390   MergeInlineOnly.BraceWrapping.AfterFunction = true;
9391   verifyFormat("class C {\n"
9392                "  int f() { return 42; }\n"
9393                "};",
9394                MergeInlineOnly);
9395   verifyFormat("int f()\n"
9396                "{\n"
9397                "  return 42;\n"
9398                "}",
9399                MergeInlineOnly);
9400 
9401   // SFS_Inline implies SFS_Empty
9402   verifyFormat("int f() {}", MergeInlineOnly);
9403   verifyFormat("class C {\n"
9404                "  int f() {}\n"
9405                "};",
9406                MergeInlineOnly);
9407 }
9408 
9409 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
9410   FormatStyle MergeInlineOnly = getLLVMStyle();
9411   MergeInlineOnly.AllowShortFunctionsOnASingleLine =
9412       FormatStyle::SFS_InlineOnly;
9413   verifyFormat("class C {\n"
9414                "  int f() { return 42; }\n"
9415                "};",
9416                MergeInlineOnly);
9417   verifyFormat("int f() {\n"
9418                "  return 42;\n"
9419                "}",
9420                MergeInlineOnly);
9421 
9422   // SFS_InlineOnly does not imply SFS_Empty
9423   verifyFormat("class C {\n"
9424                "  int f() {}\n"
9425                "};",
9426                MergeInlineOnly);
9427   verifyFormat("int f() {\n"
9428                "}",
9429                MergeInlineOnly);
9430 
9431   // Also verify behavior when BraceWrapping.AfterFunction = true
9432   MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
9433   MergeInlineOnly.BraceWrapping.AfterFunction = true;
9434   verifyFormat("class C {\n"
9435                "  int f() { return 42; }\n"
9436                "};",
9437                MergeInlineOnly);
9438   verifyFormat("int f()\n"
9439                "{\n"
9440                "  return 42;\n"
9441                "}",
9442                MergeInlineOnly);
9443 
9444   // SFS_InlineOnly does not imply SFS_Empty
9445   verifyFormat("int f()\n"
9446                "{\n"
9447                "}",
9448                MergeInlineOnly);
9449   verifyFormat("class C {\n"
9450                "  int f() {}\n"
9451                "};",
9452                MergeInlineOnly);
9453 }
9454 
9455 TEST_F(FormatTest, SplitEmptyFunction) {
9456   FormatStyle Style = getLLVMStyle();
9457   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
9458   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9459   Style.BraceWrapping.AfterFunction = true;
9460   Style.BraceWrapping.SplitEmptyFunction = false;
9461   Style.ColumnLimit = 40;
9462 
9463   verifyFormat("int f()\n"
9464                "{}",
9465                Style);
9466   verifyFormat("int f()\n"
9467                "{\n"
9468                "  return 42;\n"
9469                "}",
9470                Style);
9471   verifyFormat("int f()\n"
9472                "{\n"
9473                "  // some comment\n"
9474                "}",
9475                Style);
9476 
9477   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
9478   verifyFormat("int f() {}", Style);
9479   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
9480                "{}",
9481                Style);
9482   verifyFormat("int f()\n"
9483                "{\n"
9484                "  return 0;\n"
9485                "}",
9486                Style);
9487 
9488   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
9489   verifyFormat("class Foo {\n"
9490                "  int f() {}\n"
9491                "};\n",
9492                Style);
9493   verifyFormat("class Foo {\n"
9494                "  int f() { return 0; }\n"
9495                "};\n",
9496                Style);
9497   verifyFormat("class Foo {\n"
9498                "  int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
9499                "  {}\n"
9500                "};\n",
9501                Style);
9502   verifyFormat("class Foo {\n"
9503                "  int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
9504                "  {\n"
9505                "    return 0;\n"
9506                "  }\n"
9507                "};\n",
9508                Style);
9509 
9510   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
9511   verifyFormat("int f() {}", Style);
9512   verifyFormat("int f() { return 0; }", Style);
9513   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
9514                "{}",
9515                Style);
9516   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
9517                "{\n"
9518                "  return 0;\n"
9519                "}",
9520                Style);
9521 }
9522 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
9523   FormatStyle Style = getLLVMStyle();
9524   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
9525   verifyFormat("#ifdef A\n"
9526                "int f() {}\n"
9527                "#else\n"
9528                "int g() {}\n"
9529                "#endif",
9530                Style);
9531 }
9532 
9533 TEST_F(FormatTest, SplitEmptyClass) {
9534   FormatStyle Style = getLLVMStyle();
9535   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9536   Style.BraceWrapping.AfterClass = true;
9537   Style.BraceWrapping.SplitEmptyRecord = false;
9538 
9539   verifyFormat("class Foo\n"
9540                "{};",
9541                Style);
9542   verifyFormat("/* something */ class Foo\n"
9543                "{};",
9544                Style);
9545   verifyFormat("template <typename X> class Foo\n"
9546                "{};",
9547                Style);
9548   verifyFormat("class Foo\n"
9549                "{\n"
9550                "  Foo();\n"
9551                "};",
9552                Style);
9553   verifyFormat("typedef class Foo\n"
9554                "{\n"
9555                "} Foo_t;",
9556                Style);
9557 }
9558 
9559 TEST_F(FormatTest, SplitEmptyStruct) {
9560   FormatStyle Style = getLLVMStyle();
9561   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9562   Style.BraceWrapping.AfterStruct = true;
9563   Style.BraceWrapping.SplitEmptyRecord = false;
9564 
9565   verifyFormat("struct Foo\n"
9566                "{};",
9567                Style);
9568   verifyFormat("/* something */ struct Foo\n"
9569                "{};",
9570                Style);
9571   verifyFormat("template <typename X> struct Foo\n"
9572                "{};",
9573                Style);
9574   verifyFormat("struct Foo\n"
9575                "{\n"
9576                "  Foo();\n"
9577                "};",
9578                Style);
9579   verifyFormat("typedef struct Foo\n"
9580                "{\n"
9581                "} Foo_t;",
9582                Style);
9583   // typedef struct Bar {} Bar_t;
9584 }
9585 
9586 TEST_F(FormatTest, SplitEmptyUnion) {
9587   FormatStyle Style = getLLVMStyle();
9588   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9589   Style.BraceWrapping.AfterUnion = true;
9590   Style.BraceWrapping.SplitEmptyRecord = false;
9591 
9592   verifyFormat("union Foo\n"
9593                "{};",
9594                Style);
9595   verifyFormat("/* something */ union Foo\n"
9596                "{};",
9597                Style);
9598   verifyFormat("union Foo\n"
9599                "{\n"
9600                "  A,\n"
9601                "};",
9602                Style);
9603   verifyFormat("typedef union Foo\n"
9604                "{\n"
9605                "} Foo_t;",
9606                Style);
9607 }
9608 
9609 TEST_F(FormatTest, SplitEmptyNamespace) {
9610   FormatStyle Style = getLLVMStyle();
9611   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9612   Style.BraceWrapping.AfterNamespace = true;
9613   Style.BraceWrapping.SplitEmptyNamespace = false;
9614 
9615   verifyFormat("namespace Foo\n"
9616                "{};",
9617                Style);
9618   verifyFormat("/* something */ namespace Foo\n"
9619                "{};",
9620                Style);
9621   verifyFormat("inline namespace Foo\n"
9622                "{};",
9623                Style);
9624   verifyFormat("/* something */ inline namespace Foo\n"
9625                "{};",
9626                Style);
9627   verifyFormat("export namespace Foo\n"
9628                "{};",
9629                Style);
9630   verifyFormat("namespace Foo\n"
9631                "{\n"
9632                "void Bar();\n"
9633                "};",
9634                Style);
9635 }
9636 
9637 TEST_F(FormatTest, NeverMergeShortRecords) {
9638   FormatStyle Style = getLLVMStyle();
9639 
9640   verifyFormat("class Foo {\n"
9641                "  Foo();\n"
9642                "};",
9643                Style);
9644   verifyFormat("typedef class Foo {\n"
9645                "  Foo();\n"
9646                "} Foo_t;",
9647                Style);
9648   verifyFormat("struct Foo {\n"
9649                "  Foo();\n"
9650                "};",
9651                Style);
9652   verifyFormat("typedef struct Foo {\n"
9653                "  Foo();\n"
9654                "} Foo_t;",
9655                Style);
9656   verifyFormat("union Foo {\n"
9657                "  A,\n"
9658                "};",
9659                Style);
9660   verifyFormat("typedef union Foo {\n"
9661                "  A,\n"
9662                "} Foo_t;",
9663                Style);
9664   verifyFormat("namespace Foo {\n"
9665                "void Bar();\n"
9666                "};",
9667                Style);
9668 
9669   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9670   Style.BraceWrapping.AfterClass = true;
9671   Style.BraceWrapping.AfterStruct = true;
9672   Style.BraceWrapping.AfterUnion = true;
9673   Style.BraceWrapping.AfterNamespace = true;
9674   verifyFormat("class Foo\n"
9675                "{\n"
9676                "  Foo();\n"
9677                "};",
9678                Style);
9679   verifyFormat("typedef class Foo\n"
9680                "{\n"
9681                "  Foo();\n"
9682                "} Foo_t;",
9683                Style);
9684   verifyFormat("struct Foo\n"
9685                "{\n"
9686                "  Foo();\n"
9687                "};",
9688                Style);
9689   verifyFormat("typedef struct Foo\n"
9690                "{\n"
9691                "  Foo();\n"
9692                "} Foo_t;",
9693                Style);
9694   verifyFormat("union Foo\n"
9695                "{\n"
9696                "  A,\n"
9697                "};",
9698                Style);
9699   verifyFormat("typedef union Foo\n"
9700                "{\n"
9701                "  A,\n"
9702                "} Foo_t;",
9703                Style);
9704   verifyFormat("namespace Foo\n"
9705                "{\n"
9706                "void Bar();\n"
9707                "};",
9708                Style);
9709 }
9710 
9711 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
9712   // Elaborate type variable declarations.
9713   verifyFormat("struct foo a = {bar};\nint n;");
9714   verifyFormat("class foo a = {bar};\nint n;");
9715   verifyFormat("union foo a = {bar};\nint n;");
9716 
9717   // Elaborate types inside function definitions.
9718   verifyFormat("struct foo f() {}\nint n;");
9719   verifyFormat("class foo f() {}\nint n;");
9720   verifyFormat("union foo f() {}\nint n;");
9721 
9722   // Templates.
9723   verifyFormat("template <class X> void f() {}\nint n;");
9724   verifyFormat("template <struct X> void f() {}\nint n;");
9725   verifyFormat("template <union X> void f() {}\nint n;");
9726 
9727   // Actual definitions...
9728   verifyFormat("struct {\n} n;");
9729   verifyFormat(
9730       "template <template <class T, class Y>, class Z> class X {\n} n;");
9731   verifyFormat("union Z {\n  int n;\n} x;");
9732   verifyFormat("class MACRO Z {\n} n;");
9733   verifyFormat("class MACRO(X) Z {\n} n;");
9734   verifyFormat("class __attribute__(X) Z {\n} n;");
9735   verifyFormat("class __declspec(X) Z {\n} n;");
9736   verifyFormat("class A##B##C {\n} n;");
9737   verifyFormat("class alignas(16) Z {\n} n;");
9738   verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
9739   verifyFormat("class MACROA MACRO(X) Z {\n} n;");
9740 
9741   // Redefinition from nested context:
9742   verifyFormat("class A::B::C {\n} n;");
9743 
9744   // Template definitions.
9745   verifyFormat(
9746       "template <typename F>\n"
9747       "Matcher(const Matcher<F> &Other,\n"
9748       "        typename enable_if_c<is_base_of<F, T>::value &&\n"
9749       "                             !is_same<F, T>::value>::type * = 0)\n"
9750       "    : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
9751 
9752   // FIXME: This is still incorrectly handled at the formatter side.
9753   verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
9754   verifyFormat("int i = SomeFunction(a<b, a> b);");
9755 
9756   // FIXME:
9757   // This now gets parsed incorrectly as class definition.
9758   // verifyFormat("class A<int> f() {\n}\nint n;");
9759 
9760   // Elaborate types where incorrectly parsing the structural element would
9761   // break the indent.
9762   verifyFormat("if (true)\n"
9763                "  class X x;\n"
9764                "else\n"
9765                "  f();\n");
9766 
9767   // This is simply incomplete. Formatting is not important, but must not crash.
9768   verifyFormat("class A:");
9769 }
9770 
9771 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
9772   EXPECT_EQ("#error Leave     all         white!!!!! space* alone!\n",
9773             format("#error Leave     all         white!!!!! space* alone!\n"));
9774   EXPECT_EQ(
9775       "#warning Leave     all         white!!!!! space* alone!\n",
9776       format("#warning Leave     all         white!!!!! space* alone!\n"));
9777   EXPECT_EQ("#error 1", format("  #  error   1"));
9778   EXPECT_EQ("#warning 1", format("  #  warning 1"));
9779 }
9780 
9781 TEST_F(FormatTest, FormatHashIfExpressions) {
9782   verifyFormat("#if AAAA && BBBB");
9783   verifyFormat("#if (AAAA && BBBB)");
9784   verifyFormat("#elif (AAAA && BBBB)");
9785   // FIXME: Come up with a better indentation for #elif.
9786   verifyFormat(
9787       "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) &&  \\\n"
9788       "    defined(BBBBBBBB)\n"
9789       "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) &&  \\\n"
9790       "    defined(BBBBBBBB)\n"
9791       "#endif",
9792       getLLVMStyleWithColumns(65));
9793 }
9794 
9795 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
9796   FormatStyle AllowsMergedIf = getGoogleStyle();
9797   AllowsMergedIf.AllowShortIfStatementsOnASingleLine =
9798       FormatStyle::SIS_WithoutElse;
9799   verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
9800   verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
9801   verifyFormat("if (true)\n#error E\n  return 42;", AllowsMergedIf);
9802   EXPECT_EQ("if (true) return 42;",
9803             format("if (true)\nreturn 42;", AllowsMergedIf));
9804   FormatStyle ShortMergedIf = AllowsMergedIf;
9805   ShortMergedIf.ColumnLimit = 25;
9806   verifyFormat("#define A \\\n"
9807                "  if (true) return 42;",
9808                ShortMergedIf);
9809   verifyFormat("#define A \\\n"
9810                "  f();    \\\n"
9811                "  if (true)\n"
9812                "#define B",
9813                ShortMergedIf);
9814   verifyFormat("#define A \\\n"
9815                "  f();    \\\n"
9816                "  if (true)\n"
9817                "g();",
9818                ShortMergedIf);
9819   verifyFormat("{\n"
9820                "#ifdef A\n"
9821                "  // Comment\n"
9822                "  if (true) continue;\n"
9823                "#endif\n"
9824                "  // Comment\n"
9825                "  if (true) continue;\n"
9826                "}",
9827                ShortMergedIf);
9828   ShortMergedIf.ColumnLimit = 33;
9829   verifyFormat("#define A \\\n"
9830                "  if constexpr (true) return 42;",
9831                ShortMergedIf);
9832   verifyFormat("#define A \\\n"
9833                "  if CONSTEXPR (true) return 42;",
9834                ShortMergedIf);
9835   ShortMergedIf.ColumnLimit = 29;
9836   verifyFormat("#define A                   \\\n"
9837                "  if (aaaaaaaaaa) return 1; \\\n"
9838                "  return 2;",
9839                ShortMergedIf);
9840   ShortMergedIf.ColumnLimit = 28;
9841   verifyFormat("#define A         \\\n"
9842                "  if (aaaaaaaaaa) \\\n"
9843                "    return 1;     \\\n"
9844                "  return 2;",
9845                ShortMergedIf);
9846   verifyFormat("#define A                \\\n"
9847                "  if constexpr (aaaaaaa) \\\n"
9848                "    return 1;            \\\n"
9849                "  return 2;",
9850                ShortMergedIf);
9851   verifyFormat("#define A                \\\n"
9852                "  if CONSTEXPR (aaaaaaa) \\\n"
9853                "    return 1;            \\\n"
9854                "  return 2;",
9855                ShortMergedIf);
9856 }
9857 
9858 TEST_F(FormatTest, FormatStarDependingOnContext) {
9859   verifyFormat("void f(int *a);");
9860   verifyFormat("void f() { f(fint * b); }");
9861   verifyFormat("class A {\n  void f(int *a);\n};");
9862   verifyFormat("class A {\n  int *a;\n};");
9863   verifyFormat("namespace a {\n"
9864                "namespace b {\n"
9865                "class A {\n"
9866                "  void f() {}\n"
9867                "  int *a;\n"
9868                "};\n"
9869                "} // namespace b\n"
9870                "} // namespace a");
9871 }
9872 
9873 TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
9874   verifyFormat("while");
9875   verifyFormat("operator");
9876 }
9877 
9878 TEST_F(FormatTest, SkipsDeeplyNestedLines) {
9879   // This code would be painfully slow to format if we didn't skip it.
9880   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
9881                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
9882                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
9883                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
9884                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
9885                    "A(1, 1)\n"
9886                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
9887                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9888                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9889                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9890                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9891                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9892                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9893                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9894                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9895                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
9896   // Deeply nested part is untouched, rest is formatted.
9897   EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
9898             format(std::string("int    i;\n") + Code + "int    j;\n",
9899                    getLLVMStyle(), SC_ExpectIncomplete));
9900 }
9901 
9902 //===----------------------------------------------------------------------===//
9903 // Objective-C tests.
9904 //===----------------------------------------------------------------------===//
9905 
9906 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
9907   verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
9908   EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
9909             format("-(NSUInteger)indexOfObject:(id)anObject;"));
9910   EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
9911   EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
9912   EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
9913             format("-(NSInteger)Method3:(id)anObject;"));
9914   EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
9915             format("-(NSInteger)Method4:(id)anObject;"));
9916   EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
9917             format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
9918   EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
9919             format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
9920   EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
9921             "forAllCells:(BOOL)flag;",
9922             format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
9923                    "forAllCells:(BOOL)flag;"));
9924 
9925   // Very long objectiveC method declaration.
9926   verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
9927                "    (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
9928   verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
9929                "                    inRange:(NSRange)range\n"
9930                "                   outRange:(NSRange)out_range\n"
9931                "                  outRange1:(NSRange)out_range1\n"
9932                "                  outRange2:(NSRange)out_range2\n"
9933                "                  outRange3:(NSRange)out_range3\n"
9934                "                  outRange4:(NSRange)out_range4\n"
9935                "                  outRange5:(NSRange)out_range5\n"
9936                "                  outRange6:(NSRange)out_range6\n"
9937                "                  outRange7:(NSRange)out_range7\n"
9938                "                  outRange8:(NSRange)out_range8\n"
9939                "                  outRange9:(NSRange)out_range9;");
9940 
9941   // When the function name has to be wrapped.
9942   FormatStyle Style = getLLVMStyle();
9943   // ObjC ignores IndentWrappedFunctionNames when wrapping methods
9944   // and always indents instead.
9945   Style.IndentWrappedFunctionNames = false;
9946   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
9947                "    veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
9948                "               anotherName:(NSString)bbbbbbbbbbbbbb {\n"
9949                "}",
9950                Style);
9951   Style.IndentWrappedFunctionNames = true;
9952   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
9953                "    veryLooooooooooongName:(NSString)cccccccccccccc\n"
9954                "               anotherName:(NSString)dddddddddddddd {\n"
9955                "}",
9956                Style);
9957 
9958   verifyFormat("- (int)sum:(vector<int>)numbers;");
9959   verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
9960   // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
9961   // protocol lists (but not for template classes):
9962   // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
9963 
9964   verifyFormat("- (int (*)())foo:(int (*)())f;");
9965   verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
9966 
9967   // If there's no return type (very rare in practice!), LLVM and Google style
9968   // agree.
9969   verifyFormat("- foo;");
9970   verifyFormat("- foo:(int)f;");
9971   verifyGoogleFormat("- foo:(int)foo;");
9972 }
9973 
9974 TEST_F(FormatTest, BreaksStringLiterals) {
9975   EXPECT_EQ("\"some text \"\n"
9976             "\"other\";",
9977             format("\"some text other\";", getLLVMStyleWithColumns(12)));
9978   EXPECT_EQ("\"some text \"\n"
9979             "\"other\";",
9980             format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
9981   EXPECT_EQ(
9982       "#define A  \\\n"
9983       "  \"some \"  \\\n"
9984       "  \"text \"  \\\n"
9985       "  \"other\";",
9986       format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
9987   EXPECT_EQ(
9988       "#define A  \\\n"
9989       "  \"so \"    \\\n"
9990       "  \"text \"  \\\n"
9991       "  \"other\";",
9992       format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
9993 
9994   EXPECT_EQ("\"some text\"",
9995             format("\"some text\"", getLLVMStyleWithColumns(1)));
9996   EXPECT_EQ("\"some text\"",
9997             format("\"some text\"", getLLVMStyleWithColumns(11)));
9998   EXPECT_EQ("\"some \"\n"
9999             "\"text\"",
10000             format("\"some text\"", getLLVMStyleWithColumns(10)));
10001   EXPECT_EQ("\"some \"\n"
10002             "\"text\"",
10003             format("\"some text\"", getLLVMStyleWithColumns(7)));
10004   EXPECT_EQ("\"some\"\n"
10005             "\" tex\"\n"
10006             "\"t\"",
10007             format("\"some text\"", getLLVMStyleWithColumns(6)));
10008   EXPECT_EQ("\"some\"\n"
10009             "\" tex\"\n"
10010             "\" and\"",
10011             format("\"some tex and\"", getLLVMStyleWithColumns(6)));
10012   EXPECT_EQ("\"some\"\n"
10013             "\"/tex\"\n"
10014             "\"/and\"",
10015             format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
10016 
10017   EXPECT_EQ("variable =\n"
10018             "    \"long string \"\n"
10019             "    \"literal\";",
10020             format("variable = \"long string literal\";",
10021                    getLLVMStyleWithColumns(20)));
10022 
10023   EXPECT_EQ("variable = f(\n"
10024             "    \"long string \"\n"
10025             "    \"literal\",\n"
10026             "    short,\n"
10027             "    loooooooooooooooooooong);",
10028             format("variable = f(\"long string literal\", short, "
10029                    "loooooooooooooooooooong);",
10030                    getLLVMStyleWithColumns(20)));
10031 
10032   EXPECT_EQ(
10033       "f(g(\"long string \"\n"
10034       "    \"literal\"),\n"
10035       "  b);",
10036       format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
10037   EXPECT_EQ("f(g(\"long string \"\n"
10038             "    \"literal\",\n"
10039             "    a),\n"
10040             "  b);",
10041             format("f(g(\"long string literal\", a), b);",
10042                    getLLVMStyleWithColumns(20)));
10043   EXPECT_EQ(
10044       "f(\"one two\".split(\n"
10045       "    variable));",
10046       format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
10047   EXPECT_EQ("f(\"one two three four five six \"\n"
10048             "  \"seven\".split(\n"
10049             "      really_looooong_variable));",
10050             format("f(\"one two three four five six seven\"."
10051                    "split(really_looooong_variable));",
10052                    getLLVMStyleWithColumns(33)));
10053 
10054   EXPECT_EQ("f(\"some \"\n"
10055             "  \"text\",\n"
10056             "  other);",
10057             format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
10058 
10059   // Only break as a last resort.
10060   verifyFormat(
10061       "aaaaaaaaaaaaaaaaaaaa(\n"
10062       "    aaaaaaaaaaaaaaaaaaaa,\n"
10063       "    aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
10064 
10065   EXPECT_EQ("\"splitmea\"\n"
10066             "\"trandomp\"\n"
10067             "\"oint\"",
10068             format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
10069 
10070   EXPECT_EQ("\"split/\"\n"
10071             "\"pathat/\"\n"
10072             "\"slashes\"",
10073             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
10074 
10075   EXPECT_EQ("\"split/\"\n"
10076             "\"pathat/\"\n"
10077             "\"slashes\"",
10078             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
10079   EXPECT_EQ("\"split at \"\n"
10080             "\"spaces/at/\"\n"
10081             "\"slashes.at.any$\"\n"
10082             "\"non-alphanumeric%\"\n"
10083             "\"1111111111characte\"\n"
10084             "\"rs\"",
10085             format("\"split at "
10086                    "spaces/at/"
10087                    "slashes.at."
10088                    "any$non-"
10089                    "alphanumeric%"
10090                    "1111111111characte"
10091                    "rs\"",
10092                    getLLVMStyleWithColumns(20)));
10093 
10094   // Verify that splitting the strings understands
10095   // Style::AlwaysBreakBeforeMultilineStrings.
10096   EXPECT_EQ("aaaaaaaaaaaa(\n"
10097             "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
10098             "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
10099             format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
10100                    "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
10101                    "aaaaaaaaaaaaaaaaaaaaaa\");",
10102                    getGoogleStyle()));
10103   EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
10104             "       \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
10105             format("return \"aaaaaaaaaaaaaaaaaaaaaa "
10106                    "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
10107                    "aaaaaaaaaaaaaaaaaaaaaa\";",
10108                    getGoogleStyle()));
10109   EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
10110             "                \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
10111             format("llvm::outs() << "
10112                    "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
10113                    "aaaaaaaaaaaaaaaaaaa\";"));
10114   EXPECT_EQ("ffff(\n"
10115             "    {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
10116             "     \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
10117             format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
10118                    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
10119                    getGoogleStyle()));
10120 
10121   FormatStyle Style = getLLVMStyleWithColumns(12);
10122   Style.BreakStringLiterals = false;
10123   EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
10124 
10125   FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
10126   AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10127   EXPECT_EQ("#define A \\\n"
10128             "  \"some \" \\\n"
10129             "  \"text \" \\\n"
10130             "  \"other\";",
10131             format("#define A \"some text other\";", AlignLeft));
10132 }
10133 
10134 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) {
10135   EXPECT_EQ("C a = \"some more \"\n"
10136             "      \"text\";",
10137             format("C a = \"some more text\";", getLLVMStyleWithColumns(18)));
10138 }
10139 
10140 TEST_F(FormatTest, FullyRemoveEmptyLines) {
10141   FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
10142   NoEmptyLines.MaxEmptyLinesToKeep = 0;
10143   EXPECT_EQ("int i = a(b());",
10144             format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
10145 }
10146 
10147 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
10148   EXPECT_EQ(
10149       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10150       "(\n"
10151       "    \"x\t\");",
10152       format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10153              "aaaaaaa("
10154              "\"x\t\");"));
10155 }
10156 
10157 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
10158   EXPECT_EQ(
10159       "u8\"utf8 string \"\n"
10160       "u8\"literal\";",
10161       format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
10162   EXPECT_EQ(
10163       "u\"utf16 string \"\n"
10164       "u\"literal\";",
10165       format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
10166   EXPECT_EQ(
10167       "U\"utf32 string \"\n"
10168       "U\"literal\";",
10169       format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
10170   EXPECT_EQ("L\"wide string \"\n"
10171             "L\"literal\";",
10172             format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
10173   EXPECT_EQ("@\"NSString \"\n"
10174             "@\"literal\";",
10175             format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
10176   verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
10177 
10178   // This input makes clang-format try to split the incomplete unicode escape
10179   // sequence, which used to lead to a crasher.
10180   verifyNoCrash(
10181       "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
10182       getLLVMStyleWithColumns(60));
10183 }
10184 
10185 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
10186   FormatStyle Style = getGoogleStyleWithColumns(15);
10187   EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
10188   EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
10189   EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
10190   EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
10191   EXPECT_EQ("u8R\"x(raw literal)x\";",
10192             format("u8R\"x(raw literal)x\";", Style));
10193 }
10194 
10195 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
10196   FormatStyle Style = getLLVMStyleWithColumns(20);
10197   EXPECT_EQ(
10198       "_T(\"aaaaaaaaaaaaaa\")\n"
10199       "_T(\"aaaaaaaaaaaaaa\")\n"
10200       "_T(\"aaaaaaaaaaaa\")",
10201       format("  _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
10202   EXPECT_EQ("f(x,\n"
10203             "  _T(\"aaaaaaaaaaaa\")\n"
10204             "  _T(\"aaa\"),\n"
10205             "  z);",
10206             format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
10207 
10208   // FIXME: Handle embedded spaces in one iteration.
10209   //  EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
10210   //            "_T(\"aaaaaaaaaaaaa\")\n"
10211   //            "_T(\"aaaaaaaaaaaaa\")\n"
10212   //            "_T(\"a\")",
10213   //            format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
10214   //                   getLLVMStyleWithColumns(20)));
10215   EXPECT_EQ(
10216       "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
10217       format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
10218   EXPECT_EQ("f(\n"
10219             "#if !TEST\n"
10220             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
10221             "#endif\n"
10222             ");",
10223             format("f(\n"
10224                    "#if !TEST\n"
10225                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
10226                    "#endif\n"
10227                    ");"));
10228   EXPECT_EQ("f(\n"
10229             "\n"
10230             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
10231             format("f(\n"
10232                    "\n"
10233                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
10234 }
10235 
10236 TEST_F(FormatTest, BreaksStringLiteralOperands) {
10237   // In a function call with two operands, the second can be broken with no line
10238   // break before it.
10239   EXPECT_EQ(
10240       "func(a, \"long long \"\n"
10241       "        \"long long\");",
10242       format("func(a, \"long long long long\");", getLLVMStyleWithColumns(24)));
10243   // In a function call with three operands, the second must be broken with a
10244   // line break before it.
10245   EXPECT_EQ("func(a,\n"
10246             "     \"long long long \"\n"
10247             "     \"long\",\n"
10248             "     c);",
10249             format("func(a, \"long long long long\", c);",
10250                    getLLVMStyleWithColumns(24)));
10251   // In a function call with three operands, the third must be broken with a
10252   // line break before it.
10253   EXPECT_EQ("func(a, b,\n"
10254             "     \"long long long \"\n"
10255             "     \"long\");",
10256             format("func(a, b, \"long long long long\");",
10257                    getLLVMStyleWithColumns(24)));
10258   // In a function call with three operands, both the second and the third must
10259   // be broken with a line break before them.
10260   EXPECT_EQ("func(a,\n"
10261             "     \"long long long \"\n"
10262             "     \"long\",\n"
10263             "     \"long long long \"\n"
10264             "     \"long\");",
10265             format("func(a, \"long long long long\", \"long long long long\");",
10266                    getLLVMStyleWithColumns(24)));
10267   // In a chain of << with two operands, the second can be broken with no line
10268   // break before it.
10269   EXPECT_EQ("a << \"line line \"\n"
10270             "     \"line\";",
10271             format("a << \"line line line\";", getLLVMStyleWithColumns(20)));
10272   // In a chain of << with three operands, the second can be broken with no line
10273   // break before it.
10274   EXPECT_EQ(
10275       "abcde << \"line \"\n"
10276       "         \"line line\"\n"
10277       "      << c;",
10278       format("abcde << \"line line line\" << c;", getLLVMStyleWithColumns(20)));
10279   // In a chain of << with three operands, the third must be broken with a line
10280   // break before it.
10281   EXPECT_EQ(
10282       "a << b\n"
10283       "  << \"line line \"\n"
10284       "     \"line\";",
10285       format("a << b << \"line line line\";", getLLVMStyleWithColumns(20)));
10286   // In a chain of << with three operands, the second can be broken with no line
10287   // break before it and the third must be broken with a line break before it.
10288   EXPECT_EQ("abcd << \"line line \"\n"
10289             "        \"line\"\n"
10290             "     << \"line line \"\n"
10291             "        \"line\";",
10292             format("abcd << \"line line line\" << \"line line line\";",
10293                    getLLVMStyleWithColumns(20)));
10294   // In a chain of binary operators with two operands, the second can be broken
10295   // with no line break before it.
10296   EXPECT_EQ(
10297       "abcd + \"line line \"\n"
10298       "       \"line line\";",
10299       format("abcd + \"line line line line\";", getLLVMStyleWithColumns(20)));
10300   // In a chain of binary operators with three operands, the second must be
10301   // broken with a line break before it.
10302   EXPECT_EQ("abcd +\n"
10303             "    \"line line \"\n"
10304             "    \"line line\" +\n"
10305             "    e;",
10306             format("abcd + \"line line line line\" + e;",
10307                    getLLVMStyleWithColumns(20)));
10308   // In a function call with two operands, with AlignAfterOpenBracket enabled,
10309   // the first must be broken with a line break before it.
10310   FormatStyle Style = getLLVMStyleWithColumns(25);
10311   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10312   EXPECT_EQ("someFunction(\n"
10313             "    \"long long long \"\n"
10314             "    \"long\",\n"
10315             "    a);",
10316             format("someFunction(\"long long long long\", a);", Style));
10317 }
10318 
10319 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
10320   EXPECT_EQ(
10321       "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
10322       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
10323       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
10324       format("aaaaaaaaaaa  =  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
10325              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
10326              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
10327 }
10328 
10329 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
10330   EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
10331             format("f(g(R\"x(raw literal)x\",   a), b);", getGoogleStyle()));
10332   EXPECT_EQ("fffffffffff(g(R\"x(\n"
10333             "multiline raw string literal xxxxxxxxxxxxxx\n"
10334             ")x\",\n"
10335             "              a),\n"
10336             "            b);",
10337             format("fffffffffff(g(R\"x(\n"
10338                    "multiline raw string literal xxxxxxxxxxxxxx\n"
10339                    ")x\", a), b);",
10340                    getGoogleStyleWithColumns(20)));
10341   EXPECT_EQ("fffffffffff(\n"
10342             "    g(R\"x(qqq\n"
10343             "multiline raw string literal xxxxxxxxxxxxxx\n"
10344             ")x\",\n"
10345             "      a),\n"
10346             "    b);",
10347             format("fffffffffff(g(R\"x(qqq\n"
10348                    "multiline raw string literal xxxxxxxxxxxxxx\n"
10349                    ")x\", a), b);",
10350                    getGoogleStyleWithColumns(20)));
10351 
10352   EXPECT_EQ("fffffffffff(R\"x(\n"
10353             "multiline raw string literal xxxxxxxxxxxxxx\n"
10354             ")x\");",
10355             format("fffffffffff(R\"x(\n"
10356                    "multiline raw string literal xxxxxxxxxxxxxx\n"
10357                    ")x\");",
10358                    getGoogleStyleWithColumns(20)));
10359   EXPECT_EQ("fffffffffff(R\"x(\n"
10360             "multiline raw string literal xxxxxxxxxxxxxx\n"
10361             ")x\" + bbbbbb);",
10362             format("fffffffffff(R\"x(\n"
10363                    "multiline raw string literal xxxxxxxxxxxxxx\n"
10364                    ")x\" +   bbbbbb);",
10365                    getGoogleStyleWithColumns(20)));
10366   EXPECT_EQ("fffffffffff(\n"
10367             "    R\"x(\n"
10368             "multiline raw string literal xxxxxxxxxxxxxx\n"
10369             ")x\" +\n"
10370             "    bbbbbb);",
10371             format("fffffffffff(\n"
10372                    " R\"x(\n"
10373                    "multiline raw string literal xxxxxxxxxxxxxx\n"
10374                    ")x\" + bbbbbb);",
10375                    getGoogleStyleWithColumns(20)));
10376   EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);",
10377             format("fffffffffff(\n"
10378                    " R\"(single line raw string)\" + bbbbbb);"));
10379 }
10380 
10381 TEST_F(FormatTest, SkipsUnknownStringLiterals) {
10382   verifyFormat("string a = \"unterminated;");
10383   EXPECT_EQ("function(\"unterminated,\n"
10384             "         OtherParameter);",
10385             format("function(  \"unterminated,\n"
10386                    "    OtherParameter);"));
10387 }
10388 
10389 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
10390   FormatStyle Style = getLLVMStyle();
10391   Style.Standard = FormatStyle::LS_Cpp03;
10392   EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
10393             format("#define x(_a) printf(\"foo\"_a);", Style));
10394 }
10395 
10396 TEST_F(FormatTest, CppLexVersion) {
10397   FormatStyle Style = getLLVMStyle();
10398   // Formatting of x * y differs if x is a type.
10399   verifyFormat("void foo() { MACRO(a * b); }", Style);
10400   verifyFormat("void foo() { MACRO(int *b); }", Style);
10401 
10402   // LLVM style uses latest lexer.
10403   verifyFormat("void foo() { MACRO(char8_t *b); }", Style);
10404   Style.Standard = FormatStyle::LS_Cpp17;
10405   // But in c++17, char8_t isn't a keyword.
10406   verifyFormat("void foo() { MACRO(char8_t * b); }", Style);
10407 }
10408 
10409 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
10410 
10411 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
10412   EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
10413             "             \"ddeeefff\");",
10414             format("someFunction(\"aaabbbcccdddeeefff\");",
10415                    getLLVMStyleWithColumns(25)));
10416   EXPECT_EQ("someFunction1234567890(\n"
10417             "    \"aaabbbcccdddeeefff\");",
10418             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
10419                    getLLVMStyleWithColumns(26)));
10420   EXPECT_EQ("someFunction1234567890(\n"
10421             "    \"aaabbbcccdddeeeff\"\n"
10422             "    \"f\");",
10423             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
10424                    getLLVMStyleWithColumns(25)));
10425   EXPECT_EQ("someFunction1234567890(\n"
10426             "    \"aaabbbcccdddeeeff\"\n"
10427             "    \"f\");",
10428             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
10429                    getLLVMStyleWithColumns(24)));
10430   EXPECT_EQ("someFunction(\n"
10431             "    \"aaabbbcc ddde \"\n"
10432             "    \"efff\");",
10433             format("someFunction(\"aaabbbcc ddde efff\");",
10434                    getLLVMStyleWithColumns(25)));
10435   EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
10436             "             \"ddeeefff\");",
10437             format("someFunction(\"aaabbbccc ddeeefff\");",
10438                    getLLVMStyleWithColumns(25)));
10439   EXPECT_EQ("someFunction1234567890(\n"
10440             "    \"aaabb \"\n"
10441             "    \"cccdddeeefff\");",
10442             format("someFunction1234567890(\"aaabb cccdddeeefff\");",
10443                    getLLVMStyleWithColumns(25)));
10444   EXPECT_EQ("#define A          \\\n"
10445             "  string s =       \\\n"
10446             "      \"123456789\"  \\\n"
10447             "      \"0\";         \\\n"
10448             "  int i;",
10449             format("#define A string s = \"1234567890\"; int i;",
10450                    getLLVMStyleWithColumns(20)));
10451   EXPECT_EQ("someFunction(\n"
10452             "    \"aaabbbcc \"\n"
10453             "    \"dddeeefff\");",
10454             format("someFunction(\"aaabbbcc dddeeefff\");",
10455                    getLLVMStyleWithColumns(25)));
10456 }
10457 
10458 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
10459   EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
10460   EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
10461   EXPECT_EQ("\"test\"\n"
10462             "\"\\n\"",
10463             format("\"test\\n\"", getLLVMStyleWithColumns(7)));
10464   EXPECT_EQ("\"tes\\\\\"\n"
10465             "\"n\"",
10466             format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
10467   EXPECT_EQ("\"\\\\\\\\\"\n"
10468             "\"\\n\"",
10469             format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
10470   EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
10471   EXPECT_EQ("\"\\uff01\"\n"
10472             "\"test\"",
10473             format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
10474   EXPECT_EQ("\"\\Uff01ff02\"",
10475             format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
10476   EXPECT_EQ("\"\\x000000000001\"\n"
10477             "\"next\"",
10478             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
10479   EXPECT_EQ("\"\\x000000000001next\"",
10480             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
10481   EXPECT_EQ("\"\\x000000000001\"",
10482             format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
10483   EXPECT_EQ("\"test\"\n"
10484             "\"\\000000\"\n"
10485             "\"000001\"",
10486             format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
10487   EXPECT_EQ("\"test\\000\"\n"
10488             "\"00000000\"\n"
10489             "\"1\"",
10490             format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
10491 }
10492 
10493 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
10494   verifyFormat("void f() {\n"
10495                "  return g() {}\n"
10496                "  void h() {}");
10497   verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
10498                "g();\n"
10499                "}");
10500 }
10501 
10502 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
10503   verifyFormat(
10504       "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
10505 }
10506 
10507 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
10508   verifyFormat("class X {\n"
10509                "  void f() {\n"
10510                "  }\n"
10511                "};",
10512                getLLVMStyleWithColumns(12));
10513 }
10514 
10515 TEST_F(FormatTest, ConfigurableIndentWidth) {
10516   FormatStyle EightIndent = getLLVMStyleWithColumns(18);
10517   EightIndent.IndentWidth = 8;
10518   EightIndent.ContinuationIndentWidth = 8;
10519   verifyFormat("void f() {\n"
10520                "        someFunction();\n"
10521                "        if (true) {\n"
10522                "                f();\n"
10523                "        }\n"
10524                "}",
10525                EightIndent);
10526   verifyFormat("class X {\n"
10527                "        void f() {\n"
10528                "        }\n"
10529                "};",
10530                EightIndent);
10531   verifyFormat("int x[] = {\n"
10532                "        call(),\n"
10533                "        call()};",
10534                EightIndent);
10535 }
10536 
10537 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
10538   verifyFormat("double\n"
10539                "f();",
10540                getLLVMStyleWithColumns(8));
10541 }
10542 
10543 TEST_F(FormatTest, ConfigurableUseOfTab) {
10544   FormatStyle Tab = getLLVMStyleWithColumns(42);
10545   Tab.IndentWidth = 8;
10546   Tab.UseTab = FormatStyle::UT_Always;
10547   Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10548 
10549   EXPECT_EQ("if (aaaaaaaa && // q\n"
10550             "    bb)\t\t// w\n"
10551             "\t;",
10552             format("if (aaaaaaaa &&// q\n"
10553                    "bb)// w\n"
10554                    ";",
10555                    Tab));
10556   EXPECT_EQ("if (aaa && bbb) // w\n"
10557             "\t;",
10558             format("if(aaa&&bbb)// w\n"
10559                    ";",
10560                    Tab));
10561 
10562   verifyFormat("class X {\n"
10563                "\tvoid f() {\n"
10564                "\t\tsomeFunction(parameter1,\n"
10565                "\t\t\t     parameter2);\n"
10566                "\t}\n"
10567                "};",
10568                Tab);
10569   verifyFormat("#define A                        \\\n"
10570                "\tvoid f() {               \\\n"
10571                "\t\tsomeFunction(    \\\n"
10572                "\t\t    parameter1,  \\\n"
10573                "\t\t    parameter2); \\\n"
10574                "\t}",
10575                Tab);
10576   verifyFormat("int a;\t      // x\n"
10577                "int bbbbbbbb; // x\n",
10578                Tab);
10579 
10580   Tab.TabWidth = 4;
10581   Tab.IndentWidth = 8;
10582   verifyFormat("class TabWidth4Indent8 {\n"
10583                "\t\tvoid f() {\n"
10584                "\t\t\t\tsomeFunction(parameter1,\n"
10585                "\t\t\t\t\t\t\t parameter2);\n"
10586                "\t\t}\n"
10587                "};",
10588                Tab);
10589 
10590   Tab.TabWidth = 4;
10591   Tab.IndentWidth = 4;
10592   verifyFormat("class TabWidth4Indent4 {\n"
10593                "\tvoid f() {\n"
10594                "\t\tsomeFunction(parameter1,\n"
10595                "\t\t\t\t\t parameter2);\n"
10596                "\t}\n"
10597                "};",
10598                Tab);
10599 
10600   Tab.TabWidth = 8;
10601   Tab.IndentWidth = 4;
10602   verifyFormat("class TabWidth8Indent4 {\n"
10603                "    void f() {\n"
10604                "\tsomeFunction(parameter1,\n"
10605                "\t\t     parameter2);\n"
10606                "    }\n"
10607                "};",
10608                Tab);
10609 
10610   Tab.TabWidth = 8;
10611   Tab.IndentWidth = 8;
10612   EXPECT_EQ("/*\n"
10613             "\t      a\t\tcomment\n"
10614             "\t      in multiple lines\n"
10615             "       */",
10616             format("   /*\t \t \n"
10617                    " \t \t a\t\tcomment\t \t\n"
10618                    " \t \t in multiple lines\t\n"
10619                    " \t  */",
10620                    Tab));
10621 
10622   Tab.UseTab = FormatStyle::UT_ForIndentation;
10623   verifyFormat("{\n"
10624                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10625                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10626                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10627                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10628                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10629                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10630                "};",
10631                Tab);
10632   verifyFormat("enum AA {\n"
10633                "\ta1, // Force multiple lines\n"
10634                "\ta2,\n"
10635                "\ta3\n"
10636                "};",
10637                Tab);
10638   EXPECT_EQ("if (aaaaaaaa && // q\n"
10639             "    bb)         // w\n"
10640             "\t;",
10641             format("if (aaaaaaaa &&// q\n"
10642                    "bb)// w\n"
10643                    ";",
10644                    Tab));
10645   verifyFormat("class X {\n"
10646                "\tvoid f() {\n"
10647                "\t\tsomeFunction(parameter1,\n"
10648                "\t\t             parameter2);\n"
10649                "\t}\n"
10650                "};",
10651                Tab);
10652   verifyFormat("{\n"
10653                "\tQ(\n"
10654                "\t    {\n"
10655                "\t\t    int a;\n"
10656                "\t\t    someFunction(aaaaaaaa,\n"
10657                "\t\t                 bbbbbbb);\n"
10658                "\t    },\n"
10659                "\t    p);\n"
10660                "}",
10661                Tab);
10662   EXPECT_EQ("{\n"
10663             "\t/* aaaa\n"
10664             "\t   bbbb */\n"
10665             "}",
10666             format("{\n"
10667                    "/* aaaa\n"
10668                    "   bbbb */\n"
10669                    "}",
10670                    Tab));
10671   EXPECT_EQ("{\n"
10672             "\t/*\n"
10673             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10674             "\t  bbbbbbbbbbbbb\n"
10675             "\t*/\n"
10676             "}",
10677             format("{\n"
10678                    "/*\n"
10679                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10680                    "*/\n"
10681                    "}",
10682                    Tab));
10683   EXPECT_EQ("{\n"
10684             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10685             "\t// bbbbbbbbbbbbb\n"
10686             "}",
10687             format("{\n"
10688                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10689                    "}",
10690                    Tab));
10691   EXPECT_EQ("{\n"
10692             "\t/*\n"
10693             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10694             "\t  bbbbbbbbbbbbb\n"
10695             "\t*/\n"
10696             "}",
10697             format("{\n"
10698                    "\t/*\n"
10699                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10700                    "\t*/\n"
10701                    "}",
10702                    Tab));
10703   EXPECT_EQ("{\n"
10704             "\t/*\n"
10705             "\n"
10706             "\t*/\n"
10707             "}",
10708             format("{\n"
10709                    "\t/*\n"
10710                    "\n"
10711                    "\t*/\n"
10712                    "}",
10713                    Tab));
10714   EXPECT_EQ("{\n"
10715             "\t/*\n"
10716             " asdf\n"
10717             "\t*/\n"
10718             "}",
10719             format("{\n"
10720                    "\t/*\n"
10721                    " asdf\n"
10722                    "\t*/\n"
10723                    "}",
10724                    Tab));
10725 
10726   Tab.UseTab = FormatStyle::UT_Never;
10727   EXPECT_EQ("/*\n"
10728             "              a\t\tcomment\n"
10729             "              in multiple lines\n"
10730             "       */",
10731             format("   /*\t \t \n"
10732                    " \t \t a\t\tcomment\t \t\n"
10733                    " \t \t in multiple lines\t\n"
10734                    " \t  */",
10735                    Tab));
10736   EXPECT_EQ("/* some\n"
10737             "   comment */",
10738             format(" \t \t /* some\n"
10739                    " \t \t    comment */",
10740                    Tab));
10741   EXPECT_EQ("int a; /* some\n"
10742             "   comment */",
10743             format(" \t \t int a; /* some\n"
10744                    " \t \t    comment */",
10745                    Tab));
10746 
10747   EXPECT_EQ("int a; /* some\n"
10748             "comment */",
10749             format(" \t \t int\ta; /* some\n"
10750                    " \t \t    comment */",
10751                    Tab));
10752   EXPECT_EQ("f(\"\t\t\"); /* some\n"
10753             "    comment */",
10754             format(" \t \t f(\"\t\t\"); /* some\n"
10755                    " \t \t    comment */",
10756                    Tab));
10757   EXPECT_EQ("{\n"
10758             "        /*\n"
10759             "         * Comment\n"
10760             "         */\n"
10761             "        int i;\n"
10762             "}",
10763             format("{\n"
10764                    "\t/*\n"
10765                    "\t * Comment\n"
10766                    "\t */\n"
10767                    "\t int i;\n"
10768                    "}",
10769                    Tab));
10770 
10771   Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
10772   Tab.TabWidth = 8;
10773   Tab.IndentWidth = 8;
10774   EXPECT_EQ("if (aaaaaaaa && // q\n"
10775             "    bb)         // w\n"
10776             "\t;",
10777             format("if (aaaaaaaa &&// q\n"
10778                    "bb)// w\n"
10779                    ";",
10780                    Tab));
10781   EXPECT_EQ("if (aaa && bbb) // w\n"
10782             "\t;",
10783             format("if(aaa&&bbb)// w\n"
10784                    ";",
10785                    Tab));
10786   verifyFormat("class X {\n"
10787                "\tvoid f() {\n"
10788                "\t\tsomeFunction(parameter1,\n"
10789                "\t\t\t     parameter2);\n"
10790                "\t}\n"
10791                "};",
10792                Tab);
10793   verifyFormat("#define A                        \\\n"
10794                "\tvoid f() {               \\\n"
10795                "\t\tsomeFunction(    \\\n"
10796                "\t\t    parameter1,  \\\n"
10797                "\t\t    parameter2); \\\n"
10798                "\t}",
10799                Tab);
10800   Tab.TabWidth = 4;
10801   Tab.IndentWidth = 8;
10802   verifyFormat("class TabWidth4Indent8 {\n"
10803                "\t\tvoid f() {\n"
10804                "\t\t\t\tsomeFunction(parameter1,\n"
10805                "\t\t\t\t\t\t\t parameter2);\n"
10806                "\t\t}\n"
10807                "};",
10808                Tab);
10809   Tab.TabWidth = 4;
10810   Tab.IndentWidth = 4;
10811   verifyFormat("class TabWidth4Indent4 {\n"
10812                "\tvoid f() {\n"
10813                "\t\tsomeFunction(parameter1,\n"
10814                "\t\t\t\t\t parameter2);\n"
10815                "\t}\n"
10816                "};",
10817                Tab);
10818   Tab.TabWidth = 8;
10819   Tab.IndentWidth = 4;
10820   verifyFormat("class TabWidth8Indent4 {\n"
10821                "    void f() {\n"
10822                "\tsomeFunction(parameter1,\n"
10823                "\t\t     parameter2);\n"
10824                "    }\n"
10825                "};",
10826                Tab);
10827   Tab.TabWidth = 8;
10828   Tab.IndentWidth = 8;
10829   EXPECT_EQ("/*\n"
10830             "\t      a\t\tcomment\n"
10831             "\t      in multiple lines\n"
10832             "       */",
10833             format("   /*\t \t \n"
10834                    " \t \t a\t\tcomment\t \t\n"
10835                    " \t \t in multiple lines\t\n"
10836                    " \t  */",
10837                    Tab));
10838   verifyFormat("{\n"
10839                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10840                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10841                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10842                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10843                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10844                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10845                "};",
10846                Tab);
10847   verifyFormat("enum AA {\n"
10848                "\ta1, // Force multiple lines\n"
10849                "\ta2,\n"
10850                "\ta3\n"
10851                "};",
10852                Tab);
10853   EXPECT_EQ("if (aaaaaaaa && // q\n"
10854             "    bb)         // w\n"
10855             "\t;",
10856             format("if (aaaaaaaa &&// q\n"
10857                    "bb)// w\n"
10858                    ";",
10859                    Tab));
10860   verifyFormat("class X {\n"
10861                "\tvoid f() {\n"
10862                "\t\tsomeFunction(parameter1,\n"
10863                "\t\t\t     parameter2);\n"
10864                "\t}\n"
10865                "};",
10866                Tab);
10867   verifyFormat("{\n"
10868                "\tQ(\n"
10869                "\t    {\n"
10870                "\t\t    int a;\n"
10871                "\t\t    someFunction(aaaaaaaa,\n"
10872                "\t\t\t\t bbbbbbb);\n"
10873                "\t    },\n"
10874                "\t    p);\n"
10875                "}",
10876                Tab);
10877   EXPECT_EQ("{\n"
10878             "\t/* aaaa\n"
10879             "\t   bbbb */\n"
10880             "}",
10881             format("{\n"
10882                    "/* aaaa\n"
10883                    "   bbbb */\n"
10884                    "}",
10885                    Tab));
10886   EXPECT_EQ("{\n"
10887             "\t/*\n"
10888             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10889             "\t  bbbbbbbbbbbbb\n"
10890             "\t*/\n"
10891             "}",
10892             format("{\n"
10893                    "/*\n"
10894                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10895                    "*/\n"
10896                    "}",
10897                    Tab));
10898   EXPECT_EQ("{\n"
10899             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10900             "\t// bbbbbbbbbbbbb\n"
10901             "}",
10902             format("{\n"
10903                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10904                    "}",
10905                    Tab));
10906   EXPECT_EQ("{\n"
10907             "\t/*\n"
10908             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10909             "\t  bbbbbbbbbbbbb\n"
10910             "\t*/\n"
10911             "}",
10912             format("{\n"
10913                    "\t/*\n"
10914                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10915                    "\t*/\n"
10916                    "}",
10917                    Tab));
10918   EXPECT_EQ("{\n"
10919             "\t/*\n"
10920             "\n"
10921             "\t*/\n"
10922             "}",
10923             format("{\n"
10924                    "\t/*\n"
10925                    "\n"
10926                    "\t*/\n"
10927                    "}",
10928                    Tab));
10929   EXPECT_EQ("{\n"
10930             "\t/*\n"
10931             " asdf\n"
10932             "\t*/\n"
10933             "}",
10934             format("{\n"
10935                    "\t/*\n"
10936                    " asdf\n"
10937                    "\t*/\n"
10938                    "}",
10939                    Tab));
10940   EXPECT_EQ("/* some\n"
10941             "   comment */",
10942             format(" \t \t /* some\n"
10943                    " \t \t    comment */",
10944                    Tab));
10945   EXPECT_EQ("int a; /* some\n"
10946             "   comment */",
10947             format(" \t \t int a; /* some\n"
10948                    " \t \t    comment */",
10949                    Tab));
10950   EXPECT_EQ("int a; /* some\n"
10951             "comment */",
10952             format(" \t \t int\ta; /* some\n"
10953                    " \t \t    comment */",
10954                    Tab));
10955   EXPECT_EQ("f(\"\t\t\"); /* some\n"
10956             "    comment */",
10957             format(" \t \t f(\"\t\t\"); /* some\n"
10958                    " \t \t    comment */",
10959                    Tab));
10960   EXPECT_EQ("{\n"
10961             "\t/*\n"
10962             "\t * Comment\n"
10963             "\t */\n"
10964             "\tint i;\n"
10965             "}",
10966             format("{\n"
10967                    "\t/*\n"
10968                    "\t * Comment\n"
10969                    "\t */\n"
10970                    "\t int i;\n"
10971                    "}",
10972                    Tab));
10973   Tab.TabWidth = 2;
10974   Tab.IndentWidth = 2;
10975   EXPECT_EQ("{\n"
10976             "\t/* aaaa\n"
10977             "\t\t bbbb */\n"
10978             "}",
10979             format("{\n"
10980                    "/* aaaa\n"
10981                    "\t bbbb */\n"
10982                    "}",
10983                    Tab));
10984   EXPECT_EQ("{\n"
10985             "\t/*\n"
10986             "\t\taaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10987             "\t\tbbbbbbbbbbbbb\n"
10988             "\t*/\n"
10989             "}",
10990             format("{\n"
10991                    "/*\n"
10992                    "\taaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10993                    "*/\n"
10994                    "}",
10995                    Tab));
10996   Tab.AlignConsecutiveAssignments = true;
10997   Tab.AlignConsecutiveDeclarations = true;
10998   Tab.TabWidth = 4;
10999   Tab.IndentWidth = 4;
11000   verifyFormat("class Assign {\n"
11001                "\tvoid f() {\n"
11002                "\t\tint         x      = 123;\n"
11003                "\t\tint         random = 4;\n"
11004                "\t\tstd::string alphabet =\n"
11005                "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
11006                "\t}\n"
11007                "};",
11008                Tab);
11009 
11010   Tab.UseTab = FormatStyle::UT_AlignWithSpaces;
11011   Tab.TabWidth = 8;
11012   Tab.IndentWidth = 8;
11013   EXPECT_EQ("if (aaaaaaaa && // q\n"
11014             "    bb)         // w\n"
11015             "\t;",
11016             format("if (aaaaaaaa &&// q\n"
11017                    "bb)// w\n"
11018                    ";",
11019                    Tab));
11020   EXPECT_EQ("if (aaa && bbb) // w\n"
11021             "\t;",
11022             format("if(aaa&&bbb)// w\n"
11023                    ";",
11024                    Tab));
11025   verifyFormat("class X {\n"
11026                "\tvoid f() {\n"
11027                "\t\tsomeFunction(parameter1,\n"
11028                "\t\t             parameter2);\n"
11029                "\t}\n"
11030                "};",
11031                Tab);
11032   verifyFormat("#define A                        \\\n"
11033                "\tvoid f() {               \\\n"
11034                "\t\tsomeFunction(    \\\n"
11035                "\t\t    parameter1,  \\\n"
11036                "\t\t    parameter2); \\\n"
11037                "\t}",
11038                Tab);
11039   Tab.TabWidth = 4;
11040   Tab.IndentWidth = 8;
11041   verifyFormat("class TabWidth4Indent8 {\n"
11042                "\t\tvoid f() {\n"
11043                "\t\t\t\tsomeFunction(parameter1,\n"
11044                "\t\t\t\t             parameter2);\n"
11045                "\t\t}\n"
11046                "};",
11047                Tab);
11048   Tab.TabWidth = 4;
11049   Tab.IndentWidth = 4;
11050   verifyFormat("class TabWidth4Indent4 {\n"
11051                "\tvoid f() {\n"
11052                "\t\tsomeFunction(parameter1,\n"
11053                "\t\t             parameter2);\n"
11054                "\t}\n"
11055                "};",
11056                Tab);
11057   Tab.TabWidth = 8;
11058   Tab.IndentWidth = 4;
11059   verifyFormat("class TabWidth8Indent4 {\n"
11060                "    void f() {\n"
11061                "\tsomeFunction(parameter1,\n"
11062                "\t             parameter2);\n"
11063                "    }\n"
11064                "};",
11065                Tab);
11066   Tab.TabWidth = 8;
11067   Tab.IndentWidth = 8;
11068   EXPECT_EQ("/*\n"
11069             "              a\t\tcomment\n"
11070             "              in multiple lines\n"
11071             "       */",
11072             format("   /*\t \t \n"
11073                    " \t \t a\t\tcomment\t \t\n"
11074                    " \t \t in multiple lines\t\n"
11075                    " \t  */",
11076                    Tab));
11077   verifyFormat("{\n"
11078                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11079                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11080                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11081                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11082                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11083                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11084                "};",
11085                Tab);
11086   verifyFormat("enum AA {\n"
11087                "\ta1, // Force multiple lines\n"
11088                "\ta2,\n"
11089                "\ta3\n"
11090                "};",
11091                Tab);
11092   EXPECT_EQ("if (aaaaaaaa && // q\n"
11093             "    bb)         // w\n"
11094             "\t;",
11095             format("if (aaaaaaaa &&// q\n"
11096                    "bb)// w\n"
11097                    ";",
11098                    Tab));
11099   verifyFormat("class X {\n"
11100                "\tvoid f() {\n"
11101                "\t\tsomeFunction(parameter1,\n"
11102                "\t\t             parameter2);\n"
11103                "\t}\n"
11104                "};",
11105                Tab);
11106   verifyFormat("{\n"
11107                "\tQ(\n"
11108                "\t    {\n"
11109                "\t\t    int a;\n"
11110                "\t\t    someFunction(aaaaaaaa,\n"
11111                "\t\t                 bbbbbbb);\n"
11112                "\t    },\n"
11113                "\t    p);\n"
11114                "}",
11115                Tab);
11116   EXPECT_EQ("{\n"
11117             "\t/* aaaa\n"
11118             "\t   bbbb */\n"
11119             "}",
11120             format("{\n"
11121                    "/* aaaa\n"
11122                    "   bbbb */\n"
11123                    "}",
11124                    Tab));
11125   EXPECT_EQ("{\n"
11126             "\t/*\n"
11127             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
11128             "\t  bbbbbbbbbbbbb\n"
11129             "\t*/\n"
11130             "}",
11131             format("{\n"
11132                    "/*\n"
11133                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
11134                    "*/\n"
11135                    "}",
11136                    Tab));
11137   EXPECT_EQ("{\n"
11138             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
11139             "\t// bbbbbbbbbbbbb\n"
11140             "}",
11141             format("{\n"
11142                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
11143                    "}",
11144                    Tab));
11145   EXPECT_EQ("{\n"
11146             "\t/*\n"
11147             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
11148             "\t  bbbbbbbbbbbbb\n"
11149             "\t*/\n"
11150             "}",
11151             format("{\n"
11152                    "\t/*\n"
11153                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
11154                    "\t*/\n"
11155                    "}",
11156                    Tab));
11157   EXPECT_EQ("{\n"
11158             "\t/*\n"
11159             "\n"
11160             "\t*/\n"
11161             "}",
11162             format("{\n"
11163                    "\t/*\n"
11164                    "\n"
11165                    "\t*/\n"
11166                    "}",
11167                    Tab));
11168   EXPECT_EQ("{\n"
11169             "\t/*\n"
11170             " asdf\n"
11171             "\t*/\n"
11172             "}",
11173             format("{\n"
11174                    "\t/*\n"
11175                    " asdf\n"
11176                    "\t*/\n"
11177                    "}",
11178                    Tab));
11179   EXPECT_EQ("/* some\n"
11180             "   comment */",
11181             format(" \t \t /* some\n"
11182                    " \t \t    comment */",
11183                    Tab));
11184   EXPECT_EQ("int a; /* some\n"
11185             "   comment */",
11186             format(" \t \t int a; /* some\n"
11187                    " \t \t    comment */",
11188                    Tab));
11189   EXPECT_EQ("int a; /* some\n"
11190             "comment */",
11191             format(" \t \t int\ta; /* some\n"
11192                    " \t \t    comment */",
11193                    Tab));
11194   EXPECT_EQ("f(\"\t\t\"); /* some\n"
11195             "    comment */",
11196             format(" \t \t f(\"\t\t\"); /* some\n"
11197                    " \t \t    comment */",
11198                    Tab));
11199   EXPECT_EQ("{\n"
11200             "\t/*\n"
11201             "\t * Comment\n"
11202             "\t */\n"
11203             "\tint i;\n"
11204             "}",
11205             format("{\n"
11206                    "\t/*\n"
11207                    "\t * Comment\n"
11208                    "\t */\n"
11209                    "\t int i;\n"
11210                    "}",
11211                    Tab));
11212   Tab.TabWidth = 2;
11213   Tab.IndentWidth = 2;
11214   EXPECT_EQ("{\n"
11215             "\t/* aaaa\n"
11216             "\t   bbbb */\n"
11217             "}",
11218             format("{\n"
11219                    "/* aaaa\n"
11220                    "   bbbb */\n"
11221                    "}",
11222                    Tab));
11223   EXPECT_EQ("{\n"
11224             "\t/*\n"
11225             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
11226             "\t  bbbbbbbbbbbbb\n"
11227             "\t*/\n"
11228             "}",
11229             format("{\n"
11230                    "/*\n"
11231                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
11232                    "*/\n"
11233                    "}",
11234                    Tab));
11235   Tab.AlignConsecutiveAssignments = true;
11236   Tab.AlignConsecutiveDeclarations = true;
11237   Tab.TabWidth = 4;
11238   Tab.IndentWidth = 4;
11239   verifyFormat("class Assign {\n"
11240                "\tvoid f() {\n"
11241                "\t\tint         x      = 123;\n"
11242                "\t\tint         random = 4;\n"
11243                "\t\tstd::string alphabet =\n"
11244                "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
11245                "\t}\n"
11246                "};",
11247                Tab);
11248 }
11249 
11250 TEST_F(FormatTest, ZeroTabWidth) {
11251   FormatStyle Tab = getLLVMStyleWithColumns(42);
11252   Tab.IndentWidth = 8;
11253   Tab.UseTab = FormatStyle::UT_Never;
11254   Tab.TabWidth = 0;
11255   EXPECT_EQ("void a(){\n"
11256             "    // line starts with '\t'\n"
11257             "};",
11258             format("void a(){\n"
11259                    "\t// line starts with '\t'\n"
11260                    "};",
11261                    Tab));
11262 
11263   EXPECT_EQ("void a(){\n"
11264             "    // line starts with '\t'\n"
11265             "};",
11266             format("void a(){\n"
11267                    "\t\t// line starts with '\t'\n"
11268                    "};",
11269                    Tab));
11270 
11271   Tab.UseTab = FormatStyle::UT_ForIndentation;
11272   EXPECT_EQ("void a(){\n"
11273             "    // line starts with '\t'\n"
11274             "};",
11275             format("void a(){\n"
11276                    "\t// line starts with '\t'\n"
11277                    "};",
11278                    Tab));
11279 
11280   EXPECT_EQ("void a(){\n"
11281             "    // line starts with '\t'\n"
11282             "};",
11283             format("void a(){\n"
11284                    "\t\t// line starts with '\t'\n"
11285                    "};",
11286                    Tab));
11287 
11288   Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
11289   EXPECT_EQ("void a(){\n"
11290             "    // line starts with '\t'\n"
11291             "};",
11292             format("void a(){\n"
11293                    "\t// line starts with '\t'\n"
11294                    "};",
11295                    Tab));
11296 
11297   EXPECT_EQ("void a(){\n"
11298             "    // line starts with '\t'\n"
11299             "};",
11300             format("void a(){\n"
11301                    "\t\t// line starts with '\t'\n"
11302                    "};",
11303                    Tab));
11304 
11305   Tab.UseTab = FormatStyle::UT_AlignWithSpaces;
11306   EXPECT_EQ("void a(){\n"
11307             "    // line starts with '\t'\n"
11308             "};",
11309             format("void a(){\n"
11310                    "\t// line starts with '\t'\n"
11311                    "};",
11312                    Tab));
11313 
11314   EXPECT_EQ("void a(){\n"
11315             "    // line starts with '\t'\n"
11316             "};",
11317             format("void a(){\n"
11318                    "\t\t// line starts with '\t'\n"
11319                    "};",
11320                    Tab));
11321 
11322   Tab.UseTab = FormatStyle::UT_Always;
11323   EXPECT_EQ("void a(){\n"
11324             "// line starts with '\t'\n"
11325             "};",
11326             format("void a(){\n"
11327                    "\t// line starts with '\t'\n"
11328                    "};",
11329                    Tab));
11330 
11331   EXPECT_EQ("void a(){\n"
11332             "// line starts with '\t'\n"
11333             "};",
11334             format("void a(){\n"
11335                    "\t\t// line starts with '\t'\n"
11336                    "};",
11337                    Tab));
11338 }
11339 
11340 TEST_F(FormatTest, CalculatesOriginalColumn) {
11341   EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
11342             "q\"; /* some\n"
11343             "       comment */",
11344             format("  \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
11345                    "q\"; /* some\n"
11346                    "       comment */",
11347                    getLLVMStyle()));
11348   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
11349             "/* some\n"
11350             "   comment */",
11351             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
11352                    " /* some\n"
11353                    "    comment */",
11354                    getLLVMStyle()));
11355   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
11356             "qqq\n"
11357             "/* some\n"
11358             "   comment */",
11359             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
11360                    "qqq\n"
11361                    " /* some\n"
11362                    "    comment */",
11363                    getLLVMStyle()));
11364   EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
11365             "wwww; /* some\n"
11366             "         comment */",
11367             format("  inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
11368                    "wwww; /* some\n"
11369                    "         comment */",
11370                    getLLVMStyle()));
11371 }
11372 
11373 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
11374   FormatStyle NoSpace = getLLVMStyle();
11375   NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
11376 
11377   verifyFormat("while(true)\n"
11378                "  continue;",
11379                NoSpace);
11380   verifyFormat("for(;;)\n"
11381                "  continue;",
11382                NoSpace);
11383   verifyFormat("if(true)\n"
11384                "  f();\n"
11385                "else if(true)\n"
11386                "  f();",
11387                NoSpace);
11388   verifyFormat("do {\n"
11389                "  do_something();\n"
11390                "} while(something());",
11391                NoSpace);
11392   verifyFormat("switch(x) {\n"
11393                "default:\n"
11394                "  break;\n"
11395                "}",
11396                NoSpace);
11397   verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
11398   verifyFormat("size_t x = sizeof(x);", NoSpace);
11399   verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
11400   verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
11401   verifyFormat("alignas(128) char a[128];", NoSpace);
11402   verifyFormat("size_t x = alignof(MyType);", NoSpace);
11403   verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
11404   verifyFormat("int f() throw(Deprecated);", NoSpace);
11405   verifyFormat("typedef void (*cb)(int);", NoSpace);
11406   verifyFormat("T A::operator()();", NoSpace);
11407   verifyFormat("X A::operator++(T);", NoSpace);
11408   verifyFormat("auto lambda = []() { return 0; };", NoSpace);
11409 
11410   FormatStyle Space = getLLVMStyle();
11411   Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
11412 
11413   verifyFormat("int f ();", Space);
11414   verifyFormat("void f (int a, T b) {\n"
11415                "  while (true)\n"
11416                "    continue;\n"
11417                "}",
11418                Space);
11419   verifyFormat("if (true)\n"
11420                "  f ();\n"
11421                "else if (true)\n"
11422                "  f ();",
11423                Space);
11424   verifyFormat("do {\n"
11425                "  do_something ();\n"
11426                "} while (something ());",
11427                Space);
11428   verifyFormat("switch (x) {\n"
11429                "default:\n"
11430                "  break;\n"
11431                "}",
11432                Space);
11433   verifyFormat("A::A () : a (1) {}", Space);
11434   verifyFormat("void f () __attribute__ ((asdf));", Space);
11435   verifyFormat("*(&a + 1);\n"
11436                "&((&a)[1]);\n"
11437                "a[(b + c) * d];\n"
11438                "(((a + 1) * 2) + 3) * 4;",
11439                Space);
11440   verifyFormat("#define A(x) x", Space);
11441   verifyFormat("#define A (x) x", Space);
11442   verifyFormat("#if defined(x)\n"
11443                "#endif",
11444                Space);
11445   verifyFormat("auto i = std::make_unique<int> (5);", Space);
11446   verifyFormat("size_t x = sizeof (x);", Space);
11447   verifyFormat("auto f (int x) -> decltype (x);", Space);
11448   verifyFormat("int f (T x) noexcept (x.create ());", Space);
11449   verifyFormat("alignas (128) char a[128];", Space);
11450   verifyFormat("size_t x = alignof (MyType);", Space);
11451   verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
11452   verifyFormat("int f () throw (Deprecated);", Space);
11453   verifyFormat("typedef void (*cb) (int);", Space);
11454   verifyFormat("T A::operator() ();", Space);
11455   verifyFormat("X A::operator++ (T);", Space);
11456   verifyFormat("auto lambda = [] () { return 0; };", Space);
11457   verifyFormat("int x = int (y);", Space);
11458 
11459   FormatStyle SomeSpace = getLLVMStyle();
11460   SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses;
11461 
11462   verifyFormat("[]() -> float {}", SomeSpace);
11463   verifyFormat("[] (auto foo) {}", SomeSpace);
11464   verifyFormat("[foo]() -> int {}", SomeSpace);
11465   verifyFormat("int f();", SomeSpace);
11466   verifyFormat("void f (int a, T b) {\n"
11467                "  while (true)\n"
11468                "    continue;\n"
11469                "}",
11470                SomeSpace);
11471   verifyFormat("if (true)\n"
11472                "  f();\n"
11473                "else if (true)\n"
11474                "  f();",
11475                SomeSpace);
11476   verifyFormat("do {\n"
11477                "  do_something();\n"
11478                "} while (something());",
11479                SomeSpace);
11480   verifyFormat("switch (x) {\n"
11481                "default:\n"
11482                "  break;\n"
11483                "}",
11484                SomeSpace);
11485   verifyFormat("A::A() : a (1) {}", SomeSpace);
11486   verifyFormat("void f() __attribute__ ((asdf));", SomeSpace);
11487   verifyFormat("*(&a + 1);\n"
11488                "&((&a)[1]);\n"
11489                "a[(b + c) * d];\n"
11490                "(((a + 1) * 2) + 3) * 4;",
11491                SomeSpace);
11492   verifyFormat("#define A(x) x", SomeSpace);
11493   verifyFormat("#define A (x) x", SomeSpace);
11494   verifyFormat("#if defined(x)\n"
11495                "#endif",
11496                SomeSpace);
11497   verifyFormat("auto i = std::make_unique<int> (5);", SomeSpace);
11498   verifyFormat("size_t x = sizeof (x);", SomeSpace);
11499   verifyFormat("auto f (int x) -> decltype (x);", SomeSpace);
11500   verifyFormat("int f (T x) noexcept (x.create());", SomeSpace);
11501   verifyFormat("alignas (128) char a[128];", SomeSpace);
11502   verifyFormat("size_t x = alignof (MyType);", SomeSpace);
11503   verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");",
11504                SomeSpace);
11505   verifyFormat("int f() throw (Deprecated);", SomeSpace);
11506   verifyFormat("typedef void (*cb) (int);", SomeSpace);
11507   verifyFormat("T A::operator()();", SomeSpace);
11508   verifyFormat("X A::operator++ (T);", SomeSpace);
11509   verifyFormat("int x = int (y);", SomeSpace);
11510   verifyFormat("auto lambda = []() { return 0; };", SomeSpace);
11511 }
11512 
11513 TEST_F(FormatTest, SpaceAfterLogicalNot) {
11514   FormatStyle Spaces = getLLVMStyle();
11515   Spaces.SpaceAfterLogicalNot = true;
11516 
11517   verifyFormat("bool x = ! y", Spaces);
11518   verifyFormat("if (! isFailure())", Spaces);
11519   verifyFormat("if (! (a && b))", Spaces);
11520   verifyFormat("\"Error!\"", Spaces);
11521   verifyFormat("! ! x", Spaces);
11522 }
11523 
11524 TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
11525   FormatStyle Spaces = getLLVMStyle();
11526 
11527   Spaces.SpacesInParentheses = true;
11528   verifyFormat("do_something( ::globalVar );", Spaces);
11529   verifyFormat("call( x, y, z );", Spaces);
11530   verifyFormat("call();", Spaces);
11531   verifyFormat("std::function<void( int, int )> callback;", Spaces);
11532   verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
11533                Spaces);
11534   verifyFormat("while ( (bool)1 )\n"
11535                "  continue;",
11536                Spaces);
11537   verifyFormat("for ( ;; )\n"
11538                "  continue;",
11539                Spaces);
11540   verifyFormat("if ( true )\n"
11541                "  f();\n"
11542                "else if ( true )\n"
11543                "  f();",
11544                Spaces);
11545   verifyFormat("do {\n"
11546                "  do_something( (int)i );\n"
11547                "} while ( something() );",
11548                Spaces);
11549   verifyFormat("switch ( x ) {\n"
11550                "default:\n"
11551                "  break;\n"
11552                "}",
11553                Spaces);
11554 
11555   Spaces.SpacesInParentheses = false;
11556   Spaces.SpacesInCStyleCastParentheses = true;
11557   verifyFormat("Type *A = ( Type * )P;", Spaces);
11558   verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
11559   verifyFormat("x = ( int32 )y;", Spaces);
11560   verifyFormat("int a = ( int )(2.0f);", Spaces);
11561   verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
11562   verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
11563   verifyFormat("#define x (( int )-1)", Spaces);
11564 
11565   // Run the first set of tests again with:
11566   Spaces.SpacesInParentheses = false;
11567   Spaces.SpaceInEmptyParentheses = true;
11568   Spaces.SpacesInCStyleCastParentheses = true;
11569   verifyFormat("call(x, y, z);", Spaces);
11570   verifyFormat("call( );", Spaces);
11571   verifyFormat("std::function<void(int, int)> callback;", Spaces);
11572   verifyFormat("while (( bool )1)\n"
11573                "  continue;",
11574                Spaces);
11575   verifyFormat("for (;;)\n"
11576                "  continue;",
11577                Spaces);
11578   verifyFormat("if (true)\n"
11579                "  f( );\n"
11580                "else if (true)\n"
11581                "  f( );",
11582                Spaces);
11583   verifyFormat("do {\n"
11584                "  do_something(( int )i);\n"
11585                "} while (something( ));",
11586                Spaces);
11587   verifyFormat("switch (x) {\n"
11588                "default:\n"
11589                "  break;\n"
11590                "}",
11591                Spaces);
11592 
11593   // Run the first set of tests again with:
11594   Spaces.SpaceAfterCStyleCast = true;
11595   verifyFormat("call(x, y, z);", Spaces);
11596   verifyFormat("call( );", Spaces);
11597   verifyFormat("std::function<void(int, int)> callback;", Spaces);
11598   verifyFormat("while (( bool ) 1)\n"
11599                "  continue;",
11600                Spaces);
11601   verifyFormat("for (;;)\n"
11602                "  continue;",
11603                Spaces);
11604   verifyFormat("if (true)\n"
11605                "  f( );\n"
11606                "else if (true)\n"
11607                "  f( );",
11608                Spaces);
11609   verifyFormat("do {\n"
11610                "  do_something(( int ) i);\n"
11611                "} while (something( ));",
11612                Spaces);
11613   verifyFormat("switch (x) {\n"
11614                "default:\n"
11615                "  break;\n"
11616                "}",
11617                Spaces);
11618 
11619   // Run subset of tests again with:
11620   Spaces.SpacesInCStyleCastParentheses = false;
11621   Spaces.SpaceAfterCStyleCast = true;
11622   verifyFormat("while ((bool) 1)\n"
11623                "  continue;",
11624                Spaces);
11625   verifyFormat("do {\n"
11626                "  do_something((int) i);\n"
11627                "} while (something( ));",
11628                Spaces);
11629 }
11630 
11631 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
11632   verifyFormat("int a[5];");
11633   verifyFormat("a[3] += 42;");
11634 
11635   FormatStyle Spaces = getLLVMStyle();
11636   Spaces.SpacesInSquareBrackets = true;
11637   // Not lambdas.
11638   verifyFormat("int a[ 5 ];", Spaces);
11639   verifyFormat("a[ 3 ] += 42;", Spaces);
11640   verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
11641   verifyFormat("double &operator[](int i) { return 0; }\n"
11642                "int i;",
11643                Spaces);
11644   verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
11645   verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
11646   verifyFormat("int i = (*b)[ a ]->f();", Spaces);
11647   // Lambdas.
11648   verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
11649   verifyFormat("return [ i, args... ] {};", Spaces);
11650   verifyFormat("int foo = [ &bar ]() {};", Spaces);
11651   verifyFormat("int foo = [ = ]() {};", Spaces);
11652   verifyFormat("int foo = [ & ]() {};", Spaces);
11653   verifyFormat("int foo = [ =, &bar ]() {};", Spaces);
11654   verifyFormat("int foo = [ &bar, = ]() {};", Spaces);
11655 }
11656 
11657 TEST_F(FormatTest, ConfigurableSpaceBeforeBrackets) {
11658   FormatStyle NoSpaceStyle = getLLVMStyle();
11659   verifyFormat("int a[5];", NoSpaceStyle);
11660   verifyFormat("a[3] += 42;", NoSpaceStyle);
11661 
11662   verifyFormat("int a[1];", NoSpaceStyle);
11663   verifyFormat("int 1 [a];", NoSpaceStyle);
11664   verifyFormat("int a[1][2];", NoSpaceStyle);
11665   verifyFormat("a[7] = 5;", NoSpaceStyle);
11666   verifyFormat("int a = (f())[23];", NoSpaceStyle);
11667   verifyFormat("f([] {})", NoSpaceStyle);
11668 
11669   FormatStyle Space = getLLVMStyle();
11670   Space.SpaceBeforeSquareBrackets = true;
11671   verifyFormat("int c = []() -> int { return 2; }();\n", Space);
11672   verifyFormat("return [i, args...] {};", Space);
11673 
11674   verifyFormat("int a [5];", Space);
11675   verifyFormat("a [3] += 42;", Space);
11676   verifyFormat("constexpr char hello []{\"hello\"};", Space);
11677   verifyFormat("double &operator[](int i) { return 0; }\n"
11678                "int i;",
11679                Space);
11680   verifyFormat("std::unique_ptr<int []> foo() {}", Space);
11681   verifyFormat("int i = a [a][a]->f();", Space);
11682   verifyFormat("int i = (*b) [a]->f();", Space);
11683 
11684   verifyFormat("int a [1];", Space);
11685   verifyFormat("int 1 [a];", Space);
11686   verifyFormat("int a [1][2];", Space);
11687   verifyFormat("a [7] = 5;", Space);
11688   verifyFormat("int a = (f()) [23];", Space);
11689   verifyFormat("f([] {})", Space);
11690 }
11691 
11692 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
11693   verifyFormat("int a = 5;");
11694   verifyFormat("a += 42;");
11695   verifyFormat("a or_eq 8;");
11696 
11697   FormatStyle Spaces = getLLVMStyle();
11698   Spaces.SpaceBeforeAssignmentOperators = false;
11699   verifyFormat("int a= 5;", Spaces);
11700   verifyFormat("a+= 42;", Spaces);
11701   verifyFormat("a or_eq 8;", Spaces);
11702 }
11703 
11704 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
11705   verifyFormat("class Foo : public Bar {};");
11706   verifyFormat("Foo::Foo() : foo(1) {}");
11707   verifyFormat("for (auto a : b) {\n}");
11708   verifyFormat("int x = a ? b : c;");
11709   verifyFormat("{\n"
11710                "label0:\n"
11711                "  int x = 0;\n"
11712                "}");
11713   verifyFormat("switch (x) {\n"
11714                "case 1:\n"
11715                "default:\n"
11716                "}");
11717 
11718   FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30);
11719   CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false;
11720   verifyFormat("class Foo : public Bar {};", CtorInitializerStyle);
11721   verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle);
11722   verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle);
11723   verifyFormat("int x = a ? b : c;", CtorInitializerStyle);
11724   verifyFormat("{\n"
11725                "label1:\n"
11726                "  int x = 0;\n"
11727                "}",
11728                CtorInitializerStyle);
11729   verifyFormat("switch (x) {\n"
11730                "case 1:\n"
11731                "default:\n"
11732                "}",
11733                CtorInitializerStyle);
11734   CtorInitializerStyle.BreakConstructorInitializers =
11735       FormatStyle::BCIS_AfterColon;
11736   verifyFormat("Fooooooooooo::Fooooooooooo():\n"
11737                "    aaaaaaaaaaaaaaaa(1),\n"
11738                "    bbbbbbbbbbbbbbbb(2) {}",
11739                CtorInitializerStyle);
11740   CtorInitializerStyle.BreakConstructorInitializers =
11741       FormatStyle::BCIS_BeforeComma;
11742   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
11743                "    : aaaaaaaaaaaaaaaa(1)\n"
11744                "    , bbbbbbbbbbbbbbbb(2) {}",
11745                CtorInitializerStyle);
11746   CtorInitializerStyle.BreakConstructorInitializers =
11747       FormatStyle::BCIS_BeforeColon;
11748   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
11749                "    : aaaaaaaaaaaaaaaa(1),\n"
11750                "      bbbbbbbbbbbbbbbb(2) {}",
11751                CtorInitializerStyle);
11752   CtorInitializerStyle.ConstructorInitializerIndentWidth = 0;
11753   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
11754                ": aaaaaaaaaaaaaaaa(1),\n"
11755                "  bbbbbbbbbbbbbbbb(2) {}",
11756                CtorInitializerStyle);
11757 
11758   FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30);
11759   InheritanceStyle.SpaceBeforeInheritanceColon = false;
11760   verifyFormat("class Foo: public Bar {};", InheritanceStyle);
11761   verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle);
11762   verifyFormat("for (auto a : b) {\n}", InheritanceStyle);
11763   verifyFormat("int x = a ? b : c;", InheritanceStyle);
11764   verifyFormat("{\n"
11765                "label2:\n"
11766                "  int x = 0;\n"
11767                "}",
11768                InheritanceStyle);
11769   verifyFormat("switch (x) {\n"
11770                "case 1:\n"
11771                "default:\n"
11772                "}",
11773                InheritanceStyle);
11774   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon;
11775   verifyFormat("class Foooooooooooooooooooooo:\n"
11776                "    public aaaaaaaaaaaaaaaaaa,\n"
11777                "    public bbbbbbbbbbbbbbbbbb {\n"
11778                "}",
11779                InheritanceStyle);
11780   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
11781   verifyFormat("class Foooooooooooooooooooooo\n"
11782                "    : public aaaaaaaaaaaaaaaaaa\n"
11783                "    , public bbbbbbbbbbbbbbbbbb {\n"
11784                "}",
11785                InheritanceStyle);
11786   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
11787   verifyFormat("class Foooooooooooooooooooooo\n"
11788                "    : public aaaaaaaaaaaaaaaaaa,\n"
11789                "      public bbbbbbbbbbbbbbbbbb {\n"
11790                "}",
11791                InheritanceStyle);
11792   InheritanceStyle.ConstructorInitializerIndentWidth = 0;
11793   verifyFormat("class Foooooooooooooooooooooo\n"
11794                ": public aaaaaaaaaaaaaaaaaa,\n"
11795                "  public bbbbbbbbbbbbbbbbbb {}",
11796                InheritanceStyle);
11797 
11798   FormatStyle ForLoopStyle = getLLVMStyle();
11799   ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false;
11800   verifyFormat("class Foo : public Bar {};", ForLoopStyle);
11801   verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle);
11802   verifyFormat("for (auto a: b) {\n}", ForLoopStyle);
11803   verifyFormat("int x = a ? b : c;", ForLoopStyle);
11804   verifyFormat("{\n"
11805                "label2:\n"
11806                "  int x = 0;\n"
11807                "}",
11808                ForLoopStyle);
11809   verifyFormat("switch (x) {\n"
11810                "case 1:\n"
11811                "default:\n"
11812                "}",
11813                ForLoopStyle);
11814 
11815   FormatStyle NoSpaceStyle = getLLVMStyle();
11816   NoSpaceStyle.SpaceBeforeCtorInitializerColon = false;
11817   NoSpaceStyle.SpaceBeforeInheritanceColon = false;
11818   NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false;
11819   verifyFormat("class Foo: public Bar {};", NoSpaceStyle);
11820   verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle);
11821   verifyFormat("for (auto a: b) {\n}", NoSpaceStyle);
11822   verifyFormat("int x = a ? b : c;", NoSpaceStyle);
11823   verifyFormat("{\n"
11824                "label3:\n"
11825                "  int x = 0;\n"
11826                "}",
11827                NoSpaceStyle);
11828   verifyFormat("switch (x) {\n"
11829                "case 1:\n"
11830                "default:\n"
11831                "}",
11832                NoSpaceStyle);
11833 }
11834 
11835 TEST_F(FormatTest, AlignConsecutiveMacros) {
11836   FormatStyle Style = getLLVMStyle();
11837   Style.AlignConsecutiveAssignments = true;
11838   Style.AlignConsecutiveDeclarations = true;
11839   Style.AlignConsecutiveMacros = false;
11840 
11841   verifyFormat("#define a 3\n"
11842                "#define bbbb 4\n"
11843                "#define ccc (5)",
11844                Style);
11845 
11846   verifyFormat("#define f(x) (x * x)\n"
11847                "#define fff(x, y, z) (x * y + z)\n"
11848                "#define ffff(x, y) (x - y)",
11849                Style);
11850 
11851   verifyFormat("#define foo(x, y) (x + y)\n"
11852                "#define bar (5, 6)(2 + 2)",
11853                Style);
11854 
11855   verifyFormat("#define a 3\n"
11856                "#define bbbb 4\n"
11857                "#define ccc (5)\n"
11858                "#define f(x) (x * x)\n"
11859                "#define fff(x, y, z) (x * y + z)\n"
11860                "#define ffff(x, y) (x - y)",
11861                Style);
11862 
11863   Style.AlignConsecutiveMacros = true;
11864   verifyFormat("#define a    3\n"
11865                "#define bbbb 4\n"
11866                "#define ccc  (5)",
11867                Style);
11868 
11869   verifyFormat("#define f(x)         (x * x)\n"
11870                "#define fff(x, y, z) (x * y + z)\n"
11871                "#define ffff(x, y)   (x - y)",
11872                Style);
11873 
11874   verifyFormat("#define foo(x, y) (x + y)\n"
11875                "#define bar       (5, 6)(2 + 2)",
11876                Style);
11877 
11878   verifyFormat("#define a            3\n"
11879                "#define bbbb         4\n"
11880                "#define ccc          (5)\n"
11881                "#define f(x)         (x * x)\n"
11882                "#define fff(x, y, z) (x * y + z)\n"
11883                "#define ffff(x, y)   (x - y)",
11884                Style);
11885 
11886   verifyFormat("#define a         5\n"
11887                "#define foo(x, y) (x + y)\n"
11888                "#define CCC       (6)\n"
11889                "auto lambda = []() {\n"
11890                "  auto  ii = 0;\n"
11891                "  float j  = 0;\n"
11892                "  return 0;\n"
11893                "};\n"
11894                "int   i  = 0;\n"
11895                "float i2 = 0;\n"
11896                "auto  v  = type{\n"
11897                "    i = 1,   //\n"
11898                "    (i = 2), //\n"
11899                "    i = 3    //\n"
11900                "};",
11901                Style);
11902 
11903   Style.AlignConsecutiveMacros = false;
11904   Style.ColumnLimit = 20;
11905 
11906   verifyFormat("#define a          \\\n"
11907                "  \"aabbbbbbbbbbbb\"\n"
11908                "#define D          \\\n"
11909                "  \"aabbbbbbbbbbbb\" \\\n"
11910                "  \"ccddeeeeeeeee\"\n"
11911                "#define B          \\\n"
11912                "  \"QQQQQQQQQQQQQ\"  \\\n"
11913                "  \"FFFFFFFFFFFFF\"  \\\n"
11914                "  \"LLLLLLLL\"\n",
11915                Style);
11916 
11917   Style.AlignConsecutiveMacros = true;
11918   verifyFormat("#define a          \\\n"
11919                "  \"aabbbbbbbbbbbb\"\n"
11920                "#define D          \\\n"
11921                "  \"aabbbbbbbbbbbb\" \\\n"
11922                "  \"ccddeeeeeeeee\"\n"
11923                "#define B          \\\n"
11924                "  \"QQQQQQQQQQQQQ\"  \\\n"
11925                "  \"FFFFFFFFFFFFF\"  \\\n"
11926                "  \"LLLLLLLL\"\n",
11927                Style);
11928 }
11929 
11930 TEST_F(FormatTest, AlignConsecutiveAssignments) {
11931   FormatStyle Alignment = getLLVMStyle();
11932   Alignment.AlignConsecutiveMacros = true;
11933   Alignment.AlignConsecutiveAssignments = false;
11934   verifyFormat("int a = 5;\n"
11935                "int oneTwoThree = 123;",
11936                Alignment);
11937   verifyFormat("int a = 5;\n"
11938                "int oneTwoThree = 123;",
11939                Alignment);
11940 
11941   Alignment.AlignConsecutiveAssignments = true;
11942   verifyFormat("int a           = 5;\n"
11943                "int oneTwoThree = 123;",
11944                Alignment);
11945   verifyFormat("int a           = method();\n"
11946                "int oneTwoThree = 133;",
11947                Alignment);
11948   verifyFormat("a &= 5;\n"
11949                "bcd *= 5;\n"
11950                "ghtyf += 5;\n"
11951                "dvfvdb -= 5;\n"
11952                "a /= 5;\n"
11953                "vdsvsv %= 5;\n"
11954                "sfdbddfbdfbb ^= 5;\n"
11955                "dvsdsv |= 5;\n"
11956                "int dsvvdvsdvvv = 123;",
11957                Alignment);
11958   verifyFormat("int i = 1, j = 10;\n"
11959                "something = 2000;",
11960                Alignment);
11961   verifyFormat("something = 2000;\n"
11962                "int i = 1, j = 10;\n",
11963                Alignment);
11964   verifyFormat("something = 2000;\n"
11965                "another   = 911;\n"
11966                "int i = 1, j = 10;\n"
11967                "oneMore = 1;\n"
11968                "i       = 2;",
11969                Alignment);
11970   verifyFormat("int a   = 5;\n"
11971                "int one = 1;\n"
11972                "method();\n"
11973                "int oneTwoThree = 123;\n"
11974                "int oneTwo      = 12;",
11975                Alignment);
11976   verifyFormat("int oneTwoThree = 123;\n"
11977                "int oneTwo      = 12;\n"
11978                "method();\n",
11979                Alignment);
11980   verifyFormat("int oneTwoThree = 123; // comment\n"
11981                "int oneTwo      = 12;  // comment",
11982                Alignment);
11983 
11984   // Bug 25167
11985   verifyFormat("#if A\n"
11986                "#else\n"
11987                "int aaaaaaaa = 12;\n"
11988                "#endif\n"
11989                "#if B\n"
11990                "#else\n"
11991                "int a = 12;\n"
11992                "#endif\n",
11993                Alignment);
11994   verifyFormat("enum foo {\n"
11995                "#if A\n"
11996                "#else\n"
11997                "  aaaaaaaa = 12;\n"
11998                "#endif\n"
11999                "#if B\n"
12000                "#else\n"
12001                "  a = 12;\n"
12002                "#endif\n"
12003                "};\n",
12004                Alignment);
12005 
12006   EXPECT_EQ("int a = 5;\n"
12007             "\n"
12008             "int oneTwoThree = 123;",
12009             format("int a       = 5;\n"
12010                    "\n"
12011                    "int oneTwoThree= 123;",
12012                    Alignment));
12013   EXPECT_EQ("int a   = 5;\n"
12014             "int one = 1;\n"
12015             "\n"
12016             "int oneTwoThree = 123;",
12017             format("int a = 5;\n"
12018                    "int one = 1;\n"
12019                    "\n"
12020                    "int oneTwoThree = 123;",
12021                    Alignment));
12022   EXPECT_EQ("int a   = 5;\n"
12023             "int one = 1;\n"
12024             "\n"
12025             "int oneTwoThree = 123;\n"
12026             "int oneTwo      = 12;",
12027             format("int a = 5;\n"
12028                    "int one = 1;\n"
12029                    "\n"
12030                    "int oneTwoThree = 123;\n"
12031                    "int oneTwo = 12;",
12032                    Alignment));
12033   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
12034   verifyFormat("#define A \\\n"
12035                "  int aaaa       = 12; \\\n"
12036                "  int b          = 23; \\\n"
12037                "  int ccc        = 234; \\\n"
12038                "  int dddddddddd = 2345;",
12039                Alignment);
12040   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
12041   verifyFormat("#define A               \\\n"
12042                "  int aaaa       = 12;  \\\n"
12043                "  int b          = 23;  \\\n"
12044                "  int ccc        = 234; \\\n"
12045                "  int dddddddddd = 2345;",
12046                Alignment);
12047   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
12048   verifyFormat("#define A                                                      "
12049                "                \\\n"
12050                "  int aaaa       = 12;                                         "
12051                "                \\\n"
12052                "  int b          = 23;                                         "
12053                "                \\\n"
12054                "  int ccc        = 234;                                        "
12055                "                \\\n"
12056                "  int dddddddddd = 2345;",
12057                Alignment);
12058   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
12059                "k = 4, int l = 5,\n"
12060                "                  int m = 6) {\n"
12061                "  int j      = 10;\n"
12062                "  otherThing = 1;\n"
12063                "}",
12064                Alignment);
12065   verifyFormat("void SomeFunction(int parameter = 0) {\n"
12066                "  int i   = 1;\n"
12067                "  int j   = 2;\n"
12068                "  int big = 10000;\n"
12069                "}",
12070                Alignment);
12071   verifyFormat("class C {\n"
12072                "public:\n"
12073                "  int i            = 1;\n"
12074                "  virtual void f() = 0;\n"
12075                "};",
12076                Alignment);
12077   verifyFormat("int i = 1;\n"
12078                "if (SomeType t = getSomething()) {\n"
12079                "}\n"
12080                "int j   = 2;\n"
12081                "int big = 10000;",
12082                Alignment);
12083   verifyFormat("int j = 7;\n"
12084                "for (int k = 0; k < N; ++k) {\n"
12085                "}\n"
12086                "int j   = 2;\n"
12087                "int big = 10000;\n"
12088                "}",
12089                Alignment);
12090   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
12091   verifyFormat("int i = 1;\n"
12092                "LooooooooooongType loooooooooooooooooooooongVariable\n"
12093                "    = someLooooooooooooooooongFunction();\n"
12094                "int j = 2;",
12095                Alignment);
12096   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
12097   verifyFormat("int i = 1;\n"
12098                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
12099                "    someLooooooooooooooooongFunction();\n"
12100                "int j = 2;",
12101                Alignment);
12102 
12103   verifyFormat("auto lambda = []() {\n"
12104                "  auto i = 0;\n"
12105                "  return 0;\n"
12106                "};\n"
12107                "int i  = 0;\n"
12108                "auto v = type{\n"
12109                "    i = 1,   //\n"
12110                "    (i = 2), //\n"
12111                "    i = 3    //\n"
12112                "};",
12113                Alignment);
12114 
12115   verifyFormat(
12116       "int i      = 1;\n"
12117       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
12118       "                          loooooooooooooooooooooongParameterB);\n"
12119       "int j      = 2;",
12120       Alignment);
12121 
12122   verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
12123                "          typename B   = very_long_type_name_1,\n"
12124                "          typename T_2 = very_long_type_name_2>\n"
12125                "auto foo() {}\n",
12126                Alignment);
12127   verifyFormat("int a, b = 1;\n"
12128                "int c  = 2;\n"
12129                "int dd = 3;\n",
12130                Alignment);
12131   verifyFormat("int aa       = ((1 > 2) ? 3 : 4);\n"
12132                "float b[1][] = {{3.f}};\n",
12133                Alignment);
12134   verifyFormat("for (int i = 0; i < 1; i++)\n"
12135                "  int x = 1;\n",
12136                Alignment);
12137   verifyFormat("for (i = 0; i < 1; i++)\n"
12138                "  x = 1;\n"
12139                "y = 1;\n",
12140                Alignment);
12141 
12142   Alignment.ReflowComments = true;
12143   Alignment.ColumnLimit = 50;
12144   EXPECT_EQ("int x   = 0;\n"
12145             "int yy  = 1; /// specificlennospace\n"
12146             "int zzz = 2;\n",
12147             format("int x   = 0;\n"
12148                    "int yy  = 1; ///specificlennospace\n"
12149                    "int zzz = 2;\n",
12150                    Alignment));
12151 }
12152 
12153 TEST_F(FormatTest, AlignConsecutiveBitFields) {
12154   FormatStyle Alignment = getLLVMStyle();
12155   Alignment.AlignConsecutiveBitFields = true;
12156   verifyFormat("int const a     : 5;\n"
12157                "int oneTwoThree : 23;",
12158                Alignment);
12159 
12160   // Initializers are allowed starting with c++2a
12161   verifyFormat("int const a     : 5 = 1;\n"
12162                "int oneTwoThree : 23 = 0;",
12163                Alignment);
12164 
12165   Alignment.AlignConsecutiveDeclarations = true;
12166   verifyFormat("int const a           : 5;\n"
12167                "int       oneTwoThree : 23;",
12168                Alignment);
12169 
12170   verifyFormat("int const a           : 5;  // comment\n"
12171                "int       oneTwoThree : 23; // comment",
12172                Alignment);
12173 
12174   verifyFormat("int const a           : 5 = 1;\n"
12175                "int       oneTwoThree : 23 = 0;",
12176                Alignment);
12177 
12178   Alignment.AlignConsecutiveAssignments = true;
12179   verifyFormat("int const a           : 5  = 1;\n"
12180                "int       oneTwoThree : 23 = 0;",
12181                Alignment);
12182   verifyFormat("int const a           : 5  = {1};\n"
12183                "int       oneTwoThree : 23 = 0;",
12184                Alignment);
12185 
12186   Alignment.BitFieldColonSpacing = FormatStyle::BFCS_None;
12187   verifyFormat("int const a          :5;\n"
12188                "int       oneTwoThree:23;",
12189                Alignment);
12190 
12191   Alignment.BitFieldColonSpacing = FormatStyle::BFCS_Before;
12192   verifyFormat("int const a           :5;\n"
12193                "int       oneTwoThree :23;",
12194                Alignment);
12195 
12196   Alignment.BitFieldColonSpacing = FormatStyle::BFCS_After;
12197   verifyFormat("int const a          : 5;\n"
12198                "int       oneTwoThree: 23;",
12199                Alignment);
12200 
12201   // Known limitations: ':' is only recognized as a bitfield colon when
12202   // followed by a number.
12203   /*
12204   verifyFormat("int oneTwoThree : SOME_CONSTANT;\n"
12205                "int a           : 5;",
12206                Alignment);
12207   */
12208 }
12209 
12210 TEST_F(FormatTest, AlignConsecutiveDeclarations) {
12211   FormatStyle Alignment = getLLVMStyle();
12212   Alignment.AlignConsecutiveMacros = true;
12213   Alignment.AlignConsecutiveDeclarations = false;
12214   verifyFormat("float const a = 5;\n"
12215                "int oneTwoThree = 123;",
12216                Alignment);
12217   verifyFormat("int a = 5;\n"
12218                "float const oneTwoThree = 123;",
12219                Alignment);
12220 
12221   Alignment.AlignConsecutiveDeclarations = true;
12222   verifyFormat("float const a = 5;\n"
12223                "int         oneTwoThree = 123;",
12224                Alignment);
12225   verifyFormat("int         a = method();\n"
12226                "float const oneTwoThree = 133;",
12227                Alignment);
12228   verifyFormat("int i = 1, j = 10;\n"
12229                "something = 2000;",
12230                Alignment);
12231   verifyFormat("something = 2000;\n"
12232                "int i = 1, j = 10;\n",
12233                Alignment);
12234   verifyFormat("float      something = 2000;\n"
12235                "double     another = 911;\n"
12236                "int        i = 1, j = 10;\n"
12237                "const int *oneMore = 1;\n"
12238                "unsigned   i = 2;",
12239                Alignment);
12240   verifyFormat("float a = 5;\n"
12241                "int   one = 1;\n"
12242                "method();\n"
12243                "const double       oneTwoThree = 123;\n"
12244                "const unsigned int oneTwo = 12;",
12245                Alignment);
12246   verifyFormat("int      oneTwoThree{0}; // comment\n"
12247                "unsigned oneTwo;         // comment",
12248                Alignment);
12249   EXPECT_EQ("float const a = 5;\n"
12250             "\n"
12251             "int oneTwoThree = 123;",
12252             format("float const   a = 5;\n"
12253                    "\n"
12254                    "int           oneTwoThree= 123;",
12255                    Alignment));
12256   EXPECT_EQ("float a = 5;\n"
12257             "int   one = 1;\n"
12258             "\n"
12259             "unsigned oneTwoThree = 123;",
12260             format("float    a = 5;\n"
12261                    "int      one = 1;\n"
12262                    "\n"
12263                    "unsigned oneTwoThree = 123;",
12264                    Alignment));
12265   EXPECT_EQ("float a = 5;\n"
12266             "int   one = 1;\n"
12267             "\n"
12268             "unsigned oneTwoThree = 123;\n"
12269             "int      oneTwo = 12;",
12270             format("float    a = 5;\n"
12271                    "int one = 1;\n"
12272                    "\n"
12273                    "unsigned oneTwoThree = 123;\n"
12274                    "int oneTwo = 12;",
12275                    Alignment));
12276   // Function prototype alignment
12277   verifyFormat("int    a();\n"
12278                "double b();",
12279                Alignment);
12280   verifyFormat("int    a(int x);\n"
12281                "double b();",
12282                Alignment);
12283   unsigned OldColumnLimit = Alignment.ColumnLimit;
12284   // We need to set ColumnLimit to zero, in order to stress nested alignments,
12285   // otherwise the function parameters will be re-flowed onto a single line.
12286   Alignment.ColumnLimit = 0;
12287   EXPECT_EQ("int    a(int   x,\n"
12288             "         float y);\n"
12289             "double b(int    x,\n"
12290             "         double y);",
12291             format("int a(int x,\n"
12292                    " float y);\n"
12293                    "double b(int x,\n"
12294                    " double y);",
12295                    Alignment));
12296   // This ensures that function parameters of function declarations are
12297   // correctly indented when their owning functions are indented.
12298   // The failure case here is for 'double y' to not be indented enough.
12299   EXPECT_EQ("double a(int x);\n"
12300             "int    b(int    y,\n"
12301             "         double z);",
12302             format("double a(int x);\n"
12303                    "int b(int y,\n"
12304                    " double z);",
12305                    Alignment));
12306   // Set ColumnLimit low so that we induce wrapping immediately after
12307   // the function name and opening paren.
12308   Alignment.ColumnLimit = 13;
12309   verifyFormat("int function(\n"
12310                "    int  x,\n"
12311                "    bool y);",
12312                Alignment);
12313   Alignment.ColumnLimit = OldColumnLimit;
12314   // Ensure function pointers don't screw up recursive alignment
12315   verifyFormat("int    a(int x, void (*fp)(int y));\n"
12316                "double b();",
12317                Alignment);
12318   Alignment.AlignConsecutiveAssignments = true;
12319   // Ensure recursive alignment is broken by function braces, so that the
12320   // "a = 1" does not align with subsequent assignments inside the function
12321   // body.
12322   verifyFormat("int func(int a = 1) {\n"
12323                "  int b  = 2;\n"
12324                "  int cc = 3;\n"
12325                "}",
12326                Alignment);
12327   verifyFormat("float      something = 2000;\n"
12328                "double     another   = 911;\n"
12329                "int        i = 1, j = 10;\n"
12330                "const int *oneMore = 1;\n"
12331                "unsigned   i       = 2;",
12332                Alignment);
12333   verifyFormat("int      oneTwoThree = {0}; // comment\n"
12334                "unsigned oneTwo      = 0;   // comment",
12335                Alignment);
12336   // Make sure that scope is correctly tracked, in the absence of braces
12337   verifyFormat("for (int i = 0; i < n; i++)\n"
12338                "  j = i;\n"
12339                "double x = 1;\n",
12340                Alignment);
12341   verifyFormat("if (int i = 0)\n"
12342                "  j = i;\n"
12343                "double x = 1;\n",
12344                Alignment);
12345   // Ensure operator[] and operator() are comprehended
12346   verifyFormat("struct test {\n"
12347                "  long long int foo();\n"
12348                "  int           operator[](int a);\n"
12349                "  double        bar();\n"
12350                "};\n",
12351                Alignment);
12352   verifyFormat("struct test {\n"
12353                "  long long int foo();\n"
12354                "  int           operator()(int a);\n"
12355                "  double        bar();\n"
12356                "};\n",
12357                Alignment);
12358   EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
12359             "  int const i   = 1;\n"
12360             "  int *     j   = 2;\n"
12361             "  int       big = 10000;\n"
12362             "\n"
12363             "  unsigned oneTwoThree = 123;\n"
12364             "  int      oneTwo      = 12;\n"
12365             "  method();\n"
12366             "  float k  = 2;\n"
12367             "  int   ll = 10000;\n"
12368             "}",
12369             format("void SomeFunction(int parameter= 0) {\n"
12370                    " int const  i= 1;\n"
12371                    "  int *j=2;\n"
12372                    " int big  =  10000;\n"
12373                    "\n"
12374                    "unsigned oneTwoThree  =123;\n"
12375                    "int oneTwo = 12;\n"
12376                    "  method();\n"
12377                    "float k= 2;\n"
12378                    "int ll=10000;\n"
12379                    "}",
12380                    Alignment));
12381   Alignment.AlignConsecutiveAssignments = false;
12382   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
12383   verifyFormat("#define A \\\n"
12384                "  int       aaaa = 12; \\\n"
12385                "  float     b = 23; \\\n"
12386                "  const int ccc = 234; \\\n"
12387                "  unsigned  dddddddddd = 2345;",
12388                Alignment);
12389   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
12390   verifyFormat("#define A              \\\n"
12391                "  int       aaaa = 12; \\\n"
12392                "  float     b = 23;    \\\n"
12393                "  const int ccc = 234; \\\n"
12394                "  unsigned  dddddddddd = 2345;",
12395                Alignment);
12396   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
12397   Alignment.ColumnLimit = 30;
12398   verifyFormat("#define A                    \\\n"
12399                "  int       aaaa = 12;       \\\n"
12400                "  float     b = 23;          \\\n"
12401                "  const int ccc = 234;       \\\n"
12402                "  int       dddddddddd = 2345;",
12403                Alignment);
12404   Alignment.ColumnLimit = 80;
12405   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
12406                "k = 4, int l = 5,\n"
12407                "                  int m = 6) {\n"
12408                "  const int j = 10;\n"
12409                "  otherThing = 1;\n"
12410                "}",
12411                Alignment);
12412   verifyFormat("void SomeFunction(int parameter = 0) {\n"
12413                "  int const i = 1;\n"
12414                "  int *     j = 2;\n"
12415                "  int       big = 10000;\n"
12416                "}",
12417                Alignment);
12418   verifyFormat("class C {\n"
12419                "public:\n"
12420                "  int          i = 1;\n"
12421                "  virtual void f() = 0;\n"
12422                "};",
12423                Alignment);
12424   verifyFormat("float i = 1;\n"
12425                "if (SomeType t = getSomething()) {\n"
12426                "}\n"
12427                "const unsigned j = 2;\n"
12428                "int            big = 10000;",
12429                Alignment);
12430   verifyFormat("float j = 7;\n"
12431                "for (int k = 0; k < N; ++k) {\n"
12432                "}\n"
12433                "unsigned j = 2;\n"
12434                "int      big = 10000;\n"
12435                "}",
12436                Alignment);
12437   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
12438   verifyFormat("float              i = 1;\n"
12439                "LooooooooooongType loooooooooooooooooooooongVariable\n"
12440                "    = someLooooooooooooooooongFunction();\n"
12441                "int j = 2;",
12442                Alignment);
12443   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
12444   verifyFormat("int                i = 1;\n"
12445                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
12446                "    someLooooooooooooooooongFunction();\n"
12447                "int j = 2;",
12448                Alignment);
12449 
12450   Alignment.AlignConsecutiveAssignments = true;
12451   verifyFormat("auto lambda = []() {\n"
12452                "  auto  ii = 0;\n"
12453                "  float j  = 0;\n"
12454                "  return 0;\n"
12455                "};\n"
12456                "int   i  = 0;\n"
12457                "float i2 = 0;\n"
12458                "auto  v  = type{\n"
12459                "    i = 1,   //\n"
12460                "    (i = 2), //\n"
12461                "    i = 3    //\n"
12462                "};",
12463                Alignment);
12464   Alignment.AlignConsecutiveAssignments = false;
12465 
12466   verifyFormat(
12467       "int      i = 1;\n"
12468       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
12469       "                          loooooooooooooooooooooongParameterB);\n"
12470       "int      j = 2;",
12471       Alignment);
12472 
12473   // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
12474   // We expect declarations and assignments to align, as long as it doesn't
12475   // exceed the column limit, starting a new alignment sequence whenever it
12476   // happens.
12477   Alignment.AlignConsecutiveAssignments = true;
12478   Alignment.ColumnLimit = 30;
12479   verifyFormat("float    ii              = 1;\n"
12480                "unsigned j               = 2;\n"
12481                "int someVerylongVariable = 1;\n"
12482                "AnotherLongType  ll = 123456;\n"
12483                "VeryVeryLongType k  = 2;\n"
12484                "int              myvar = 1;",
12485                Alignment);
12486   Alignment.ColumnLimit = 80;
12487   Alignment.AlignConsecutiveAssignments = false;
12488 
12489   verifyFormat(
12490       "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
12491       "          typename LongType, typename B>\n"
12492       "auto foo() {}\n",
12493       Alignment);
12494   verifyFormat("float a, b = 1;\n"
12495                "int   c = 2;\n"
12496                "int   dd = 3;\n",
12497                Alignment);
12498   verifyFormat("int   aa = ((1 > 2) ? 3 : 4);\n"
12499                "float b[1][] = {{3.f}};\n",
12500                Alignment);
12501   Alignment.AlignConsecutiveAssignments = true;
12502   verifyFormat("float a, b = 1;\n"
12503                "int   c  = 2;\n"
12504                "int   dd = 3;\n",
12505                Alignment);
12506   verifyFormat("int   aa     = ((1 > 2) ? 3 : 4);\n"
12507                "float b[1][] = {{3.f}};\n",
12508                Alignment);
12509   Alignment.AlignConsecutiveAssignments = false;
12510 
12511   Alignment.ColumnLimit = 30;
12512   Alignment.BinPackParameters = false;
12513   verifyFormat("void foo(float     a,\n"
12514                "         float     b,\n"
12515                "         int       c,\n"
12516                "         uint32_t *d) {\n"
12517                "  int *  e = 0;\n"
12518                "  float  f = 0;\n"
12519                "  double g = 0;\n"
12520                "}\n"
12521                "void bar(ino_t     a,\n"
12522                "         int       b,\n"
12523                "         uint32_t *c,\n"
12524                "         bool      d) {}\n",
12525                Alignment);
12526   Alignment.BinPackParameters = true;
12527   Alignment.ColumnLimit = 80;
12528 
12529   // Bug 33507
12530   Alignment.PointerAlignment = FormatStyle::PAS_Middle;
12531   verifyFormat(
12532       "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
12533       "  static const Version verVs2017;\n"
12534       "  return true;\n"
12535       "});\n",
12536       Alignment);
12537   Alignment.PointerAlignment = FormatStyle::PAS_Right;
12538 
12539   // See llvm.org/PR35641
12540   Alignment.AlignConsecutiveDeclarations = true;
12541   verifyFormat("int func() { //\n"
12542                "  int      b;\n"
12543                "  unsigned c;\n"
12544                "}",
12545                Alignment);
12546 
12547   // See PR37175
12548   FormatStyle Style = getMozillaStyle();
12549   Style.AlignConsecutiveDeclarations = true;
12550   EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n"
12551             "foo(int a);",
12552             format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style));
12553 }
12554 
12555 TEST_F(FormatTest, LinuxBraceBreaking) {
12556   FormatStyle LinuxBraceStyle = getLLVMStyle();
12557   LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
12558   verifyFormat("namespace a\n"
12559                "{\n"
12560                "class A\n"
12561                "{\n"
12562                "  void f()\n"
12563                "  {\n"
12564                "    if (true) {\n"
12565                "      a();\n"
12566                "      b();\n"
12567                "    } else {\n"
12568                "      a();\n"
12569                "    }\n"
12570                "  }\n"
12571                "  void g() { return; }\n"
12572                "};\n"
12573                "struct B {\n"
12574                "  int x;\n"
12575                "};\n"
12576                "} // namespace a\n",
12577                LinuxBraceStyle);
12578   verifyFormat("enum X {\n"
12579                "  Y = 0,\n"
12580                "}\n",
12581                LinuxBraceStyle);
12582   verifyFormat("struct S {\n"
12583                "  int Type;\n"
12584                "  union {\n"
12585                "    int x;\n"
12586                "    double y;\n"
12587                "  } Value;\n"
12588                "  class C\n"
12589                "  {\n"
12590                "    MyFavoriteType Value;\n"
12591                "  } Class;\n"
12592                "}\n",
12593                LinuxBraceStyle);
12594 }
12595 
12596 TEST_F(FormatTest, MozillaBraceBreaking) {
12597   FormatStyle MozillaBraceStyle = getLLVMStyle();
12598   MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
12599   MozillaBraceStyle.FixNamespaceComments = false;
12600   verifyFormat("namespace a {\n"
12601                "class A\n"
12602                "{\n"
12603                "  void f()\n"
12604                "  {\n"
12605                "    if (true) {\n"
12606                "      a();\n"
12607                "      b();\n"
12608                "    }\n"
12609                "  }\n"
12610                "  void g() { return; }\n"
12611                "};\n"
12612                "enum E\n"
12613                "{\n"
12614                "  A,\n"
12615                "  // foo\n"
12616                "  B,\n"
12617                "  C\n"
12618                "};\n"
12619                "struct B\n"
12620                "{\n"
12621                "  int x;\n"
12622                "};\n"
12623                "}\n",
12624                MozillaBraceStyle);
12625   verifyFormat("struct S\n"
12626                "{\n"
12627                "  int Type;\n"
12628                "  union\n"
12629                "  {\n"
12630                "    int x;\n"
12631                "    double y;\n"
12632                "  } Value;\n"
12633                "  class C\n"
12634                "  {\n"
12635                "    MyFavoriteType Value;\n"
12636                "  } Class;\n"
12637                "}\n",
12638                MozillaBraceStyle);
12639 }
12640 
12641 TEST_F(FormatTest, StroustrupBraceBreaking) {
12642   FormatStyle StroustrupBraceStyle = getLLVMStyle();
12643   StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
12644   verifyFormat("namespace a {\n"
12645                "class A {\n"
12646                "  void f()\n"
12647                "  {\n"
12648                "    if (true) {\n"
12649                "      a();\n"
12650                "      b();\n"
12651                "    }\n"
12652                "  }\n"
12653                "  void g() { return; }\n"
12654                "};\n"
12655                "struct B {\n"
12656                "  int x;\n"
12657                "};\n"
12658                "} // namespace a\n",
12659                StroustrupBraceStyle);
12660 
12661   verifyFormat("void foo()\n"
12662                "{\n"
12663                "  if (a) {\n"
12664                "    a();\n"
12665                "  }\n"
12666                "  else {\n"
12667                "    b();\n"
12668                "  }\n"
12669                "}\n",
12670                StroustrupBraceStyle);
12671 
12672   verifyFormat("#ifdef _DEBUG\n"
12673                "int foo(int i = 0)\n"
12674                "#else\n"
12675                "int foo(int i = 5)\n"
12676                "#endif\n"
12677                "{\n"
12678                "  return i;\n"
12679                "}",
12680                StroustrupBraceStyle);
12681 
12682   verifyFormat("void foo() {}\n"
12683                "void bar()\n"
12684                "#ifdef _DEBUG\n"
12685                "{\n"
12686                "  foo();\n"
12687                "}\n"
12688                "#else\n"
12689                "{\n"
12690                "}\n"
12691                "#endif",
12692                StroustrupBraceStyle);
12693 
12694   verifyFormat("void foobar() { int i = 5; }\n"
12695                "#ifdef _DEBUG\n"
12696                "void bar() {}\n"
12697                "#else\n"
12698                "void bar() { foobar(); }\n"
12699                "#endif",
12700                StroustrupBraceStyle);
12701 }
12702 
12703 TEST_F(FormatTest, AllmanBraceBreaking) {
12704   FormatStyle AllmanBraceStyle = getLLVMStyle();
12705   AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
12706 
12707   EXPECT_EQ("namespace a\n"
12708             "{\n"
12709             "void f();\n"
12710             "void g();\n"
12711             "} // namespace a\n",
12712             format("namespace a\n"
12713                    "{\n"
12714                    "void f();\n"
12715                    "void g();\n"
12716                    "}\n",
12717                    AllmanBraceStyle));
12718 
12719   verifyFormat("namespace a\n"
12720                "{\n"
12721                "class A\n"
12722                "{\n"
12723                "  void f()\n"
12724                "  {\n"
12725                "    if (true)\n"
12726                "    {\n"
12727                "      a();\n"
12728                "      b();\n"
12729                "    }\n"
12730                "  }\n"
12731                "  void g() { return; }\n"
12732                "};\n"
12733                "struct B\n"
12734                "{\n"
12735                "  int x;\n"
12736                "};\n"
12737                "union C\n"
12738                "{\n"
12739                "};\n"
12740                "} // namespace a",
12741                AllmanBraceStyle);
12742 
12743   verifyFormat("void f()\n"
12744                "{\n"
12745                "  if (true)\n"
12746                "  {\n"
12747                "    a();\n"
12748                "  }\n"
12749                "  else if (false)\n"
12750                "  {\n"
12751                "    b();\n"
12752                "  }\n"
12753                "  else\n"
12754                "  {\n"
12755                "    c();\n"
12756                "  }\n"
12757                "}\n",
12758                AllmanBraceStyle);
12759 
12760   verifyFormat("void f()\n"
12761                "{\n"
12762                "  for (int i = 0; i < 10; ++i)\n"
12763                "  {\n"
12764                "    a();\n"
12765                "  }\n"
12766                "  while (false)\n"
12767                "  {\n"
12768                "    b();\n"
12769                "  }\n"
12770                "  do\n"
12771                "  {\n"
12772                "    c();\n"
12773                "  } while (false)\n"
12774                "}\n",
12775                AllmanBraceStyle);
12776 
12777   verifyFormat("void f(int a)\n"
12778                "{\n"
12779                "  switch (a)\n"
12780                "  {\n"
12781                "  case 0:\n"
12782                "    break;\n"
12783                "  case 1:\n"
12784                "  {\n"
12785                "    break;\n"
12786                "  }\n"
12787                "  case 2:\n"
12788                "  {\n"
12789                "  }\n"
12790                "  break;\n"
12791                "  default:\n"
12792                "    break;\n"
12793                "  }\n"
12794                "}\n",
12795                AllmanBraceStyle);
12796 
12797   verifyFormat("enum X\n"
12798                "{\n"
12799                "  Y = 0,\n"
12800                "}\n",
12801                AllmanBraceStyle);
12802   verifyFormat("enum X\n"
12803                "{\n"
12804                "  Y = 0\n"
12805                "}\n",
12806                AllmanBraceStyle);
12807 
12808   verifyFormat("@interface BSApplicationController ()\n"
12809                "{\n"
12810                "@private\n"
12811                "  id _extraIvar;\n"
12812                "}\n"
12813                "@end\n",
12814                AllmanBraceStyle);
12815 
12816   verifyFormat("#ifdef _DEBUG\n"
12817                "int foo(int i = 0)\n"
12818                "#else\n"
12819                "int foo(int i = 5)\n"
12820                "#endif\n"
12821                "{\n"
12822                "  return i;\n"
12823                "}",
12824                AllmanBraceStyle);
12825 
12826   verifyFormat("void foo() {}\n"
12827                "void bar()\n"
12828                "#ifdef _DEBUG\n"
12829                "{\n"
12830                "  foo();\n"
12831                "}\n"
12832                "#else\n"
12833                "{\n"
12834                "}\n"
12835                "#endif",
12836                AllmanBraceStyle);
12837 
12838   verifyFormat("void foobar() { int i = 5; }\n"
12839                "#ifdef _DEBUG\n"
12840                "void bar() {}\n"
12841                "#else\n"
12842                "void bar() { foobar(); }\n"
12843                "#endif",
12844                AllmanBraceStyle);
12845 
12846   // This shouldn't affect ObjC blocks..
12847   verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
12848                "  // ...\n"
12849                "  int i;\n"
12850                "}];",
12851                AllmanBraceStyle);
12852   verifyFormat("void (^block)(void) = ^{\n"
12853                "  // ...\n"
12854                "  int i;\n"
12855                "};",
12856                AllmanBraceStyle);
12857   // .. or dict literals.
12858   verifyFormat("void f()\n"
12859                "{\n"
12860                "  // ...\n"
12861                "  [object someMethod:@{@\"a\" : @\"b\"}];\n"
12862                "}",
12863                AllmanBraceStyle);
12864   verifyFormat("void f()\n"
12865                "{\n"
12866                "  // ...\n"
12867                "  [object someMethod:@{a : @\"b\"}];\n"
12868                "}",
12869                AllmanBraceStyle);
12870   verifyFormat("int f()\n"
12871                "{ // comment\n"
12872                "  return 42;\n"
12873                "}",
12874                AllmanBraceStyle);
12875 
12876   AllmanBraceStyle.ColumnLimit = 19;
12877   verifyFormat("void f() { int i; }", AllmanBraceStyle);
12878   AllmanBraceStyle.ColumnLimit = 18;
12879   verifyFormat("void f()\n"
12880                "{\n"
12881                "  int i;\n"
12882                "}",
12883                AllmanBraceStyle);
12884   AllmanBraceStyle.ColumnLimit = 80;
12885 
12886   FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
12887   BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine =
12888       FormatStyle::SIS_WithoutElse;
12889   BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
12890   verifyFormat("void f(bool b)\n"
12891                "{\n"
12892                "  if (b)\n"
12893                "  {\n"
12894                "    return;\n"
12895                "  }\n"
12896                "}\n",
12897                BreakBeforeBraceShortIfs);
12898   verifyFormat("void f(bool b)\n"
12899                "{\n"
12900                "  if constexpr (b)\n"
12901                "  {\n"
12902                "    return;\n"
12903                "  }\n"
12904                "}\n",
12905                BreakBeforeBraceShortIfs);
12906   verifyFormat("void f(bool b)\n"
12907                "{\n"
12908                "  if CONSTEXPR (b)\n"
12909                "  {\n"
12910                "    return;\n"
12911                "  }\n"
12912                "}\n",
12913                BreakBeforeBraceShortIfs);
12914   verifyFormat("void f(bool b)\n"
12915                "{\n"
12916                "  if (b) return;\n"
12917                "}\n",
12918                BreakBeforeBraceShortIfs);
12919   verifyFormat("void f(bool b)\n"
12920                "{\n"
12921                "  if constexpr (b) return;\n"
12922                "}\n",
12923                BreakBeforeBraceShortIfs);
12924   verifyFormat("void f(bool b)\n"
12925                "{\n"
12926                "  if CONSTEXPR (b) return;\n"
12927                "}\n",
12928                BreakBeforeBraceShortIfs);
12929   verifyFormat("void f(bool b)\n"
12930                "{\n"
12931                "  while (b)\n"
12932                "  {\n"
12933                "    return;\n"
12934                "  }\n"
12935                "}\n",
12936                BreakBeforeBraceShortIfs);
12937 }
12938 
12939 TEST_F(FormatTest, WhitesmithsBraceBreaking) {
12940   FormatStyle WhitesmithsBraceStyle = getLLVMStyle();
12941   WhitesmithsBraceStyle.BreakBeforeBraces = FormatStyle::BS_Whitesmiths;
12942 
12943   // Make a few changes to the style for testing purposes
12944   WhitesmithsBraceStyle.AllowShortFunctionsOnASingleLine =
12945       FormatStyle::SFS_Empty;
12946   WhitesmithsBraceStyle.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None;
12947   WhitesmithsBraceStyle.ColumnLimit = 0;
12948 
12949   // FIXME: this test case can't decide whether there should be a blank line
12950   // after the ~D() line or not. It adds one if one doesn't exist in the test
12951   // and it removes the line if one exists.
12952   /*
12953   verifyFormat("class A;\n"
12954                "namespace B\n"
12955                "  {\n"
12956                "class C;\n"
12957                "// Comment\n"
12958                "class D\n"
12959                "  {\n"
12960                "public:\n"
12961                "  D();\n"
12962                "  ~D() {}\n"
12963                "private:\n"
12964                "  enum E\n"
12965                "    {\n"
12966                "    F\n"
12967                "    }\n"
12968                "  };\n"
12969                "  } // namespace B\n",
12970                WhitesmithsBraceStyle);
12971   */
12972 
12973   verifyFormat("namespace a\n"
12974                "  {\n"
12975                "class A\n"
12976                "  {\n"
12977                "  void f()\n"
12978                "    {\n"
12979                "    if (true)\n"
12980                "      {\n"
12981                "      a();\n"
12982                "      b();\n"
12983                "      }\n"
12984                "    }\n"
12985                "  void g()\n"
12986                "    {\n"
12987                "    return;\n"
12988                "    }\n"
12989                "  };\n"
12990                "struct B\n"
12991                "  {\n"
12992                "  int x;\n"
12993                "  };\n"
12994                "  } // namespace a",
12995                WhitesmithsBraceStyle);
12996 
12997   verifyFormat("void f()\n"
12998                "  {\n"
12999                "  if (true)\n"
13000                "    {\n"
13001                "    a();\n"
13002                "    }\n"
13003                "  else if (false)\n"
13004                "    {\n"
13005                "    b();\n"
13006                "    }\n"
13007                "  else\n"
13008                "    {\n"
13009                "    c();\n"
13010                "    }\n"
13011                "  }\n",
13012                WhitesmithsBraceStyle);
13013 
13014   verifyFormat("void f()\n"
13015                "  {\n"
13016                "  for (int i = 0; i < 10; ++i)\n"
13017                "    {\n"
13018                "    a();\n"
13019                "    }\n"
13020                "  while (false)\n"
13021                "    {\n"
13022                "    b();\n"
13023                "    }\n"
13024                "  do\n"
13025                "    {\n"
13026                "    c();\n"
13027                "    } while (false)\n"
13028                "  }\n",
13029                WhitesmithsBraceStyle);
13030 
13031   WhitesmithsBraceStyle.IndentCaseBlocks = true;
13032   verifyFormat("void switchTest1(int a)\n"
13033                "  {\n"
13034                "  switch (a)\n"
13035                "    {\n"
13036                "    case 2:\n"
13037                "      {\n"
13038                "      }\n"
13039                "    break;\n"
13040                "    }\n"
13041                "  }\n",
13042                WhitesmithsBraceStyle);
13043 
13044   verifyFormat("void switchTest2(int a)\n"
13045                "  {\n"
13046                "  switch (a)\n"
13047                "    {\n"
13048                "    case 0:\n"
13049                "    break;\n"
13050                "    case 1:\n"
13051                "      {\n"
13052                "      break;\n"
13053                "      }\n"
13054                "    case 2:\n"
13055                "      {\n"
13056                "      }\n"
13057                "    break;\n"
13058                "    default:\n"
13059                "    break;\n"
13060                "    }\n"
13061                "  }\n",
13062                WhitesmithsBraceStyle);
13063 
13064   verifyFormat("void switchTest3(int a)\n"
13065                "  {\n"
13066                "  switch (a)\n"
13067                "    {\n"
13068                "    case 0:\n"
13069                "      {\n"
13070                "      foo(x);\n"
13071                "      }\n"
13072                "    break;\n"
13073                "    default:\n"
13074                "      {\n"
13075                "      foo(1);\n"
13076                "      }\n"
13077                "    break;\n"
13078                "    }\n"
13079                "  }\n",
13080                WhitesmithsBraceStyle);
13081 
13082   WhitesmithsBraceStyle.IndentCaseBlocks = false;
13083 
13084   verifyFormat("void switchTest4(int a)\n"
13085                "  {\n"
13086                "  switch (a)\n"
13087                "    {\n"
13088                "    case 2:\n"
13089                "    {\n"
13090                "    }\n"
13091                "    break;\n"
13092                "    }\n"
13093                "  }\n",
13094                WhitesmithsBraceStyle);
13095 
13096   verifyFormat("void switchTest5(int a)\n"
13097                "  {\n"
13098                "  switch (a)\n"
13099                "    {\n"
13100                "    case 0:\n"
13101                "    break;\n"
13102                "    case 1:\n"
13103                "    {\n"
13104                "    foo();\n"
13105                "    break;\n"
13106                "    }\n"
13107                "    case 2:\n"
13108                "    {\n"
13109                "    }\n"
13110                "    break;\n"
13111                "    default:\n"
13112                "    break;\n"
13113                "    }\n"
13114                "  }\n",
13115                WhitesmithsBraceStyle);
13116 
13117   verifyFormat("void switchTest6(int a)\n"
13118                "  {\n"
13119                "  switch (a)\n"
13120                "    {\n"
13121                "    case 0:\n"
13122                "    {\n"
13123                "    foo(x);\n"
13124                "    }\n"
13125                "    break;\n"
13126                "    default:\n"
13127                "    {\n"
13128                "    foo(1);\n"
13129                "    }\n"
13130                "    break;\n"
13131                "    }\n"
13132                "  }\n",
13133                WhitesmithsBraceStyle);
13134 
13135   verifyFormat("enum X\n"
13136                "  {\n"
13137                "  Y = 0, // testing\n"
13138                "  }\n",
13139                WhitesmithsBraceStyle);
13140 
13141   verifyFormat("enum X\n"
13142                "  {\n"
13143                "  Y = 0\n"
13144                "  }\n",
13145                WhitesmithsBraceStyle);
13146   verifyFormat("enum X\n"
13147                "  {\n"
13148                "  Y = 0,\n"
13149                "  Z = 1\n"
13150                "  };\n",
13151                WhitesmithsBraceStyle);
13152 
13153   verifyFormat("@interface BSApplicationController ()\n"
13154                "  {\n"
13155                "@private\n"
13156                "  id _extraIvar;\n"
13157                "  }\n"
13158                "@end\n",
13159                WhitesmithsBraceStyle);
13160 
13161   verifyFormat("#ifdef _DEBUG\n"
13162                "int foo(int i = 0)\n"
13163                "#else\n"
13164                "int foo(int i = 5)\n"
13165                "#endif\n"
13166                "  {\n"
13167                "  return i;\n"
13168                "  }",
13169                WhitesmithsBraceStyle);
13170 
13171   verifyFormat("void foo() {}\n"
13172                "void bar()\n"
13173                "#ifdef _DEBUG\n"
13174                "  {\n"
13175                "  foo();\n"
13176                "  }\n"
13177                "#else\n"
13178                "  {\n"
13179                "  }\n"
13180                "#endif",
13181                WhitesmithsBraceStyle);
13182 
13183   verifyFormat("void foobar()\n"
13184                "  {\n"
13185                "  int i = 5;\n"
13186                "  }\n"
13187                "#ifdef _DEBUG\n"
13188                "void bar()\n"
13189                "  {\n"
13190                "  }\n"
13191                "#else\n"
13192                "void bar()\n"
13193                "  {\n"
13194                "  foobar();\n"
13195                "  }\n"
13196                "#endif",
13197                WhitesmithsBraceStyle);
13198 
13199   // This shouldn't affect ObjC blocks..
13200   verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
13201                "  // ...\n"
13202                "  int i;\n"
13203                "}];",
13204                WhitesmithsBraceStyle);
13205   verifyFormat("void (^block)(void) = ^{\n"
13206                "  // ...\n"
13207                "  int i;\n"
13208                "};",
13209                WhitesmithsBraceStyle);
13210   // .. or dict literals.
13211   verifyFormat("void f()\n"
13212                "  {\n"
13213                "  [object someMethod:@{@\"a\" : @\"b\"}];\n"
13214                "  }",
13215                WhitesmithsBraceStyle);
13216 
13217   verifyFormat("int f()\n"
13218                "  { // comment\n"
13219                "  return 42;\n"
13220                "  }",
13221                WhitesmithsBraceStyle);
13222 
13223   FormatStyle BreakBeforeBraceShortIfs = WhitesmithsBraceStyle;
13224   BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine =
13225       FormatStyle::SIS_Always;
13226   BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
13227   verifyFormat("void f(bool b)\n"
13228                "  {\n"
13229                "  if (b)\n"
13230                "    {\n"
13231                "    return;\n"
13232                "    }\n"
13233                "  }\n",
13234                BreakBeforeBraceShortIfs);
13235   verifyFormat("void f(bool b)\n"
13236                "  {\n"
13237                "  if (b) return;\n"
13238                "  }\n",
13239                BreakBeforeBraceShortIfs);
13240   verifyFormat("void f(bool b)\n"
13241                "  {\n"
13242                "  while (b)\n"
13243                "    {\n"
13244                "    return;\n"
13245                "    }\n"
13246                "  }\n",
13247                BreakBeforeBraceShortIfs);
13248 }
13249 
13250 TEST_F(FormatTest, GNUBraceBreaking) {
13251   FormatStyle GNUBraceStyle = getLLVMStyle();
13252   GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
13253   verifyFormat("namespace a\n"
13254                "{\n"
13255                "class A\n"
13256                "{\n"
13257                "  void f()\n"
13258                "  {\n"
13259                "    int a;\n"
13260                "    {\n"
13261                "      int b;\n"
13262                "    }\n"
13263                "    if (true)\n"
13264                "      {\n"
13265                "        a();\n"
13266                "        b();\n"
13267                "      }\n"
13268                "  }\n"
13269                "  void g() { return; }\n"
13270                "}\n"
13271                "} // namespace a",
13272                GNUBraceStyle);
13273 
13274   verifyFormat("void f()\n"
13275                "{\n"
13276                "  if (true)\n"
13277                "    {\n"
13278                "      a();\n"
13279                "    }\n"
13280                "  else if (false)\n"
13281                "    {\n"
13282                "      b();\n"
13283                "    }\n"
13284                "  else\n"
13285                "    {\n"
13286                "      c();\n"
13287                "    }\n"
13288                "}\n",
13289                GNUBraceStyle);
13290 
13291   verifyFormat("void f()\n"
13292                "{\n"
13293                "  for (int i = 0; i < 10; ++i)\n"
13294                "    {\n"
13295                "      a();\n"
13296                "    }\n"
13297                "  while (false)\n"
13298                "    {\n"
13299                "      b();\n"
13300                "    }\n"
13301                "  do\n"
13302                "    {\n"
13303                "      c();\n"
13304                "    }\n"
13305                "  while (false);\n"
13306                "}\n",
13307                GNUBraceStyle);
13308 
13309   verifyFormat("void f(int a)\n"
13310                "{\n"
13311                "  switch (a)\n"
13312                "    {\n"
13313                "    case 0:\n"
13314                "      break;\n"
13315                "    case 1:\n"
13316                "      {\n"
13317                "        break;\n"
13318                "      }\n"
13319                "    case 2:\n"
13320                "      {\n"
13321                "      }\n"
13322                "      break;\n"
13323                "    default:\n"
13324                "      break;\n"
13325                "    }\n"
13326                "}\n",
13327                GNUBraceStyle);
13328 
13329   verifyFormat("enum X\n"
13330                "{\n"
13331                "  Y = 0,\n"
13332                "}\n",
13333                GNUBraceStyle);
13334 
13335   verifyFormat("@interface BSApplicationController ()\n"
13336                "{\n"
13337                "@private\n"
13338                "  id _extraIvar;\n"
13339                "}\n"
13340                "@end\n",
13341                GNUBraceStyle);
13342 
13343   verifyFormat("#ifdef _DEBUG\n"
13344                "int foo(int i = 0)\n"
13345                "#else\n"
13346                "int foo(int i = 5)\n"
13347                "#endif\n"
13348                "{\n"
13349                "  return i;\n"
13350                "}",
13351                GNUBraceStyle);
13352 
13353   verifyFormat("void foo() {}\n"
13354                "void bar()\n"
13355                "#ifdef _DEBUG\n"
13356                "{\n"
13357                "  foo();\n"
13358                "}\n"
13359                "#else\n"
13360                "{\n"
13361                "}\n"
13362                "#endif",
13363                GNUBraceStyle);
13364 
13365   verifyFormat("void foobar() { int i = 5; }\n"
13366                "#ifdef _DEBUG\n"
13367                "void bar() {}\n"
13368                "#else\n"
13369                "void bar() { foobar(); }\n"
13370                "#endif",
13371                GNUBraceStyle);
13372 }
13373 
13374 TEST_F(FormatTest, WebKitBraceBreaking) {
13375   FormatStyle WebKitBraceStyle = getLLVMStyle();
13376   WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
13377   WebKitBraceStyle.FixNamespaceComments = false;
13378   verifyFormat("namespace a {\n"
13379                "class A {\n"
13380                "  void f()\n"
13381                "  {\n"
13382                "    if (true) {\n"
13383                "      a();\n"
13384                "      b();\n"
13385                "    }\n"
13386                "  }\n"
13387                "  void g() { return; }\n"
13388                "};\n"
13389                "enum E {\n"
13390                "  A,\n"
13391                "  // foo\n"
13392                "  B,\n"
13393                "  C\n"
13394                "};\n"
13395                "struct B {\n"
13396                "  int x;\n"
13397                "};\n"
13398                "}\n",
13399                WebKitBraceStyle);
13400   verifyFormat("struct S {\n"
13401                "  int Type;\n"
13402                "  union {\n"
13403                "    int x;\n"
13404                "    double y;\n"
13405                "  } Value;\n"
13406                "  class C {\n"
13407                "    MyFavoriteType Value;\n"
13408                "  } Class;\n"
13409                "};\n",
13410                WebKitBraceStyle);
13411 }
13412 
13413 TEST_F(FormatTest, CatchExceptionReferenceBinding) {
13414   verifyFormat("void f() {\n"
13415                "  try {\n"
13416                "  } catch (const Exception &e) {\n"
13417                "  }\n"
13418                "}\n",
13419                getLLVMStyle());
13420 }
13421 
13422 TEST_F(FormatTest, UnderstandsPragmas) {
13423   verifyFormat("#pragma omp reduction(| : var)");
13424   verifyFormat("#pragma omp reduction(+ : var)");
13425 
13426   EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
13427             "(including parentheses).",
13428             format("#pragma    mark   Any non-hyphenated or hyphenated string "
13429                    "(including parentheses)."));
13430 }
13431 
13432 TEST_F(FormatTest, UnderstandPragmaOption) {
13433   verifyFormat("#pragma option -C -A");
13434 
13435   EXPECT_EQ("#pragma option -C -A", format("#pragma    option   -C   -A"));
13436 }
13437 
13438 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
13439   FormatStyle Style = getLLVMStyle();
13440   Style.ColumnLimit = 20;
13441 
13442   // See PR41213
13443   EXPECT_EQ("/*\n"
13444             " *\t9012345\n"
13445             " * /8901\n"
13446             " */",
13447             format("/*\n"
13448                    " *\t9012345 /8901\n"
13449                    " */",
13450                    Style));
13451   EXPECT_EQ("/*\n"
13452             " *345678\n"
13453             " *\t/8901\n"
13454             " */",
13455             format("/*\n"
13456                    " *345678\t/8901\n"
13457                    " */",
13458                    Style));
13459 
13460   verifyFormat("int a; // the\n"
13461                "       // comment",
13462                Style);
13463   EXPECT_EQ("int a; /* first line\n"
13464             "        * second\n"
13465             "        * line third\n"
13466             "        * line\n"
13467             "        */",
13468             format("int a; /* first line\n"
13469                    "        * second\n"
13470                    "        * line third\n"
13471                    "        * line\n"
13472                    "        */",
13473                    Style));
13474   EXPECT_EQ("int a; // first line\n"
13475             "       // second\n"
13476             "       // line third\n"
13477             "       // line",
13478             format("int a; // first line\n"
13479                    "       // second line\n"
13480                    "       // third line",
13481                    Style));
13482 
13483   Style.PenaltyExcessCharacter = 90;
13484   verifyFormat("int a; // the comment", Style);
13485   EXPECT_EQ("int a; // the comment\n"
13486             "       // aaa",
13487             format("int a; // the comment aaa", Style));
13488   EXPECT_EQ("int a; /* first line\n"
13489             "        * second line\n"
13490             "        * third line\n"
13491             "        */",
13492             format("int a; /* first line\n"
13493                    "        * second line\n"
13494                    "        * third line\n"
13495                    "        */",
13496                    Style));
13497   EXPECT_EQ("int a; // first line\n"
13498             "       // second line\n"
13499             "       // third line",
13500             format("int a; // first line\n"
13501                    "       // second line\n"
13502                    "       // third line",
13503                    Style));
13504   // FIXME: Investigate why this is not getting the same layout as the test
13505   // above.
13506   EXPECT_EQ("int a; /* first line\n"
13507             "        * second line\n"
13508             "        * third line\n"
13509             "        */",
13510             format("int a; /* first line second line third line"
13511                    "\n*/",
13512                    Style));
13513 
13514   EXPECT_EQ("// foo bar baz bazfoo\n"
13515             "// foo bar foo bar\n",
13516             format("// foo bar baz bazfoo\n"
13517                    "// foo bar foo           bar\n",
13518                    Style));
13519   EXPECT_EQ("// foo bar baz bazfoo\n"
13520             "// foo bar foo bar\n",
13521             format("// foo bar baz      bazfoo\n"
13522                    "// foo            bar foo bar\n",
13523                    Style));
13524 
13525   // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
13526   // next one.
13527   EXPECT_EQ("// foo bar baz bazfoo\n"
13528             "// bar foo bar\n",
13529             format("// foo bar baz      bazfoo bar\n"
13530                    "// foo            bar\n",
13531                    Style));
13532 
13533   EXPECT_EQ("// foo bar baz bazfoo\n"
13534             "// foo bar baz bazfoo\n"
13535             "// bar foo bar\n",
13536             format("// foo bar baz      bazfoo\n"
13537                    "// foo bar baz      bazfoo bar\n"
13538                    "// foo bar\n",
13539                    Style));
13540 
13541   EXPECT_EQ("// foo bar baz bazfoo\n"
13542             "// foo bar baz bazfoo\n"
13543             "// bar foo bar\n",
13544             format("// foo bar baz      bazfoo\n"
13545                    "// foo bar baz      bazfoo bar\n"
13546                    "// foo           bar\n",
13547                    Style));
13548 
13549   // Make sure we do not keep protruding characters if strict mode reflow is
13550   // cheaper than keeping protruding characters.
13551   Style.ColumnLimit = 21;
13552   EXPECT_EQ(
13553       "// foo foo foo foo\n"
13554       "// foo foo foo foo\n"
13555       "// foo foo foo foo\n",
13556       format("// foo foo foo foo foo foo foo foo foo foo foo foo\n", Style));
13557 
13558   EXPECT_EQ("int a = /* long block\n"
13559             "           comment */\n"
13560             "    42;",
13561             format("int a = /* long block comment */ 42;", Style));
13562 }
13563 
13564 #define EXPECT_ALL_STYLES_EQUAL(Styles)                                        \
13565   for (size_t i = 1; i < Styles.size(); ++i)                                   \
13566   EXPECT_EQ(Styles[0], Styles[i])                                              \
13567       << "Style #" << i << " of " << Styles.size() << " differs from Style #0"
13568 
13569 TEST_F(FormatTest, GetsPredefinedStyleByName) {
13570   SmallVector<FormatStyle, 3> Styles;
13571   Styles.resize(3);
13572 
13573   Styles[0] = getLLVMStyle();
13574   EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
13575   EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
13576   EXPECT_ALL_STYLES_EQUAL(Styles);
13577 
13578   Styles[0] = getGoogleStyle();
13579   EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
13580   EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
13581   EXPECT_ALL_STYLES_EQUAL(Styles);
13582 
13583   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
13584   EXPECT_TRUE(
13585       getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
13586   EXPECT_TRUE(
13587       getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
13588   EXPECT_ALL_STYLES_EQUAL(Styles);
13589 
13590   Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
13591   EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
13592   EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
13593   EXPECT_ALL_STYLES_EQUAL(Styles);
13594 
13595   Styles[0] = getMozillaStyle();
13596   EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
13597   EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
13598   EXPECT_ALL_STYLES_EQUAL(Styles);
13599 
13600   Styles[0] = getWebKitStyle();
13601   EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
13602   EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
13603   EXPECT_ALL_STYLES_EQUAL(Styles);
13604 
13605   Styles[0] = getGNUStyle();
13606   EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
13607   EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
13608   EXPECT_ALL_STYLES_EQUAL(Styles);
13609 
13610   EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
13611 }
13612 
13613 TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
13614   SmallVector<FormatStyle, 8> Styles;
13615   Styles.resize(2);
13616 
13617   Styles[0] = getGoogleStyle();
13618   Styles[1] = getLLVMStyle();
13619   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
13620   EXPECT_ALL_STYLES_EQUAL(Styles);
13621 
13622   Styles.resize(5);
13623   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
13624   Styles[1] = getLLVMStyle();
13625   Styles[1].Language = FormatStyle::LK_JavaScript;
13626   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
13627 
13628   Styles[2] = getLLVMStyle();
13629   Styles[2].Language = FormatStyle::LK_JavaScript;
13630   EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
13631                                   "BasedOnStyle: Google",
13632                                   &Styles[2])
13633                    .value());
13634 
13635   Styles[3] = getLLVMStyle();
13636   Styles[3].Language = FormatStyle::LK_JavaScript;
13637   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
13638                                   "Language: JavaScript",
13639                                   &Styles[3])
13640                    .value());
13641 
13642   Styles[4] = getLLVMStyle();
13643   Styles[4].Language = FormatStyle::LK_JavaScript;
13644   EXPECT_EQ(0, parseConfiguration("---\n"
13645                                   "BasedOnStyle: LLVM\n"
13646                                   "IndentWidth: 123\n"
13647                                   "---\n"
13648                                   "BasedOnStyle: Google\n"
13649                                   "Language: JavaScript",
13650                                   &Styles[4])
13651                    .value());
13652   EXPECT_ALL_STYLES_EQUAL(Styles);
13653 }
13654 
13655 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME)                             \
13656   Style.FIELD = false;                                                         \
13657   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value());      \
13658   EXPECT_TRUE(Style.FIELD);                                                    \
13659   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value());     \
13660   EXPECT_FALSE(Style.FIELD);
13661 
13662 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
13663 
13664 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME)              \
13665   Style.STRUCT.FIELD = false;                                                  \
13666   EXPECT_EQ(0,                                                                 \
13667             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": true", &Style)   \
13668                 .value());                                                     \
13669   EXPECT_TRUE(Style.STRUCT.FIELD);                                             \
13670   EXPECT_EQ(0,                                                                 \
13671             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": false", &Style)  \
13672                 .value());                                                     \
13673   EXPECT_FALSE(Style.STRUCT.FIELD);
13674 
13675 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD)                                 \
13676   CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
13677 
13678 #define CHECK_PARSE(TEXT, FIELD, VALUE)                                        \
13679   EXPECT_NE(VALUE, Style.FIELD);                                               \
13680   EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value());                      \
13681   EXPECT_EQ(VALUE, Style.FIELD)
13682 
13683 TEST_F(FormatTest, ParsesConfigurationBools) {
13684   FormatStyle Style = {};
13685   Style.Language = FormatStyle::LK_Cpp;
13686   CHECK_PARSE_BOOL(AlignTrailingComments);
13687   CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
13688   CHECK_PARSE_BOOL(AlignConsecutiveBitFields);
13689   CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
13690   CHECK_PARSE_BOOL(AlignConsecutiveMacros);
13691   CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine);
13692   CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine);
13693   CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
13694   CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
13695   CHECK_PARSE_BOOL(AllowShortEnumsOnASingleLine);
13696   CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
13697   CHECK_PARSE_BOOL(BinPackArguments);
13698   CHECK_PARSE_BOOL(BinPackParameters);
13699   CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
13700   CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
13701   CHECK_PARSE_BOOL(BreakStringLiterals);
13702   CHECK_PARSE_BOOL(CompactNamespaces);
13703   CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
13704   CHECK_PARSE_BOOL(DeriveLineEnding);
13705   CHECK_PARSE_BOOL(DerivePointerAlignment);
13706   CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
13707   CHECK_PARSE_BOOL(DisableFormat);
13708   CHECK_PARSE_BOOL(IndentCaseLabels);
13709   CHECK_PARSE_BOOL(IndentCaseBlocks);
13710   CHECK_PARSE_BOOL(IndentGotoLabels);
13711   CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
13712   CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
13713   CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
13714   CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
13715   CHECK_PARSE_BOOL(Cpp11BracedListStyle);
13716   CHECK_PARSE_BOOL(ReflowComments);
13717   CHECK_PARSE_BOOL(SortIncludes);
13718   CHECK_PARSE_BOOL(SortUsingDeclarations);
13719   CHECK_PARSE_BOOL(SpacesInParentheses);
13720   CHECK_PARSE_BOOL(SpacesInSquareBrackets);
13721   CHECK_PARSE_BOOL(SpacesInAngles);
13722   CHECK_PARSE_BOOL(SpacesInConditionalStatement);
13723   CHECK_PARSE_BOOL(SpaceInEmptyBlock);
13724   CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
13725   CHECK_PARSE_BOOL(SpacesInContainerLiterals);
13726   CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
13727   CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
13728   CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
13729   CHECK_PARSE_BOOL(SpaceAfterLogicalNot);
13730   CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
13731   CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList);
13732   CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon);
13733   CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon);
13734   CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon);
13735   CHECK_PARSE_BOOL(SpaceBeforeSquareBrackets);
13736   CHECK_PARSE_BOOL(UseCRLF);
13737 
13738   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel);
13739   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
13740   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
13741   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
13742   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
13743   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
13744   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
13745   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
13746   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
13747   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
13748   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
13749   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeLambdaBody);
13750   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeWhile);
13751   CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
13752   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
13753   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
13754   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
13755 }
13756 
13757 #undef CHECK_PARSE_BOOL
13758 
13759 TEST_F(FormatTest, ParsesConfiguration) {
13760   FormatStyle Style = {};
13761   Style.Language = FormatStyle::LK_Cpp;
13762   CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
13763   CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
13764               ConstructorInitializerIndentWidth, 1234u);
13765   CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
13766   CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
13767   CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
13768   CHECK_PARSE("PenaltyBreakAssignment: 1234", PenaltyBreakAssignment, 1234u);
13769   CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
13770               PenaltyBreakBeforeFirstCallParameter, 1234u);
13771   CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234",
13772               PenaltyBreakTemplateDeclaration, 1234u);
13773   CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
13774   CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
13775               PenaltyReturnTypeOnItsOwnLine, 1234u);
13776   CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
13777               SpacesBeforeTrailingComments, 1234u);
13778   CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
13779   CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
13780   CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
13781 
13782   Style.PointerAlignment = FormatStyle::PAS_Middle;
13783   CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
13784               FormatStyle::PAS_Left);
13785   CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
13786               FormatStyle::PAS_Right);
13787   CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
13788               FormatStyle::PAS_Middle);
13789   // For backward compatibility:
13790   CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
13791               FormatStyle::PAS_Left);
13792   CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
13793               FormatStyle::PAS_Right);
13794   CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
13795               FormatStyle::PAS_Middle);
13796 
13797   Style.Standard = FormatStyle::LS_Auto;
13798   CHECK_PARSE("Standard: c++03", Standard, FormatStyle::LS_Cpp03);
13799   CHECK_PARSE("Standard: c++11", Standard, FormatStyle::LS_Cpp11);
13800   CHECK_PARSE("Standard: c++14", Standard, FormatStyle::LS_Cpp14);
13801   CHECK_PARSE("Standard: c++17", Standard, FormatStyle::LS_Cpp17);
13802   CHECK_PARSE("Standard: c++20", Standard, FormatStyle::LS_Cpp20);
13803   CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
13804   CHECK_PARSE("Standard: Latest", Standard, FormatStyle::LS_Latest);
13805   // Legacy aliases:
13806   CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
13807   CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Latest);
13808   CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
13809   CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
13810 
13811   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
13812   CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
13813               BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
13814   CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
13815               FormatStyle::BOS_None);
13816   CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
13817               FormatStyle::BOS_All);
13818   // For backward compatibility:
13819   CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
13820               FormatStyle::BOS_None);
13821   CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
13822               FormatStyle::BOS_All);
13823 
13824   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
13825   CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
13826               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
13827   CHECK_PARSE("BreakConstructorInitializers: AfterColon",
13828               BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
13829   CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
13830               BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
13831   // For backward compatibility:
13832   CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
13833               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
13834 
13835   Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
13836   CHECK_PARSE("BreakInheritanceList: BeforeComma", BreakInheritanceList,
13837               FormatStyle::BILS_BeforeComma);
13838   CHECK_PARSE("BreakInheritanceList: AfterColon", BreakInheritanceList,
13839               FormatStyle::BILS_AfterColon);
13840   CHECK_PARSE("BreakInheritanceList: BeforeColon", BreakInheritanceList,
13841               FormatStyle::BILS_BeforeColon);
13842   // For backward compatibility:
13843   CHECK_PARSE("BreakBeforeInheritanceComma: true", BreakInheritanceList,
13844               FormatStyle::BILS_BeforeComma);
13845 
13846   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
13847   CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
13848               FormatStyle::BAS_Align);
13849   CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
13850               FormatStyle::BAS_DontAlign);
13851   CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
13852               FormatStyle::BAS_AlwaysBreak);
13853   // For backward compatibility:
13854   CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
13855               FormatStyle::BAS_DontAlign);
13856   CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
13857               FormatStyle::BAS_Align);
13858 
13859   Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
13860   CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
13861               FormatStyle::ENAS_DontAlign);
13862   CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
13863               FormatStyle::ENAS_Left);
13864   CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
13865               FormatStyle::ENAS_Right);
13866   // For backward compatibility:
13867   CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
13868               FormatStyle::ENAS_Left);
13869   CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
13870               FormatStyle::ENAS_Right);
13871 
13872   Style.AlignOperands = FormatStyle::OAS_Align;
13873   CHECK_PARSE("AlignOperands: DontAlign", AlignOperands,
13874               FormatStyle::OAS_DontAlign);
13875   CHECK_PARSE("AlignOperands: Align", AlignOperands, FormatStyle::OAS_Align);
13876   CHECK_PARSE("AlignOperands: AlignAfterOperator", AlignOperands,
13877               FormatStyle::OAS_AlignAfterOperator);
13878   // For backward compatibility:
13879   CHECK_PARSE("AlignOperands: false", AlignOperands,
13880               FormatStyle::OAS_DontAlign);
13881   CHECK_PARSE("AlignOperands: true", AlignOperands, FormatStyle::OAS_Align);
13882 
13883   Style.UseTab = FormatStyle::UT_ForIndentation;
13884   CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
13885   CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
13886   CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
13887   CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
13888               FormatStyle::UT_ForContinuationAndIndentation);
13889   CHECK_PARSE("UseTab: AlignWithSpaces", UseTab,
13890               FormatStyle::UT_AlignWithSpaces);
13891   // For backward compatibility:
13892   CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
13893   CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
13894 
13895   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty;
13896   CHECK_PARSE("AllowShortBlocksOnASingleLine: Never",
13897               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never);
13898   CHECK_PARSE("AllowShortBlocksOnASingleLine: Empty",
13899               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Empty);
13900   CHECK_PARSE("AllowShortBlocksOnASingleLine: Always",
13901               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always);
13902   // For backward compatibility:
13903   CHECK_PARSE("AllowShortBlocksOnASingleLine: false",
13904               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never);
13905   CHECK_PARSE("AllowShortBlocksOnASingleLine: true",
13906               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always);
13907 
13908   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
13909   CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
13910               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
13911   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
13912               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
13913   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
13914               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
13915   CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
13916               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
13917   // For backward compatibility:
13918   CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
13919               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
13920   CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
13921               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
13922 
13923   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
13924   CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
13925               FormatStyle::SBPO_Never);
13926   CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
13927               FormatStyle::SBPO_Always);
13928   CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
13929               FormatStyle::SBPO_ControlStatements);
13930   CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens,
13931               FormatStyle::SBPO_NonEmptyParentheses);
13932   // For backward compatibility:
13933   CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
13934               FormatStyle::SBPO_Never);
13935   CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
13936               FormatStyle::SBPO_ControlStatements);
13937 
13938   Style.ColumnLimit = 123;
13939   FormatStyle BaseStyle = getLLVMStyle();
13940   CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
13941   CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
13942 
13943   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
13944   CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
13945               FormatStyle::BS_Attach);
13946   CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
13947               FormatStyle::BS_Linux);
13948   CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
13949               FormatStyle::BS_Mozilla);
13950   CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
13951               FormatStyle::BS_Stroustrup);
13952   CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
13953               FormatStyle::BS_Allman);
13954   CHECK_PARSE("BreakBeforeBraces: Whitesmiths", BreakBeforeBraces,
13955               FormatStyle::BS_Whitesmiths);
13956   CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
13957   CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
13958               FormatStyle::BS_WebKit);
13959   CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
13960               FormatStyle::BS_Custom);
13961 
13962   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Never;
13963   CHECK_PARSE("BraceWrapping:\n"
13964               "  AfterControlStatement: MultiLine",
13965               BraceWrapping.AfterControlStatement,
13966               FormatStyle::BWACS_MultiLine);
13967   CHECK_PARSE("BraceWrapping:\n"
13968               "  AfterControlStatement: Always",
13969               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always);
13970   CHECK_PARSE("BraceWrapping:\n"
13971               "  AfterControlStatement: Never",
13972               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never);
13973   // For backward compatibility:
13974   CHECK_PARSE("BraceWrapping:\n"
13975               "  AfterControlStatement: true",
13976               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always);
13977   CHECK_PARSE("BraceWrapping:\n"
13978               "  AfterControlStatement: false",
13979               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never);
13980 
13981   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
13982   CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
13983               FormatStyle::RTBS_None);
13984   CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
13985               FormatStyle::RTBS_All);
13986   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
13987               AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
13988   CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
13989               AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
13990   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
13991               AlwaysBreakAfterReturnType,
13992               FormatStyle::RTBS_TopLevelDefinitions);
13993 
13994   Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
13995   CHECK_PARSE("AlwaysBreakTemplateDeclarations: No",
13996               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_No);
13997   CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine",
13998               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine);
13999   CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes",
14000               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes);
14001   CHECK_PARSE("AlwaysBreakTemplateDeclarations: false",
14002               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine);
14003   CHECK_PARSE("AlwaysBreakTemplateDeclarations: true",
14004               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes);
14005 
14006   Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
14007   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
14008               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
14009   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
14010               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
14011   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
14012               AlwaysBreakAfterDefinitionReturnType,
14013               FormatStyle::DRTBS_TopLevel);
14014 
14015   Style.NamespaceIndentation = FormatStyle::NI_All;
14016   CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
14017               FormatStyle::NI_None);
14018   CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
14019               FormatStyle::NI_Inner);
14020   CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
14021               FormatStyle::NI_All);
14022 
14023   Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always;
14024   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never",
14025               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
14026   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse",
14027               AllowShortIfStatementsOnASingleLine,
14028               FormatStyle::SIS_WithoutElse);
14029   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always",
14030               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always);
14031   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false",
14032               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
14033   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true",
14034               AllowShortIfStatementsOnASingleLine,
14035               FormatStyle::SIS_WithoutElse);
14036 
14037   Style.IndentExternBlock = FormatStyle::IEBS_NoIndent;
14038   CHECK_PARSE("IndentExternBlock: AfterExternBlock", IndentExternBlock,
14039               FormatStyle::IEBS_AfterExternBlock);
14040   CHECK_PARSE("IndentExternBlock: Indent", IndentExternBlock,
14041               FormatStyle::IEBS_Indent);
14042   CHECK_PARSE("IndentExternBlock: NoIndent", IndentExternBlock,
14043               FormatStyle::IEBS_NoIndent);
14044   CHECK_PARSE("IndentExternBlock: true", IndentExternBlock,
14045               FormatStyle::IEBS_Indent);
14046   CHECK_PARSE("IndentExternBlock: false", IndentExternBlock,
14047               FormatStyle::IEBS_NoIndent);
14048 
14049   Style.BitFieldColonSpacing = FormatStyle::BFCS_None;
14050   CHECK_PARSE("BitFieldColonSpacing: Both", BitFieldColonSpacing,
14051               FormatStyle::BFCS_Both);
14052   CHECK_PARSE("BitFieldColonSpacing: None", BitFieldColonSpacing,
14053               FormatStyle::BFCS_None);
14054   CHECK_PARSE("BitFieldColonSpacing: Before", BitFieldColonSpacing,
14055               FormatStyle::BFCS_Before);
14056   CHECK_PARSE("BitFieldColonSpacing: After", BitFieldColonSpacing,
14057               FormatStyle::BFCS_After);
14058 
14059   // FIXME: This is required because parsing a configuration simply overwrites
14060   // the first N elements of the list instead of resetting it.
14061   Style.ForEachMacros.clear();
14062   std::vector<std::string> BoostForeach;
14063   BoostForeach.push_back("BOOST_FOREACH");
14064   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
14065   std::vector<std::string> BoostAndQForeach;
14066   BoostAndQForeach.push_back("BOOST_FOREACH");
14067   BoostAndQForeach.push_back("Q_FOREACH");
14068   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
14069               BoostAndQForeach);
14070 
14071   Style.StatementMacros.clear();
14072   CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros,
14073               std::vector<std::string>{"QUNUSED"});
14074   CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros,
14075               std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"}));
14076 
14077   Style.NamespaceMacros.clear();
14078   CHECK_PARSE("NamespaceMacros: [TESTSUITE]", NamespaceMacros,
14079               std::vector<std::string>{"TESTSUITE"});
14080   CHECK_PARSE("NamespaceMacros: [TESTSUITE, SUITE]", NamespaceMacros,
14081               std::vector<std::string>({"TESTSUITE", "SUITE"}));
14082 
14083   Style.WhitespaceSensitiveMacros.clear();
14084   CHECK_PARSE("WhitespaceSensitiveMacros: [STRINGIZE]",
14085               WhitespaceSensitiveMacros, std::vector<std::string>{"STRINGIZE"});
14086   CHECK_PARSE("WhitespaceSensitiveMacros: [STRINGIZE, ASSERT]",
14087               WhitespaceSensitiveMacros,
14088               std::vector<std::string>({"STRINGIZE", "ASSERT"}));
14089   Style.WhitespaceSensitiveMacros.clear();
14090   CHECK_PARSE("WhitespaceSensitiveMacros: ['STRINGIZE']",
14091               WhitespaceSensitiveMacros, std::vector<std::string>{"STRINGIZE"});
14092   CHECK_PARSE("WhitespaceSensitiveMacros: ['STRINGIZE', 'ASSERT']",
14093               WhitespaceSensitiveMacros,
14094               std::vector<std::string>({"STRINGIZE", "ASSERT"}));
14095 
14096   Style.IncludeStyle.IncludeCategories.clear();
14097   std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = {
14098       {"abc/.*", 2, 0}, {".*", 1, 0}};
14099   CHECK_PARSE("IncludeCategories:\n"
14100               "  - Regex: abc/.*\n"
14101               "    Priority: 2\n"
14102               "  - Regex: .*\n"
14103               "    Priority: 1",
14104               IncludeStyle.IncludeCategories, ExpectedCategories);
14105   CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex,
14106               "abc$");
14107   CHECK_PARSE("IncludeIsMainSourceRegex: 'abc$'",
14108               IncludeStyle.IncludeIsMainSourceRegex, "abc$");
14109 
14110   Style.RawStringFormats.clear();
14111   std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
14112       {
14113           FormatStyle::LK_TextProto,
14114           {"pb", "proto"},
14115           {"PARSE_TEXT_PROTO"},
14116           /*CanonicalDelimiter=*/"",
14117           "llvm",
14118       },
14119       {
14120           FormatStyle::LK_Cpp,
14121           {"cc", "cpp"},
14122           {"C_CODEBLOCK", "CPPEVAL"},
14123           /*CanonicalDelimiter=*/"cc",
14124           /*BasedOnStyle=*/"",
14125       },
14126   };
14127 
14128   CHECK_PARSE("RawStringFormats:\n"
14129               "  - Language: TextProto\n"
14130               "    Delimiters:\n"
14131               "      - 'pb'\n"
14132               "      - 'proto'\n"
14133               "    EnclosingFunctions:\n"
14134               "      - 'PARSE_TEXT_PROTO'\n"
14135               "    BasedOnStyle: llvm\n"
14136               "  - Language: Cpp\n"
14137               "    Delimiters:\n"
14138               "      - 'cc'\n"
14139               "      - 'cpp'\n"
14140               "    EnclosingFunctions:\n"
14141               "      - 'C_CODEBLOCK'\n"
14142               "      - 'CPPEVAL'\n"
14143               "    CanonicalDelimiter: 'cc'",
14144               RawStringFormats, ExpectedRawStringFormats);
14145 }
14146 
14147 TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
14148   FormatStyle Style = {};
14149   Style.Language = FormatStyle::LK_Cpp;
14150   CHECK_PARSE("Language: Cpp\n"
14151               "IndentWidth: 12",
14152               IndentWidth, 12u);
14153   EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
14154                                "IndentWidth: 34",
14155                                &Style),
14156             ParseError::Unsuitable);
14157   FormatStyle BinPackedTCS = {};
14158   BinPackedTCS.Language = FormatStyle::LK_JavaScript;
14159   EXPECT_EQ(parseConfiguration("BinPackArguments: true\n"
14160                                "InsertTrailingCommas: Wrapped",
14161                                &BinPackedTCS),
14162             ParseError::BinPackTrailingCommaConflict);
14163   EXPECT_EQ(12u, Style.IndentWidth);
14164   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
14165   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
14166 
14167   Style.Language = FormatStyle::LK_JavaScript;
14168   CHECK_PARSE("Language: JavaScript\n"
14169               "IndentWidth: 12",
14170               IndentWidth, 12u);
14171   CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
14172   EXPECT_EQ(parseConfiguration("Language: Cpp\n"
14173                                "IndentWidth: 34",
14174                                &Style),
14175             ParseError::Unsuitable);
14176   EXPECT_EQ(23u, Style.IndentWidth);
14177   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
14178   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
14179 
14180   CHECK_PARSE("BasedOnStyle: LLVM\n"
14181               "IndentWidth: 67",
14182               IndentWidth, 67u);
14183 
14184   CHECK_PARSE("---\n"
14185               "Language: JavaScript\n"
14186               "IndentWidth: 12\n"
14187               "---\n"
14188               "Language: Cpp\n"
14189               "IndentWidth: 34\n"
14190               "...\n",
14191               IndentWidth, 12u);
14192 
14193   Style.Language = FormatStyle::LK_Cpp;
14194   CHECK_PARSE("---\n"
14195               "Language: JavaScript\n"
14196               "IndentWidth: 12\n"
14197               "---\n"
14198               "Language: Cpp\n"
14199               "IndentWidth: 34\n"
14200               "...\n",
14201               IndentWidth, 34u);
14202   CHECK_PARSE("---\n"
14203               "IndentWidth: 78\n"
14204               "---\n"
14205               "Language: JavaScript\n"
14206               "IndentWidth: 56\n"
14207               "...\n",
14208               IndentWidth, 78u);
14209 
14210   Style.ColumnLimit = 123;
14211   Style.IndentWidth = 234;
14212   Style.BreakBeforeBraces = FormatStyle::BS_Linux;
14213   Style.TabWidth = 345;
14214   EXPECT_FALSE(parseConfiguration("---\n"
14215                                   "IndentWidth: 456\n"
14216                                   "BreakBeforeBraces: Allman\n"
14217                                   "---\n"
14218                                   "Language: JavaScript\n"
14219                                   "IndentWidth: 111\n"
14220                                   "TabWidth: 111\n"
14221                                   "---\n"
14222                                   "Language: Cpp\n"
14223                                   "BreakBeforeBraces: Stroustrup\n"
14224                                   "TabWidth: 789\n"
14225                                   "...\n",
14226                                   &Style));
14227   EXPECT_EQ(123u, Style.ColumnLimit);
14228   EXPECT_EQ(456u, Style.IndentWidth);
14229   EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
14230   EXPECT_EQ(789u, Style.TabWidth);
14231 
14232   EXPECT_EQ(parseConfiguration("---\n"
14233                                "Language: JavaScript\n"
14234                                "IndentWidth: 56\n"
14235                                "---\n"
14236                                "IndentWidth: 78\n"
14237                                "...\n",
14238                                &Style),
14239             ParseError::Error);
14240   EXPECT_EQ(parseConfiguration("---\n"
14241                                "Language: JavaScript\n"
14242                                "IndentWidth: 56\n"
14243                                "---\n"
14244                                "Language: JavaScript\n"
14245                                "IndentWidth: 78\n"
14246                                "...\n",
14247                                &Style),
14248             ParseError::Error);
14249 
14250   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
14251 }
14252 
14253 #undef CHECK_PARSE
14254 
14255 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
14256   FormatStyle Style = {};
14257   Style.Language = FormatStyle::LK_JavaScript;
14258   Style.BreakBeforeTernaryOperators = true;
14259   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
14260   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
14261 
14262   Style.BreakBeforeTernaryOperators = true;
14263   EXPECT_EQ(0, parseConfiguration("---\n"
14264                                   "BasedOnStyle: Google\n"
14265                                   "---\n"
14266                                   "Language: JavaScript\n"
14267                                   "IndentWidth: 76\n"
14268                                   "...\n",
14269                                   &Style)
14270                    .value());
14271   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
14272   EXPECT_EQ(76u, Style.IndentWidth);
14273   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
14274 }
14275 
14276 TEST_F(FormatTest, ConfigurationRoundTripTest) {
14277   FormatStyle Style = getLLVMStyle();
14278   std::string YAML = configurationAsText(Style);
14279   FormatStyle ParsedStyle = {};
14280   ParsedStyle.Language = FormatStyle::LK_Cpp;
14281   EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
14282   EXPECT_EQ(Style, ParsedStyle);
14283 }
14284 
14285 TEST_F(FormatTest, WorksFor8bitEncodings) {
14286   EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
14287             "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
14288             "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
14289             "\"\xef\xee\xf0\xf3...\"",
14290             format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
14291                    "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
14292                    "\xef\xee\xf0\xf3...\"",
14293                    getLLVMStyleWithColumns(12)));
14294 }
14295 
14296 TEST_F(FormatTest, HandlesUTF8BOM) {
14297   EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
14298   EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
14299             format("\xef\xbb\xbf#include <iostream>"));
14300   EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
14301             format("\xef\xbb\xbf\n#include <iostream>"));
14302 }
14303 
14304 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
14305 #if !defined(_MSC_VER)
14306 
14307 TEST_F(FormatTest, CountsUTF8CharactersProperly) {
14308   verifyFormat("\"Однажды в студёную зимнюю пору...\"",
14309                getLLVMStyleWithColumns(35));
14310   verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
14311                getLLVMStyleWithColumns(31));
14312   verifyFormat("// Однажды в студёную зимнюю пору...",
14313                getLLVMStyleWithColumns(36));
14314   verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
14315   verifyFormat("/* Однажды в студёную зимнюю пору... */",
14316                getLLVMStyleWithColumns(39));
14317   verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
14318                getLLVMStyleWithColumns(35));
14319 }
14320 
14321 TEST_F(FormatTest, SplitsUTF8Strings) {
14322   // Non-printable characters' width is currently considered to be the length in
14323   // bytes in UTF8. The characters can be displayed in very different manner
14324   // (zero-width, single width with a substitution glyph, expanded to their code
14325   // (e.g. "<8d>"), so there's no single correct way to handle them.
14326   EXPECT_EQ("\"aaaaÄ\"\n"
14327             "\"\xc2\x8d\";",
14328             format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
14329   EXPECT_EQ("\"aaaaaaaÄ\"\n"
14330             "\"\xc2\x8d\";",
14331             format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
14332   EXPECT_EQ("\"Однажды, в \"\n"
14333             "\"студёную \"\n"
14334             "\"зимнюю \"\n"
14335             "\"пору,\"",
14336             format("\"Однажды, в студёную зимнюю пору,\"",
14337                    getLLVMStyleWithColumns(13)));
14338   EXPECT_EQ(
14339       "\"一 二 三 \"\n"
14340       "\"四 五六 \"\n"
14341       "\"七 八 九 \"\n"
14342       "\"十\"",
14343       format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
14344   EXPECT_EQ("\"一\t\"\n"
14345             "\"二 \t\"\n"
14346             "\"三 四 \"\n"
14347             "\"五\t\"\n"
14348             "\"六 \t\"\n"
14349             "\"七 \"\n"
14350             "\"八九十\tqq\"",
14351             format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
14352                    getLLVMStyleWithColumns(11)));
14353 
14354   // UTF8 character in an escape sequence.
14355   EXPECT_EQ("\"aaaaaa\"\n"
14356             "\"\\\xC2\x8D\"",
14357             format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
14358 }
14359 
14360 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
14361   EXPECT_EQ("const char *sssss =\n"
14362             "    \"一二三四五六七八\\\n"
14363             " 九 十\";",
14364             format("const char *sssss = \"一二三四五六七八\\\n"
14365                    " 九 十\";",
14366                    getLLVMStyleWithColumns(30)));
14367 }
14368 
14369 TEST_F(FormatTest, SplitsUTF8LineComments) {
14370   EXPECT_EQ("// aaaaÄ\xc2\x8d",
14371             format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
14372   EXPECT_EQ("// Я из лесу\n"
14373             "// вышел; был\n"
14374             "// сильный\n"
14375             "// мороз.",
14376             format("// Я из лесу вышел; был сильный мороз.",
14377                    getLLVMStyleWithColumns(13)));
14378   EXPECT_EQ("// 一二三\n"
14379             "// 四五六七\n"
14380             "// 八  九\n"
14381             "// 十",
14382             format("// 一二三 四五六七 八  九 十", getLLVMStyleWithColumns(9)));
14383 }
14384 
14385 TEST_F(FormatTest, SplitsUTF8BlockComments) {
14386   EXPECT_EQ("/* Гляжу,\n"
14387             " * поднимается\n"
14388             " * медленно в\n"
14389             " * гору\n"
14390             " * Лошадка,\n"
14391             " * везущая\n"
14392             " * хворосту\n"
14393             " * воз. */",
14394             format("/* Гляжу, поднимается медленно в гору\n"
14395                    " * Лошадка, везущая хворосту воз. */",
14396                    getLLVMStyleWithColumns(13)));
14397   EXPECT_EQ(
14398       "/* 一二三\n"
14399       " * 四五六七\n"
14400       " * 八  九\n"
14401       " * 十  */",
14402       format("/* 一二三 四五六七 八  九 十  */", getLLVMStyleWithColumns(9)));
14403   EXPECT_EQ("/* �������� ��������\n"
14404             " * ��������\n"
14405             " * ������-�� */",
14406             format("/* �������� �������� �������� ������-�� */", getLLVMStyleWithColumns(12)));
14407 }
14408 
14409 #endif // _MSC_VER
14410 
14411 TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
14412   FormatStyle Style = getLLVMStyle();
14413 
14414   Style.ConstructorInitializerIndentWidth = 4;
14415   verifyFormat(
14416       "SomeClass::Constructor()\n"
14417       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
14418       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
14419       Style);
14420 
14421   Style.ConstructorInitializerIndentWidth = 2;
14422   verifyFormat(
14423       "SomeClass::Constructor()\n"
14424       "  : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
14425       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
14426       Style);
14427 
14428   Style.ConstructorInitializerIndentWidth = 0;
14429   verifyFormat(
14430       "SomeClass::Constructor()\n"
14431       ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
14432       "  aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
14433       Style);
14434   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
14435   verifyFormat(
14436       "SomeLongTemplateVariableName<\n"
14437       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
14438       Style);
14439   verifyFormat("bool smaller = 1 < "
14440                "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
14441                "                       "
14442                "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
14443                Style);
14444 
14445   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
14446   verifyFormat("SomeClass::Constructor() :\n"
14447                "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n"
14448                "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}",
14449                Style);
14450 }
14451 
14452 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
14453   FormatStyle Style = getLLVMStyle();
14454   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
14455   Style.ConstructorInitializerIndentWidth = 4;
14456   verifyFormat("SomeClass::Constructor()\n"
14457                "    : a(a)\n"
14458                "    , b(b)\n"
14459                "    , c(c) {}",
14460                Style);
14461   verifyFormat("SomeClass::Constructor()\n"
14462                "    : a(a) {}",
14463                Style);
14464 
14465   Style.ColumnLimit = 0;
14466   verifyFormat("SomeClass::Constructor()\n"
14467                "    : a(a) {}",
14468                Style);
14469   verifyFormat("SomeClass::Constructor() noexcept\n"
14470                "    : a(a) {}",
14471                Style);
14472   verifyFormat("SomeClass::Constructor()\n"
14473                "    : a(a)\n"
14474                "    , b(b)\n"
14475                "    , c(c) {}",
14476                Style);
14477   verifyFormat("SomeClass::Constructor()\n"
14478                "    : a(a) {\n"
14479                "  foo();\n"
14480                "  bar();\n"
14481                "}",
14482                Style);
14483 
14484   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
14485   verifyFormat("SomeClass::Constructor()\n"
14486                "    : a(a)\n"
14487                "    , b(b)\n"
14488                "    , c(c) {\n}",
14489                Style);
14490   verifyFormat("SomeClass::Constructor()\n"
14491                "    : a(a) {\n}",
14492                Style);
14493 
14494   Style.ColumnLimit = 80;
14495   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
14496   Style.ConstructorInitializerIndentWidth = 2;
14497   verifyFormat("SomeClass::Constructor()\n"
14498                "  : a(a)\n"
14499                "  , b(b)\n"
14500                "  , c(c) {}",
14501                Style);
14502 
14503   Style.ConstructorInitializerIndentWidth = 0;
14504   verifyFormat("SomeClass::Constructor()\n"
14505                ": a(a)\n"
14506                ", b(b)\n"
14507                ", c(c) {}",
14508                Style);
14509 
14510   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
14511   Style.ConstructorInitializerIndentWidth = 4;
14512   verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
14513   verifyFormat(
14514       "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
14515       Style);
14516   verifyFormat(
14517       "SomeClass::Constructor()\n"
14518       "    : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
14519       Style);
14520   Style.ConstructorInitializerIndentWidth = 4;
14521   Style.ColumnLimit = 60;
14522   verifyFormat("SomeClass::Constructor()\n"
14523                "    : aaaaaaaa(aaaaaaaa)\n"
14524                "    , aaaaaaaa(aaaaaaaa)\n"
14525                "    , aaaaaaaa(aaaaaaaa) {}",
14526                Style);
14527 }
14528 
14529 TEST_F(FormatTest, Destructors) {
14530   verifyFormat("void F(int &i) { i.~int(); }");
14531   verifyFormat("void F(int &i) { i->~int(); }");
14532 }
14533 
14534 TEST_F(FormatTest, FormatsWithWebKitStyle) {
14535   FormatStyle Style = getWebKitStyle();
14536 
14537   // Don't indent in outer namespaces.
14538   verifyFormat("namespace outer {\n"
14539                "int i;\n"
14540                "namespace inner {\n"
14541                "    int i;\n"
14542                "} // namespace inner\n"
14543                "} // namespace outer\n"
14544                "namespace other_outer {\n"
14545                "int i;\n"
14546                "}",
14547                Style);
14548 
14549   // Don't indent case labels.
14550   verifyFormat("switch (variable) {\n"
14551                "case 1:\n"
14552                "case 2:\n"
14553                "    doSomething();\n"
14554                "    break;\n"
14555                "default:\n"
14556                "    ++variable;\n"
14557                "}",
14558                Style);
14559 
14560   // Wrap before binary operators.
14561   EXPECT_EQ("void f()\n"
14562             "{\n"
14563             "    if (aaaaaaaaaaaaaaaa\n"
14564             "        && bbbbbbbbbbbbbbbbbbbbbbbb\n"
14565             "        && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
14566             "        return;\n"
14567             "}",
14568             format("void f() {\n"
14569                    "if (aaaaaaaaaaaaaaaa\n"
14570                    "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
14571                    "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
14572                    "return;\n"
14573                    "}",
14574                    Style));
14575 
14576   // Allow functions on a single line.
14577   verifyFormat("void f() { return; }", Style);
14578 
14579   // Allow empty blocks on a single line and insert a space in empty blocks.
14580   EXPECT_EQ("void f() { }", format("void f() {}", Style));
14581   EXPECT_EQ("while (true) { }", format("while (true) {}", Style));
14582   // However, don't merge non-empty short loops.
14583   EXPECT_EQ("while (true) {\n"
14584             "    continue;\n"
14585             "}",
14586             format("while (true) { continue; }", Style));
14587 
14588   // Constructor initializers are formatted one per line with the "," on the
14589   // new line.
14590   verifyFormat("Constructor()\n"
14591                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
14592                "    , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
14593                "          aaaaaaaaaaaaaa)\n"
14594                "    , aaaaaaaaaaaaaaaaaaaaaaa()\n"
14595                "{\n"
14596                "}",
14597                Style);
14598   verifyFormat("SomeClass::Constructor()\n"
14599                "    : a(a)\n"
14600                "{\n"
14601                "}",
14602                Style);
14603   EXPECT_EQ("SomeClass::Constructor()\n"
14604             "    : a(a)\n"
14605             "{\n"
14606             "}",
14607             format("SomeClass::Constructor():a(a){}", Style));
14608   verifyFormat("SomeClass::Constructor()\n"
14609                "    : a(a)\n"
14610                "    , b(b)\n"
14611                "    , c(c)\n"
14612                "{\n"
14613                "}",
14614                Style);
14615   verifyFormat("SomeClass::Constructor()\n"
14616                "    : a(a)\n"
14617                "{\n"
14618                "    foo();\n"
14619                "    bar();\n"
14620                "}",
14621                Style);
14622 
14623   // Access specifiers should be aligned left.
14624   verifyFormat("class C {\n"
14625                "public:\n"
14626                "    int i;\n"
14627                "};",
14628                Style);
14629 
14630   // Do not align comments.
14631   verifyFormat("int a; // Do not\n"
14632                "double b; // align comments.",
14633                Style);
14634 
14635   // Do not align operands.
14636   EXPECT_EQ("ASSERT(aaaa\n"
14637             "    || bbbb);",
14638             format("ASSERT ( aaaa\n||bbbb);", Style));
14639 
14640   // Accept input's line breaks.
14641   EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
14642             "    || bbbbbbbbbbbbbbb) {\n"
14643             "    i++;\n"
14644             "}",
14645             format("if (aaaaaaaaaaaaaaa\n"
14646                    "|| bbbbbbbbbbbbbbb) { i++; }",
14647                    Style));
14648   EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
14649             "    i++;\n"
14650             "}",
14651             format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
14652 
14653   // Don't automatically break all macro definitions (llvm.org/PR17842).
14654   verifyFormat("#define aNumber 10", Style);
14655   // However, generally keep the line breaks that the user authored.
14656   EXPECT_EQ("#define aNumber \\\n"
14657             "    10",
14658             format("#define aNumber \\\n"
14659                    " 10",
14660                    Style));
14661 
14662   // Keep empty and one-element array literals on a single line.
14663   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
14664             "                                  copyItems:YES];",
14665             format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
14666                    "copyItems:YES];",
14667                    Style));
14668   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
14669             "                                  copyItems:YES];",
14670             format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
14671                    "             copyItems:YES];",
14672                    Style));
14673   // FIXME: This does not seem right, there should be more indentation before
14674   // the array literal's entries. Nested blocks have the same problem.
14675   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
14676             "    @\"a\",\n"
14677             "    @\"a\"\n"
14678             "]\n"
14679             "                                  copyItems:YES];",
14680             format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
14681                    "     @\"a\",\n"
14682                    "     @\"a\"\n"
14683                    "     ]\n"
14684                    "       copyItems:YES];",
14685                    Style));
14686   EXPECT_EQ(
14687       "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
14688       "                                  copyItems:YES];",
14689       format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
14690              "   copyItems:YES];",
14691              Style));
14692 
14693   verifyFormat("[self.a b:c c:d];", Style);
14694   EXPECT_EQ("[self.a b:c\n"
14695             "        c:d];",
14696             format("[self.a b:c\n"
14697                    "c:d];",
14698                    Style));
14699 }
14700 
14701 TEST_F(FormatTest, FormatsLambdas) {
14702   verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
14703   verifyFormat(
14704       "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n");
14705   verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
14706   verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
14707   verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
14708   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
14709   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
14710   verifyFormat("auto c = [a = [b = 42] {}] {};\n");
14711   verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
14712   verifyFormat("int x = f(*+[] {});");
14713   verifyFormat("void f() {\n"
14714                "  other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
14715                "}\n");
14716   verifyFormat("void f() {\n"
14717                "  other(x.begin(), //\n"
14718                "        x.end(),   //\n"
14719                "        [&](int, int) { return 1; });\n"
14720                "}\n");
14721   verifyFormat("void f() {\n"
14722                "  other.other.other.other.other(\n"
14723                "      x.begin(), x.end(),\n"
14724                "      [something, rather](int, int, int, int, int, int, int) { "
14725                "return 1; });\n"
14726                "}\n");
14727   verifyFormat(
14728       "void f() {\n"
14729       "  other.other.other.other.other(\n"
14730       "      x.begin(), x.end(),\n"
14731       "      [something, rather](int, int, int, int, int, int, int) {\n"
14732       "        //\n"
14733       "      });\n"
14734       "}\n");
14735   verifyFormat("SomeFunction([]() { // A cool function...\n"
14736                "  return 43;\n"
14737                "});");
14738   EXPECT_EQ("SomeFunction([]() {\n"
14739             "#define A a\n"
14740             "  return 43;\n"
14741             "});",
14742             format("SomeFunction([](){\n"
14743                    "#define A a\n"
14744                    "return 43;\n"
14745                    "});"));
14746   verifyFormat("void f() {\n"
14747                "  SomeFunction([](decltype(x), A *a) {});\n"
14748                "}");
14749   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
14750                "    [](const aaaaaaaaaa &a) { return a; });");
14751   verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
14752                "  SomeOtherFunctioooooooooooooooooooooooooon();\n"
14753                "});");
14754   verifyFormat("Constructor()\n"
14755                "    : Field([] { // comment\n"
14756                "        int i;\n"
14757                "      }) {}");
14758   verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
14759                "  return some_parameter.size();\n"
14760                "};");
14761   verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
14762                "    [](const string &s) { return s; };");
14763   verifyFormat("int i = aaaaaa ? 1 //\n"
14764                "               : [] {\n"
14765                "                   return 2; //\n"
14766                "                 }();");
14767   verifyFormat("llvm::errs() << \"number of twos is \"\n"
14768                "             << std::count_if(v.begin(), v.end(), [](int x) {\n"
14769                "                  return x == 2; // force break\n"
14770                "                });");
14771   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
14772                "    [=](int iiiiiiiiiiii) {\n"
14773                "      return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
14774                "             aaaaaaaaaaaaaaaaaaaaaaa;\n"
14775                "    });",
14776                getLLVMStyleWithColumns(60));
14777   verifyFormat("SomeFunction({[&] {\n"
14778                "                // comment\n"
14779                "              },\n"
14780                "              [&] {\n"
14781                "                // comment\n"
14782                "              }});");
14783   verifyFormat("SomeFunction({[&] {\n"
14784                "  // comment\n"
14785                "}});");
14786   verifyFormat(
14787       "virtual aaaaaaaaaaaaaaaa(\n"
14788       "    std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n"
14789       "    aaaaa aaaaaaaaa);");
14790 
14791   // Lambdas with return types.
14792   verifyFormat("int c = []() -> int { return 2; }();\n");
14793   verifyFormat("int c = []() -> int * { return 2; }();\n");
14794   verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
14795   verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
14796   verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
14797   verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
14798   verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
14799   verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
14800   verifyFormat("[a, a]() -> a<1> {};");
14801   verifyFormat("[]() -> foo<5 + 2> { return {}; };");
14802   verifyFormat("[]() -> foo<5 - 2> { return {}; };");
14803   verifyFormat("[]() -> foo<5 / 2> { return {}; };");
14804   verifyFormat("[]() -> foo<5 * 2> { return {}; };");
14805   verifyFormat("[]() -> foo<5 % 2> { return {}; };");
14806   verifyFormat("[]() -> foo<5 << 2> { return {}; };");
14807   verifyFormat("[]() -> foo<!5> { return {}; };");
14808   verifyFormat("[]() -> foo<~5> { return {}; };");
14809   verifyFormat("[]() -> foo<5 | 2> { return {}; };");
14810   verifyFormat("[]() -> foo<5 || 2> { return {}; };");
14811   verifyFormat("[]() -> foo<5 & 2> { return {}; };");
14812   verifyFormat("[]() -> foo<5 && 2> { return {}; };");
14813   verifyFormat("[]() -> foo<5 == 2> { return {}; };");
14814   verifyFormat("[]() -> foo<5 != 2> { return {}; };");
14815   verifyFormat("[]() -> foo<5 >= 2> { return {}; };");
14816   verifyFormat("[]() -> foo<5 <= 2> { return {}; };");
14817   verifyFormat("[]() -> foo<5 < 2> { return {}; };");
14818   verifyFormat("[]() -> foo<2 ? 1 : 0> { return {}; };");
14819   verifyFormat("namespace bar {\n"
14820                "// broken:\n"
14821                "auto foo{[]() -> foo<5 + 2> { return {}; }};\n"
14822                "} // namespace bar");
14823   verifyFormat("namespace bar {\n"
14824                "// broken:\n"
14825                "auto foo{[]() -> foo<5 - 2> { return {}; }};\n"
14826                "} // namespace bar");
14827   verifyFormat("namespace bar {\n"
14828                "// broken:\n"
14829                "auto foo{[]() -> foo<5 / 2> { return {}; }};\n"
14830                "} // namespace bar");
14831   verifyFormat("namespace bar {\n"
14832                "// broken:\n"
14833                "auto foo{[]() -> foo<5 * 2> { return {}; }};\n"
14834                "} // namespace bar");
14835   verifyFormat("namespace bar {\n"
14836                "// broken:\n"
14837                "auto foo{[]() -> foo<5 % 2> { return {}; }};\n"
14838                "} // namespace bar");
14839   verifyFormat("namespace bar {\n"
14840                "// broken:\n"
14841                "auto foo{[]() -> foo<5 << 2> { return {}; }};\n"
14842                "} // namespace bar");
14843   verifyFormat("namespace bar {\n"
14844                "// broken:\n"
14845                "auto foo{[]() -> foo<!5> { return {}; }};\n"
14846                "} // namespace bar");
14847   verifyFormat("namespace bar {\n"
14848                "// broken:\n"
14849                "auto foo{[]() -> foo<~5> { return {}; }};\n"
14850                "} // namespace bar");
14851   verifyFormat("namespace bar {\n"
14852                "// broken:\n"
14853                "auto foo{[]() -> foo<5 | 2> { return {}; }};\n"
14854                "} // namespace bar");
14855   verifyFormat("namespace bar {\n"
14856                "// broken:\n"
14857                "auto foo{[]() -> foo<5 || 2> { return {}; }};\n"
14858                "} // namespace bar");
14859   verifyFormat("namespace bar {\n"
14860                "// broken:\n"
14861                "auto foo{[]() -> foo<5 & 2> { return {}; }};\n"
14862                "} // namespace bar");
14863   verifyFormat("namespace bar {\n"
14864                "// broken:\n"
14865                "auto foo{[]() -> foo<5 && 2> { return {}; }};\n"
14866                "} // namespace bar");
14867   verifyFormat("namespace bar {\n"
14868                "// broken:\n"
14869                "auto foo{[]() -> foo<5 == 2> { return {}; }};\n"
14870                "} // namespace bar");
14871   verifyFormat("namespace bar {\n"
14872                "// broken:\n"
14873                "auto foo{[]() -> foo<5 != 2> { return {}; }};\n"
14874                "} // namespace bar");
14875   verifyFormat("namespace bar {\n"
14876                "// broken:\n"
14877                "auto foo{[]() -> foo<5 >= 2> { return {}; }};\n"
14878                "} // namespace bar");
14879   verifyFormat("namespace bar {\n"
14880                "// broken:\n"
14881                "auto foo{[]() -> foo<5 <= 2> { return {}; }};\n"
14882                "} // namespace bar");
14883   verifyFormat("namespace bar {\n"
14884                "// broken:\n"
14885                "auto foo{[]() -> foo<5 < 2> { return {}; }};\n"
14886                "} // namespace bar");
14887   verifyFormat("namespace bar {\n"
14888                "// broken:\n"
14889                "auto foo{[]() -> foo<2 ? 1 : 0> { return {}; }};\n"
14890                "} // namespace bar");
14891   verifyFormat("[]() -> a<1> {};");
14892   verifyFormat("[]() -> a<1> { ; };");
14893   verifyFormat("[]() -> a<1> { ; }();");
14894   verifyFormat("[a, a]() -> a<true> {};");
14895   verifyFormat("[]() -> a<true> {};");
14896   verifyFormat("[]() -> a<true> { ; };");
14897   verifyFormat("[]() -> a<true> { ; }();");
14898   verifyFormat("[a, a]() -> a<false> {};");
14899   verifyFormat("[]() -> a<false> {};");
14900   verifyFormat("[]() -> a<false> { ; };");
14901   verifyFormat("[]() -> a<false> { ; }();");
14902   verifyFormat("auto foo{[]() -> foo<false> { ; }};");
14903   verifyFormat("namespace bar {\n"
14904                "auto foo{[]() -> foo<false> { ; }};\n"
14905                "} // namespace bar");
14906   verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
14907                "                   int j) -> int {\n"
14908                "  return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
14909                "};");
14910   verifyFormat(
14911       "aaaaaaaaaaaaaaaaaaaaaa(\n"
14912       "    [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
14913       "      return aaaaaaaaaaaaaaaaa;\n"
14914       "    });",
14915       getLLVMStyleWithColumns(70));
14916   verifyFormat("[]() //\n"
14917                "    -> int {\n"
14918                "  return 1; //\n"
14919                "};");
14920   verifyFormat("[]() -> Void<T...> {};");
14921   verifyFormat("[a, b]() -> Tuple<T...> { return {}; };");
14922 
14923   // Lambdas with explicit template argument lists.
14924   verifyFormat(
14925       "auto L = []<template <typename> class T, class U>(T<U> &&a) {};\n");
14926 
14927   // Multiple lambdas in the same parentheses change indentation rules. These
14928   // lambdas are forced to start on new lines.
14929   verifyFormat("SomeFunction(\n"
14930                "    []() {\n"
14931                "      //\n"
14932                "    },\n"
14933                "    []() {\n"
14934                "      //\n"
14935                "    });");
14936 
14937   // A lambda passed as arg0 is always pushed to the next line.
14938   verifyFormat("SomeFunction(\n"
14939                "    [this] {\n"
14940                "      //\n"
14941                "    },\n"
14942                "    1);\n");
14943 
14944   // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like
14945   // the arg0 case above.
14946   auto Style = getGoogleStyle();
14947   Style.BinPackArguments = false;
14948   verifyFormat("SomeFunction(\n"
14949                "    a,\n"
14950                "    [this] {\n"
14951                "      //\n"
14952                "    },\n"
14953                "    b);\n",
14954                Style);
14955   verifyFormat("SomeFunction(\n"
14956                "    a,\n"
14957                "    [this] {\n"
14958                "      //\n"
14959                "    },\n"
14960                "    b);\n");
14961 
14962   // A lambda with a very long line forces arg0 to be pushed out irrespective of
14963   // the BinPackArguments value (as long as the code is wide enough).
14964   verifyFormat(
14965       "something->SomeFunction(\n"
14966       "    a,\n"
14967       "    [this] {\n"
14968       "      "
14969       "D0000000000000000000000000000000000000000000000000000000000001();\n"
14970       "    },\n"
14971       "    b);\n");
14972 
14973   // A multi-line lambda is pulled up as long as the introducer fits on the
14974   // previous line and there are no further args.
14975   verifyFormat("function(1, [this, that] {\n"
14976                "  //\n"
14977                "});\n");
14978   verifyFormat("function([this, that] {\n"
14979                "  //\n"
14980                "});\n");
14981   // FIXME: this format is not ideal and we should consider forcing the first
14982   // arg onto its own line.
14983   verifyFormat("function(a, b, c, //\n"
14984                "         d, [this, that] {\n"
14985                "           //\n"
14986                "         });\n");
14987 
14988   // Multiple lambdas are treated correctly even when there is a short arg0.
14989   verifyFormat("SomeFunction(\n"
14990                "    1,\n"
14991                "    [this] {\n"
14992                "      //\n"
14993                "    },\n"
14994                "    [this] {\n"
14995                "      //\n"
14996                "    },\n"
14997                "    1);\n");
14998 
14999   // More complex introducers.
15000   verifyFormat("return [i, args...] {};");
15001 
15002   // Not lambdas.
15003   verifyFormat("constexpr char hello[]{\"hello\"};");
15004   verifyFormat("double &operator[](int i) { return 0; }\n"
15005                "int i;");
15006   verifyFormat("std::unique_ptr<int[]> foo() {}");
15007   verifyFormat("int i = a[a][a]->f();");
15008   verifyFormat("int i = (*b)[a]->f();");
15009 
15010   // Other corner cases.
15011   verifyFormat("void f() {\n"
15012                "  bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
15013                "  );\n"
15014                "}");
15015 
15016   // Lambdas created through weird macros.
15017   verifyFormat("void f() {\n"
15018                "  MACRO((const AA &a) { return 1; });\n"
15019                "  MACRO((AA &a) { return 1; });\n"
15020                "}");
15021 
15022   verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
15023                "      doo_dah();\n"
15024                "      doo_dah();\n"
15025                "    })) {\n"
15026                "}");
15027   verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
15028                "                doo_dah();\n"
15029                "                doo_dah();\n"
15030                "              })) {\n"
15031                "}");
15032   verifyFormat("if CONSTEXPR (blah_blah(whatever, whatever, [] {\n"
15033                "                doo_dah();\n"
15034                "                doo_dah();\n"
15035                "              })) {\n"
15036                "}");
15037   verifyFormat("auto lambda = []() {\n"
15038                "  int a = 2\n"
15039                "#if A\n"
15040                "          + 2\n"
15041                "#endif\n"
15042                "      ;\n"
15043                "};");
15044 
15045   // Lambdas with complex multiline introducers.
15046   verifyFormat(
15047       "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
15048       "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
15049       "        -> ::std::unordered_set<\n"
15050       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
15051       "      //\n"
15052       "    });");
15053 
15054   FormatStyle DoNotMerge = getLLVMStyle();
15055   DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None;
15056   verifyFormat("auto c = []() {\n"
15057                "  return b;\n"
15058                "};",
15059                "auto c = []() { return b; };", DoNotMerge);
15060   verifyFormat("auto c = []() {\n"
15061                "};",
15062                " auto c = []() {};", DoNotMerge);
15063 
15064   FormatStyle MergeEmptyOnly = getLLVMStyle();
15065   MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty;
15066   verifyFormat("auto c = []() {\n"
15067                "  return b;\n"
15068                "};",
15069                "auto c = []() {\n"
15070                "  return b;\n"
15071                " };",
15072                MergeEmptyOnly);
15073   verifyFormat("auto c = []() {};",
15074                "auto c = []() {\n"
15075                "};",
15076                MergeEmptyOnly);
15077 
15078   FormatStyle MergeInline = getLLVMStyle();
15079   MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline;
15080   verifyFormat("auto c = []() {\n"
15081                "  return b;\n"
15082                "};",
15083                "auto c = []() { return b; };", MergeInline);
15084   verifyFormat("function([]() { return b; })", "function([]() { return b; })",
15085                MergeInline);
15086   verifyFormat("function([]() { return b; }, a)",
15087                "function([]() { return b; }, a)", MergeInline);
15088   verifyFormat("function(a, []() { return b; })",
15089                "function(a, []() { return b; })", MergeInline);
15090 
15091   // Check option "BraceWrapping.BeforeLambdaBody" and different state of
15092   // AllowShortLambdasOnASingleLine
15093   FormatStyle LLVMWithBeforeLambdaBody = getLLVMStyle();
15094   LLVMWithBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom;
15095   LLVMWithBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true;
15096   LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine =
15097       FormatStyle::ShortLambdaStyle::SLS_None;
15098   verifyFormat("FctWithOneNestedLambdaInline_SLS_None(\n"
15099                "    []()\n"
15100                "    {\n"
15101                "      return 17;\n"
15102                "    });",
15103                LLVMWithBeforeLambdaBody);
15104   verifyFormat("FctWithOneNestedLambdaEmpty_SLS_None(\n"
15105                "    []()\n"
15106                "    {\n"
15107                "    });",
15108                LLVMWithBeforeLambdaBody);
15109   verifyFormat("auto fct_SLS_None = []()\n"
15110                "{\n"
15111                "  return 17;\n"
15112                "};",
15113                LLVMWithBeforeLambdaBody);
15114   verifyFormat("TwoNestedLambdas_SLS_None(\n"
15115                "    []()\n"
15116                "    {\n"
15117                "      return Call(\n"
15118                "          []()\n"
15119                "          {\n"
15120                "            return 17;\n"
15121                "          });\n"
15122                "    });",
15123                LLVMWithBeforeLambdaBody);
15124   verifyFormat("void Fct()\n"
15125                "{\n"
15126                "  return {[]()\n"
15127                "          {\n"
15128                "            return 17;\n"
15129                "          }};\n"
15130                "}",
15131                LLVMWithBeforeLambdaBody);
15132 
15133   LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine =
15134       FormatStyle::ShortLambdaStyle::SLS_Empty;
15135   verifyFormat("FctWithOneNestedLambdaInline_SLS_Empty(\n"
15136                "    []()\n"
15137                "    {\n"
15138                "      return 17;\n"
15139                "    });",
15140                LLVMWithBeforeLambdaBody);
15141   verifyFormat("FctWithOneNestedLambdaEmpty_SLS_Empty([]() {});",
15142                LLVMWithBeforeLambdaBody);
15143   verifyFormat("FctWithOneNestedLambdaEmptyInsideAVeryVeryVeryVeryVeryVeryVeryL"
15144                "ongFunctionName_SLS_Empty(\n"
15145                "    []() {});",
15146                LLVMWithBeforeLambdaBody);
15147   verifyFormat("FctWithMultipleParams_SLS_Empty(A, B,\n"
15148                "                                []()\n"
15149                "                                {\n"
15150                "                                  return 17;\n"
15151                "                                });",
15152                LLVMWithBeforeLambdaBody);
15153   verifyFormat("auto fct_SLS_Empty = []()\n"
15154                "{\n"
15155                "  return 17;\n"
15156                "};",
15157                LLVMWithBeforeLambdaBody);
15158   verifyFormat("TwoNestedLambdas_SLS_Empty(\n"
15159                "    []()\n"
15160                "    {\n"
15161                "      return Call([]() {});\n"
15162                "    });",
15163                LLVMWithBeforeLambdaBody);
15164   verifyFormat("TwoNestedLambdas_SLS_Empty(A,\n"
15165                "                           []()\n"
15166                "                           {\n"
15167                "                             return Call([]() {});\n"
15168                "                           });",
15169                LLVMWithBeforeLambdaBody);
15170   verifyFormat(
15171       "FctWithLongLineInLambda_SLS_Empty(\n"
15172       "    []()\n"
15173       "    {\n"
15174       "      return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n"
15175       "                               AndShouldNotBeConsiderAsInline,\n"
15176       "                               LambdaBodyMustBeBreak);\n"
15177       "    });",
15178       LLVMWithBeforeLambdaBody);
15179 
15180   LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine =
15181       FormatStyle::ShortLambdaStyle::SLS_Inline;
15182   verifyFormat("FctWithOneNestedLambdaInline_SLS_Inline([]() { return 17; });",
15183                LLVMWithBeforeLambdaBody);
15184   verifyFormat("FctWithOneNestedLambdaEmpty_SLS_Inline([]() {});",
15185                LLVMWithBeforeLambdaBody);
15186   verifyFormat("auto fct_SLS_Inline = []()\n"
15187                "{\n"
15188                "  return 17;\n"
15189                "};",
15190                LLVMWithBeforeLambdaBody);
15191   verifyFormat("TwoNestedLambdas_SLS_Inline([]() { return Call([]() { return "
15192                "17; }); });",
15193                LLVMWithBeforeLambdaBody);
15194   verifyFormat(
15195       "FctWithLongLineInLambda_SLS_Inline(\n"
15196       "    []()\n"
15197       "    {\n"
15198       "      return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n"
15199       "                               AndShouldNotBeConsiderAsInline,\n"
15200       "                               LambdaBodyMustBeBreak);\n"
15201       "    });",
15202       LLVMWithBeforeLambdaBody);
15203   verifyFormat("FctWithMultipleParams_SLS_Inline("
15204                "VeryLongParameterThatShouldAskToBeOnMultiLine,\n"
15205                "                                 []() { return 17; });",
15206                LLVMWithBeforeLambdaBody);
15207   verifyFormat(
15208       "FctWithMultipleParams_SLS_Inline(FirstParam, []() { return 17; });",
15209       LLVMWithBeforeLambdaBody);
15210 
15211   LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine =
15212       FormatStyle::ShortLambdaStyle::SLS_All;
15213   verifyFormat("FctWithOneNestedLambdaInline_SLS_All([]() { return 17; });",
15214                LLVMWithBeforeLambdaBody);
15215   verifyFormat("FctWithOneNestedLambdaEmpty_SLS_All([]() {});",
15216                LLVMWithBeforeLambdaBody);
15217   verifyFormat("auto fct_SLS_All = []() { return 17; };",
15218                LLVMWithBeforeLambdaBody);
15219   verifyFormat("FctWithOneParam_SLS_All(\n"
15220                "    []()\n"
15221                "    {\n"
15222                "      // A cool function...\n"
15223                "      return 43;\n"
15224                "    });",
15225                LLVMWithBeforeLambdaBody);
15226   verifyFormat("FctWithMultipleParams_SLS_All("
15227                "VeryLongParameterThatShouldAskToBeOnMultiLine,\n"
15228                "                              []() { return 17; });",
15229                LLVMWithBeforeLambdaBody);
15230   verifyFormat("FctWithMultipleParams_SLS_All(A, []() { return 17; });",
15231                LLVMWithBeforeLambdaBody);
15232   verifyFormat("FctWithMultipleParams_SLS_All(A, B, []() { return 17; });",
15233                LLVMWithBeforeLambdaBody);
15234   verifyFormat(
15235       "FctWithLongLineInLambda_SLS_All(\n"
15236       "    []()\n"
15237       "    {\n"
15238       "      return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n"
15239       "                               AndShouldNotBeConsiderAsInline,\n"
15240       "                               LambdaBodyMustBeBreak);\n"
15241       "    });",
15242       LLVMWithBeforeLambdaBody);
15243   verifyFormat(
15244       "auto fct_SLS_All = []()\n"
15245       "{\n"
15246       "  return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n"
15247       "                           AndShouldNotBeConsiderAsInline,\n"
15248       "                           LambdaBodyMustBeBreak);\n"
15249       "};",
15250       LLVMWithBeforeLambdaBody);
15251   LLVMWithBeforeLambdaBody.BinPackParameters = false;
15252   verifyFormat("FctAllOnSameLine_SLS_All([]() { return S; }, Fst, Second);",
15253                LLVMWithBeforeLambdaBody);
15254   verifyFormat(
15255       "FctWithLongLineInLambda_SLS_All([]() { return SomeValueNotSoLong; },\n"
15256       "                                FirstParam,\n"
15257       "                                SecondParam,\n"
15258       "                                ThirdParam,\n"
15259       "                                FourthParam);",
15260       LLVMWithBeforeLambdaBody);
15261   verifyFormat("FctWithLongLineInLambda_SLS_All(\n"
15262                "    []() { return "
15263                "SomeValueVeryVeryVeryVeryVeryVeryVeryVeryVeryLong; },\n"
15264                "    FirstParam,\n"
15265                "    SecondParam,\n"
15266                "    ThirdParam,\n"
15267                "    FourthParam);",
15268                LLVMWithBeforeLambdaBody);
15269   verifyFormat(
15270       "FctWithLongLineInLambda_SLS_All(FirstParam,\n"
15271       "                                SecondParam,\n"
15272       "                                ThirdParam,\n"
15273       "                                FourthParam,\n"
15274       "                                []() { return SomeValueNotSoLong; });",
15275       LLVMWithBeforeLambdaBody);
15276   verifyFormat("FctWithLongLineInLambda_SLS_All(\n"
15277                "    []()\n"
15278                "    {\n"
15279                "      return "
15280                "HereAVeryLongLineThatWillBeFormattedOnMultipleLineAndShouldNotB"
15281                "eConsiderAsInline;\n"
15282                "    });",
15283                LLVMWithBeforeLambdaBody);
15284   verifyFormat(
15285       "FctWithLongLineInLambda_SLS_All(\n"
15286       "    []()\n"
15287       "    {\n"
15288       "      return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n"
15289       "                               AndShouldNotBeConsiderAsInline,\n"
15290       "                               LambdaBodyMustBeBreak);\n"
15291       "    });",
15292       LLVMWithBeforeLambdaBody);
15293   verifyFormat("FctWithTwoParams_SLS_All(\n"
15294                "    []()\n"
15295                "    {\n"
15296                "      // A cool function...\n"
15297                "      return 43;\n"
15298                "    },\n"
15299                "    87);",
15300                LLVMWithBeforeLambdaBody);
15301   verifyFormat("FctWithTwoParams_SLS_All([]() { return 43; }, 87);",
15302                LLVMWithBeforeLambdaBody);
15303   verifyFormat("FctWithOneNestedLambdas_SLS_All([]() { return 17; });",
15304                LLVMWithBeforeLambdaBody);
15305   verifyFormat(
15306       "TwoNestedLambdas_SLS_All([]() { return Call([]() { return 17; }); });",
15307       LLVMWithBeforeLambdaBody);
15308   verifyFormat("TwoNestedLambdas_SLS_All([]() { return Call([]() { return 17; "
15309                "}); }, x);",
15310                LLVMWithBeforeLambdaBody);
15311   verifyFormat("TwoNestedLambdas_SLS_All(\n"
15312                "    []()\n"
15313                "    {\n"
15314                "      // A cool function...\n"
15315                "      return Call([]() { return 17; });\n"
15316                "    });",
15317                LLVMWithBeforeLambdaBody);
15318   verifyFormat("TwoNestedLambdas_SLS_All(\n"
15319                "    []()\n"
15320                "    {\n"
15321                "      return Call(\n"
15322                "          []()\n"
15323                "          {\n"
15324                "            // A cool function...\n"
15325                "            return 17;\n"
15326                "          });\n"
15327                "    });",
15328                LLVMWithBeforeLambdaBody);
15329 }
15330 
15331 TEST_F(FormatTest, LambdaWithLineComments) {
15332   FormatStyle LLVMWithBeforeLambdaBody = getLLVMStyle();
15333   LLVMWithBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom;
15334   LLVMWithBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true;
15335   LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine =
15336       FormatStyle::ShortLambdaStyle::SLS_All;
15337 
15338   verifyFormat("auto k = []() { return; }", LLVMWithBeforeLambdaBody);
15339   verifyFormat("auto k = []() // comment\n"
15340                "{ return; }",
15341                LLVMWithBeforeLambdaBody);
15342   verifyFormat("auto k = []() /* comment */ { return; }",
15343                LLVMWithBeforeLambdaBody);
15344   verifyFormat("auto k = []() /* comment */ /* comment */ { return; }",
15345                LLVMWithBeforeLambdaBody);
15346   verifyFormat("auto k = []() // X\n"
15347                "{ return; }",
15348                LLVMWithBeforeLambdaBody);
15349   verifyFormat(
15350       "auto k = []() // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"
15351       "{ return; }",
15352       LLVMWithBeforeLambdaBody);
15353 }
15354 
15355 TEST_F(FormatTest, EmptyLinesInLambdas) {
15356   verifyFormat("auto lambda = []() {\n"
15357                "  x(); //\n"
15358                "};",
15359                "auto lambda = []() {\n"
15360                "\n"
15361                "  x(); //\n"
15362                "\n"
15363                "};");
15364 }
15365 
15366 TEST_F(FormatTest, FormatsBlocks) {
15367   FormatStyle ShortBlocks = getLLVMStyle();
15368   ShortBlocks.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always;
15369   verifyFormat("int (^Block)(int, int);", ShortBlocks);
15370   verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
15371   verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
15372   verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
15373   verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
15374   verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
15375 
15376   verifyFormat("foo(^{ bar(); });", ShortBlocks);
15377   verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
15378   verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
15379 
15380   verifyFormat("[operation setCompletionBlock:^{\n"
15381                "  [self onOperationDone];\n"
15382                "}];");
15383   verifyFormat("int i = {[operation setCompletionBlock:^{\n"
15384                "  [self onOperationDone];\n"
15385                "}]};");
15386   verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
15387                "  f();\n"
15388                "}];");
15389   verifyFormat("int a = [operation block:^int(int *i) {\n"
15390                "  return 1;\n"
15391                "}];");
15392   verifyFormat("[myObject doSomethingWith:arg1\n"
15393                "                      aaa:^int(int *a) {\n"
15394                "                        return 1;\n"
15395                "                      }\n"
15396                "                      bbb:f(a * bbbbbbbb)];");
15397 
15398   verifyFormat("[operation setCompletionBlock:^{\n"
15399                "  [self.delegate newDataAvailable];\n"
15400                "}];",
15401                getLLVMStyleWithColumns(60));
15402   verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
15403                "  NSString *path = [self sessionFilePath];\n"
15404                "  if (path) {\n"
15405                "    // ...\n"
15406                "  }\n"
15407                "});");
15408   verifyFormat("[[SessionService sharedService]\n"
15409                "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
15410                "      if (window) {\n"
15411                "        [self windowDidLoad:window];\n"
15412                "      } else {\n"
15413                "        [self errorLoadingWindow];\n"
15414                "      }\n"
15415                "    }];");
15416   verifyFormat("void (^largeBlock)(void) = ^{\n"
15417                "  // ...\n"
15418                "};\n",
15419                getLLVMStyleWithColumns(40));
15420   verifyFormat("[[SessionService sharedService]\n"
15421                "    loadWindowWithCompletionBlock: //\n"
15422                "        ^(SessionWindow *window) {\n"
15423                "          if (window) {\n"
15424                "            [self windowDidLoad:window];\n"
15425                "          } else {\n"
15426                "            [self errorLoadingWindow];\n"
15427                "          }\n"
15428                "        }];",
15429                getLLVMStyleWithColumns(60));
15430   verifyFormat("[myObject doSomethingWith:arg1\n"
15431                "    firstBlock:^(Foo *a) {\n"
15432                "      // ...\n"
15433                "      int i;\n"
15434                "    }\n"
15435                "    secondBlock:^(Bar *b) {\n"
15436                "      // ...\n"
15437                "      int i;\n"
15438                "    }\n"
15439                "    thirdBlock:^Foo(Bar *b) {\n"
15440                "      // ...\n"
15441                "      int i;\n"
15442                "    }];");
15443   verifyFormat("[myObject doSomethingWith:arg1\n"
15444                "               firstBlock:-1\n"
15445                "              secondBlock:^(Bar *b) {\n"
15446                "                // ...\n"
15447                "                int i;\n"
15448                "              }];");
15449 
15450   verifyFormat("f(^{\n"
15451                "  @autoreleasepool {\n"
15452                "    if (a) {\n"
15453                "      g();\n"
15454                "    }\n"
15455                "  }\n"
15456                "});");
15457   verifyFormat("Block b = ^int *(A *a, B *b) {}");
15458   verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
15459                "};");
15460 
15461   FormatStyle FourIndent = getLLVMStyle();
15462   FourIndent.ObjCBlockIndentWidth = 4;
15463   verifyFormat("[operation setCompletionBlock:^{\n"
15464                "    [self onOperationDone];\n"
15465                "}];",
15466                FourIndent);
15467 }
15468 
15469 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
15470   FormatStyle ZeroColumn = getLLVMStyle();
15471   ZeroColumn.ColumnLimit = 0;
15472 
15473   verifyFormat("[[SessionService sharedService] "
15474                "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
15475                "  if (window) {\n"
15476                "    [self windowDidLoad:window];\n"
15477                "  } else {\n"
15478                "    [self errorLoadingWindow];\n"
15479                "  }\n"
15480                "}];",
15481                ZeroColumn);
15482   EXPECT_EQ("[[SessionService sharedService]\n"
15483             "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
15484             "      if (window) {\n"
15485             "        [self windowDidLoad:window];\n"
15486             "      } else {\n"
15487             "        [self errorLoadingWindow];\n"
15488             "      }\n"
15489             "    }];",
15490             format("[[SessionService sharedService]\n"
15491                    "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
15492                    "                if (window) {\n"
15493                    "    [self windowDidLoad:window];\n"
15494                    "  } else {\n"
15495                    "    [self errorLoadingWindow];\n"
15496                    "  }\n"
15497                    "}];",
15498                    ZeroColumn));
15499   verifyFormat("[myObject doSomethingWith:arg1\n"
15500                "    firstBlock:^(Foo *a) {\n"
15501                "      // ...\n"
15502                "      int i;\n"
15503                "    }\n"
15504                "    secondBlock:^(Bar *b) {\n"
15505                "      // ...\n"
15506                "      int i;\n"
15507                "    }\n"
15508                "    thirdBlock:^Foo(Bar *b) {\n"
15509                "      // ...\n"
15510                "      int i;\n"
15511                "    }];",
15512                ZeroColumn);
15513   verifyFormat("f(^{\n"
15514                "  @autoreleasepool {\n"
15515                "    if (a) {\n"
15516                "      g();\n"
15517                "    }\n"
15518                "  }\n"
15519                "});",
15520                ZeroColumn);
15521   verifyFormat("void (^largeBlock)(void) = ^{\n"
15522                "  // ...\n"
15523                "};",
15524                ZeroColumn);
15525 
15526   ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always;
15527   EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
15528             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
15529   ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never;
15530   EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
15531             "  int i;\n"
15532             "};",
15533             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
15534 }
15535 
15536 TEST_F(FormatTest, SupportsCRLF) {
15537   EXPECT_EQ("int a;\r\n"
15538             "int b;\r\n"
15539             "int c;\r\n",
15540             format("int a;\r\n"
15541                    "  int b;\r\n"
15542                    "    int c;\r\n",
15543                    getLLVMStyle()));
15544   EXPECT_EQ("int a;\r\n"
15545             "int b;\r\n"
15546             "int c;\r\n",
15547             format("int a;\r\n"
15548                    "  int b;\n"
15549                    "    int c;\r\n",
15550                    getLLVMStyle()));
15551   EXPECT_EQ("int a;\n"
15552             "int b;\n"
15553             "int c;\n",
15554             format("int a;\r\n"
15555                    "  int b;\n"
15556                    "    int c;\n",
15557                    getLLVMStyle()));
15558   EXPECT_EQ("\"aaaaaaa \"\r\n"
15559             "\"bbbbbbb\";\r\n",
15560             format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
15561   EXPECT_EQ("#define A \\\r\n"
15562             "  b;      \\\r\n"
15563             "  c;      \\\r\n"
15564             "  d;\r\n",
15565             format("#define A \\\r\n"
15566                    "  b; \\\r\n"
15567                    "  c; d; \r\n",
15568                    getGoogleStyle()));
15569 
15570   EXPECT_EQ("/*\r\n"
15571             "multi line block comments\r\n"
15572             "should not introduce\r\n"
15573             "an extra carriage return\r\n"
15574             "*/\r\n",
15575             format("/*\r\n"
15576                    "multi line block comments\r\n"
15577                    "should not introduce\r\n"
15578                    "an extra carriage return\r\n"
15579                    "*/\r\n"));
15580   EXPECT_EQ("/*\r\n"
15581             "\r\n"
15582             "*/",
15583             format("/*\r\n"
15584                    "    \r\r\r\n"
15585                    "*/"));
15586 
15587   FormatStyle style = getLLVMStyle();
15588 
15589   style.DeriveLineEnding = true;
15590   style.UseCRLF = false;
15591   EXPECT_EQ("union FooBarBazQux {\n"
15592             "  int foo;\n"
15593             "  int bar;\n"
15594             "  int baz;\n"
15595             "};",
15596             format("union FooBarBazQux {\r\n"
15597                    "  int foo;\n"
15598                    "  int bar;\r\n"
15599                    "  int baz;\n"
15600                    "};",
15601                    style));
15602   style.UseCRLF = true;
15603   EXPECT_EQ("union FooBarBazQux {\r\n"
15604             "  int foo;\r\n"
15605             "  int bar;\r\n"
15606             "  int baz;\r\n"
15607             "};",
15608             format("union FooBarBazQux {\r\n"
15609                    "  int foo;\n"
15610                    "  int bar;\r\n"
15611                    "  int baz;\n"
15612                    "};",
15613                    style));
15614 
15615   style.DeriveLineEnding = false;
15616   style.UseCRLF = false;
15617   EXPECT_EQ("union FooBarBazQux {\n"
15618             "  int foo;\n"
15619             "  int bar;\n"
15620             "  int baz;\n"
15621             "  int qux;\n"
15622             "};",
15623             format("union FooBarBazQux {\r\n"
15624                    "  int foo;\n"
15625                    "  int bar;\r\n"
15626                    "  int baz;\n"
15627                    "  int qux;\r\n"
15628                    "};",
15629                    style));
15630   style.UseCRLF = true;
15631   EXPECT_EQ("union FooBarBazQux {\r\n"
15632             "  int foo;\r\n"
15633             "  int bar;\r\n"
15634             "  int baz;\r\n"
15635             "  int qux;\r\n"
15636             "};",
15637             format("union FooBarBazQux {\r\n"
15638                    "  int foo;\n"
15639                    "  int bar;\r\n"
15640                    "  int baz;\n"
15641                    "  int qux;\n"
15642                    "};",
15643                    style));
15644 
15645   style.DeriveLineEnding = true;
15646   style.UseCRLF = false;
15647   EXPECT_EQ("union FooBarBazQux {\r\n"
15648             "  int foo;\r\n"
15649             "  int bar;\r\n"
15650             "  int baz;\r\n"
15651             "  int qux;\r\n"
15652             "};",
15653             format("union FooBarBazQux {\r\n"
15654                    "  int foo;\n"
15655                    "  int bar;\r\n"
15656                    "  int baz;\n"
15657                    "  int qux;\r\n"
15658                    "};",
15659                    style));
15660   style.UseCRLF = true;
15661   EXPECT_EQ("union FooBarBazQux {\n"
15662             "  int foo;\n"
15663             "  int bar;\n"
15664             "  int baz;\n"
15665             "  int qux;\n"
15666             "};",
15667             format("union FooBarBazQux {\r\n"
15668                    "  int foo;\n"
15669                    "  int bar;\r\n"
15670                    "  int baz;\n"
15671                    "  int qux;\n"
15672                    "};",
15673                    style));
15674 }
15675 
15676 TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
15677   verifyFormat("MY_CLASS(C) {\n"
15678                "  int i;\n"
15679                "  int j;\n"
15680                "};");
15681 }
15682 
15683 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
15684   FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
15685   TwoIndent.ContinuationIndentWidth = 2;
15686 
15687   EXPECT_EQ("int i =\n"
15688             "  longFunction(\n"
15689             "    arg);",
15690             format("int i = longFunction(arg);", TwoIndent));
15691 
15692   FormatStyle SixIndent = getLLVMStyleWithColumns(20);
15693   SixIndent.ContinuationIndentWidth = 6;
15694 
15695   EXPECT_EQ("int i =\n"
15696             "      longFunction(\n"
15697             "            arg);",
15698             format("int i = longFunction(arg);", SixIndent));
15699 }
15700 
15701 TEST_F(FormatTest, WrappedClosingParenthesisIndent) {
15702   FormatStyle Style = getLLVMStyle();
15703   verifyFormat("int Foo::getter(\n"
15704                "    //\n"
15705                ") const {\n"
15706                "  return foo;\n"
15707                "}",
15708                Style);
15709   verifyFormat("void Foo::setter(\n"
15710                "    //\n"
15711                ") {\n"
15712                "  foo = 1;\n"
15713                "}",
15714                Style);
15715 }
15716 
15717 TEST_F(FormatTest, SpacesInAngles) {
15718   FormatStyle Spaces = getLLVMStyle();
15719   Spaces.SpacesInAngles = true;
15720 
15721   verifyFormat("static_cast< int >(arg);", Spaces);
15722   verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
15723   verifyFormat("f< int, float >();", Spaces);
15724   verifyFormat("template <> g() {}", Spaces);
15725   verifyFormat("template < std::vector< int > > f() {}", Spaces);
15726   verifyFormat("std::function< void(int, int) > fct;", Spaces);
15727   verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
15728                Spaces);
15729 
15730   Spaces.Standard = FormatStyle::LS_Cpp03;
15731   Spaces.SpacesInAngles = true;
15732   verifyFormat("A< A< int > >();", Spaces);
15733 
15734   Spaces.SpacesInAngles = false;
15735   verifyFormat("A<A<int> >();", Spaces);
15736 
15737   Spaces.Standard = FormatStyle::LS_Cpp11;
15738   Spaces.SpacesInAngles = true;
15739   verifyFormat("A< A< int > >();", Spaces);
15740 
15741   Spaces.SpacesInAngles = false;
15742   verifyFormat("A<A<int>>();", Spaces);
15743 }
15744 
15745 TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
15746   FormatStyle Style = getLLVMStyle();
15747   Style.SpaceAfterTemplateKeyword = false;
15748   verifyFormat("template<int> void foo();", Style);
15749 }
15750 
15751 TEST_F(FormatTest, TripleAngleBrackets) {
15752   verifyFormat("f<<<1, 1>>>();");
15753   verifyFormat("f<<<1, 1, 1, s>>>();");
15754   verifyFormat("f<<<a, b, c, d>>>();");
15755   EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
15756   verifyFormat("f<param><<<1, 1>>>();");
15757   verifyFormat("f<1><<<1, 1>>>();");
15758   EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
15759   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
15760                "aaaaaaaaaaa<<<\n    1, 1>>>();");
15761   verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
15762                "    <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
15763 }
15764 
15765 TEST_F(FormatTest, MergeLessLessAtEnd) {
15766   verifyFormat("<<");
15767   EXPECT_EQ("< < <", format("\\\n<<<"));
15768   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
15769                "aaallvm::outs() <<");
15770   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
15771                "aaaallvm::outs()\n    <<");
15772 }
15773 
15774 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
15775   std::string code = "#if A\n"
15776                      "#if B\n"
15777                      "a.\n"
15778                      "#endif\n"
15779                      "    a = 1;\n"
15780                      "#else\n"
15781                      "#endif\n"
15782                      "#if C\n"
15783                      "#else\n"
15784                      "#endif\n";
15785   EXPECT_EQ(code, format(code));
15786 }
15787 
15788 TEST_F(FormatTest, HandleConflictMarkers) {
15789   // Git/SVN conflict markers.
15790   EXPECT_EQ("int a;\n"
15791             "void f() {\n"
15792             "  callme(some(parameter1,\n"
15793             "<<<<<<< text by the vcs\n"
15794             "              parameter2),\n"
15795             "||||||| text by the vcs\n"
15796             "              parameter2),\n"
15797             "         parameter3,\n"
15798             "======= text by the vcs\n"
15799             "              parameter2, parameter3),\n"
15800             ">>>>>>> text by the vcs\n"
15801             "         otherparameter);\n",
15802             format("int a;\n"
15803                    "void f() {\n"
15804                    "  callme(some(parameter1,\n"
15805                    "<<<<<<< text by the vcs\n"
15806                    "  parameter2),\n"
15807                    "||||||| text by the vcs\n"
15808                    "  parameter2),\n"
15809                    "  parameter3,\n"
15810                    "======= text by the vcs\n"
15811                    "  parameter2,\n"
15812                    "  parameter3),\n"
15813                    ">>>>>>> text by the vcs\n"
15814                    "  otherparameter);\n"));
15815 
15816   // Perforce markers.
15817   EXPECT_EQ("void f() {\n"
15818             "  function(\n"
15819             ">>>> text by the vcs\n"
15820             "      parameter,\n"
15821             "==== text by the vcs\n"
15822             "      parameter,\n"
15823             "==== text by the vcs\n"
15824             "      parameter,\n"
15825             "<<<< text by the vcs\n"
15826             "      parameter);\n",
15827             format("void f() {\n"
15828                    "  function(\n"
15829                    ">>>> text by the vcs\n"
15830                    "  parameter,\n"
15831                    "==== text by the vcs\n"
15832                    "  parameter,\n"
15833                    "==== text by the vcs\n"
15834                    "  parameter,\n"
15835                    "<<<< text by the vcs\n"
15836                    "  parameter);\n"));
15837 
15838   EXPECT_EQ("<<<<<<<\n"
15839             "|||||||\n"
15840             "=======\n"
15841             ">>>>>>>",
15842             format("<<<<<<<\n"
15843                    "|||||||\n"
15844                    "=======\n"
15845                    ">>>>>>>"));
15846 
15847   EXPECT_EQ("<<<<<<<\n"
15848             "|||||||\n"
15849             "int i;\n"
15850             "=======\n"
15851             ">>>>>>>",
15852             format("<<<<<<<\n"
15853                    "|||||||\n"
15854                    "int i;\n"
15855                    "=======\n"
15856                    ">>>>>>>"));
15857 
15858   // FIXME: Handle parsing of macros around conflict markers correctly:
15859   EXPECT_EQ("#define Macro \\\n"
15860             "<<<<<<<\n"
15861             "Something \\\n"
15862             "|||||||\n"
15863             "Else \\\n"
15864             "=======\n"
15865             "Other \\\n"
15866             ">>>>>>>\n"
15867             "    End int i;\n",
15868             format("#define Macro \\\n"
15869                    "<<<<<<<\n"
15870                    "  Something \\\n"
15871                    "|||||||\n"
15872                    "  Else \\\n"
15873                    "=======\n"
15874                    "  Other \\\n"
15875                    ">>>>>>>\n"
15876                    "  End\n"
15877                    "int i;\n"));
15878 }
15879 
15880 TEST_F(FormatTest, DisableRegions) {
15881   EXPECT_EQ("int i;\n"
15882             "// clang-format off\n"
15883             "  int j;\n"
15884             "// clang-format on\n"
15885             "int k;",
15886             format(" int  i;\n"
15887                    "   // clang-format off\n"
15888                    "  int j;\n"
15889                    " // clang-format on\n"
15890                    "   int   k;"));
15891   EXPECT_EQ("int i;\n"
15892             "/* clang-format off */\n"
15893             "  int j;\n"
15894             "/* clang-format on */\n"
15895             "int k;",
15896             format(" int  i;\n"
15897                    "   /* clang-format off */\n"
15898                    "  int j;\n"
15899                    " /* clang-format on */\n"
15900                    "   int   k;"));
15901 
15902   // Don't reflow comments within disabled regions.
15903   EXPECT_EQ("// clang-format off\n"
15904             "// long long long long long long line\n"
15905             "/* clang-format on */\n"
15906             "/* long long long\n"
15907             " * long long long\n"
15908             " * line */\n"
15909             "int i;\n"
15910             "/* clang-format off */\n"
15911             "/* long long long long long long line */\n",
15912             format("// clang-format off\n"
15913                    "// long long long long long long line\n"
15914                    "/* clang-format on */\n"
15915                    "/* long long long long long long line */\n"
15916                    "int i;\n"
15917                    "/* clang-format off */\n"
15918                    "/* long long long long long long line */\n",
15919                    getLLVMStyleWithColumns(20)));
15920 }
15921 
15922 TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
15923   format("? ) =");
15924   verifyNoCrash("#define a\\\n /**/}");
15925 }
15926 
15927 TEST_F(FormatTest, FormatsTableGenCode) {
15928   FormatStyle Style = getLLVMStyle();
15929   Style.Language = FormatStyle::LK_TableGen;
15930   verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
15931 }
15932 
15933 TEST_F(FormatTest, ArrayOfTemplates) {
15934   EXPECT_EQ("auto a = new unique_ptr<int>[10];",
15935             format("auto a = new unique_ptr<int > [ 10];"));
15936 
15937   FormatStyle Spaces = getLLVMStyle();
15938   Spaces.SpacesInSquareBrackets = true;
15939   EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
15940             format("auto a = new unique_ptr<int > [10];", Spaces));
15941 }
15942 
15943 TEST_F(FormatTest, ArrayAsTemplateType) {
15944   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
15945             format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
15946 
15947   FormatStyle Spaces = getLLVMStyle();
15948   Spaces.SpacesInSquareBrackets = true;
15949   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
15950             format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
15951 }
15952 
15953 TEST_F(FormatTest, NoSpaceAfterSuper) { verifyFormat("__super::FooBar();"); }
15954 
15955 TEST(FormatStyle, GetStyleWithEmptyFileName) {
15956   llvm::vfs::InMemoryFileSystem FS;
15957   auto Style1 = getStyle("file", "", "Google", "", &FS);
15958   ASSERT_TRUE((bool)Style1);
15959   ASSERT_EQ(*Style1, getGoogleStyle());
15960 }
15961 
15962 TEST(FormatStyle, GetStyleOfFile) {
15963   llvm::vfs::InMemoryFileSystem FS;
15964   // Test 1: format file in the same directory.
15965   ASSERT_TRUE(
15966       FS.addFile("/a/.clang-format", 0,
15967                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
15968   ASSERT_TRUE(
15969       FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
15970   auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
15971   ASSERT_TRUE((bool)Style1);
15972   ASSERT_EQ(*Style1, getLLVMStyle());
15973 
15974   // Test 2.1: fallback to default.
15975   ASSERT_TRUE(
15976       FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
15977   auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
15978   ASSERT_TRUE((bool)Style2);
15979   ASSERT_EQ(*Style2, getMozillaStyle());
15980 
15981   // Test 2.2: no format on 'none' fallback style.
15982   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
15983   ASSERT_TRUE((bool)Style2);
15984   ASSERT_EQ(*Style2, getNoStyle());
15985 
15986   // Test 2.3: format if config is found with no based style while fallback is
15987   // 'none'.
15988   ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
15989                          llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
15990   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
15991   ASSERT_TRUE((bool)Style2);
15992   ASSERT_EQ(*Style2, getLLVMStyle());
15993 
15994   // Test 2.4: format if yaml with no based style, while fallback is 'none'.
15995   Style2 = getStyle("{}", "a.h", "none", "", &FS);
15996   ASSERT_TRUE((bool)Style2);
15997   ASSERT_EQ(*Style2, getLLVMStyle());
15998 
15999   // Test 3: format file in parent directory.
16000   ASSERT_TRUE(
16001       FS.addFile("/c/.clang-format", 0,
16002                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
16003   ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
16004                          llvm::MemoryBuffer::getMemBuffer("int i;")));
16005   auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
16006   ASSERT_TRUE((bool)Style3);
16007   ASSERT_EQ(*Style3, getGoogleStyle());
16008 
16009   // Test 4: error on invalid fallback style
16010   auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
16011   ASSERT_FALSE((bool)Style4);
16012   llvm::consumeError(Style4.takeError());
16013 
16014   // Test 5: error on invalid yaml on command line
16015   auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
16016   ASSERT_FALSE((bool)Style5);
16017   llvm::consumeError(Style5.takeError());
16018 
16019   // Test 6: error on invalid style
16020   auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
16021   ASSERT_FALSE((bool)Style6);
16022   llvm::consumeError(Style6.takeError());
16023 
16024   // Test 7: found config file, error on parsing it
16025   ASSERT_TRUE(
16026       FS.addFile("/d/.clang-format", 0,
16027                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
16028                                                   "InvalidKey: InvalidValue")));
16029   ASSERT_TRUE(
16030       FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
16031   auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
16032   ASSERT_FALSE((bool)Style7);
16033   llvm::consumeError(Style7.takeError());
16034 
16035   // Test 8: inferred per-language defaults apply.
16036   auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS);
16037   ASSERT_TRUE((bool)StyleTd);
16038   ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen));
16039 }
16040 
16041 TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
16042   // Column limit is 20.
16043   std::string Code = "Type *a =\n"
16044                      "    new Type();\n"
16045                      "g(iiiii, 0, jjjjj,\n"
16046                      "  0, kkkkk, 0, mm);\n"
16047                      "int  bad     = format   ;";
16048   std::string Expected = "auto a = new Type();\n"
16049                          "g(iiiii, nullptr,\n"
16050                          "  jjjjj, nullptr,\n"
16051                          "  kkkkk, nullptr,\n"
16052                          "  mm);\n"
16053                          "int  bad     = format   ;";
16054   FileID ID = Context.createInMemoryFile("format.cpp", Code);
16055   tooling::Replacements Replaces = toReplacements(
16056       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
16057                             "auto "),
16058        tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
16059                             "nullptr"),
16060        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
16061                             "nullptr"),
16062        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
16063                             "nullptr")});
16064 
16065   format::FormatStyle Style = format::getLLVMStyle();
16066   Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
16067   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
16068   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
16069       << llvm::toString(FormattedReplaces.takeError()) << "\n";
16070   auto Result = applyAllReplacements(Code, *FormattedReplaces);
16071   EXPECT_TRUE(static_cast<bool>(Result));
16072   EXPECT_EQ(Expected, *Result);
16073 }
16074 
16075 TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
16076   std::string Code = "#include \"a.h\"\n"
16077                      "#include \"c.h\"\n"
16078                      "\n"
16079                      "int main() {\n"
16080                      "  return 0;\n"
16081                      "}";
16082   std::string Expected = "#include \"a.h\"\n"
16083                          "#include \"b.h\"\n"
16084                          "#include \"c.h\"\n"
16085                          "\n"
16086                          "int main() {\n"
16087                          "  return 0;\n"
16088                          "}";
16089   FileID ID = Context.createInMemoryFile("fix.cpp", Code);
16090   tooling::Replacements Replaces = toReplacements(
16091       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
16092                             "#include \"b.h\"\n")});
16093 
16094   format::FormatStyle Style = format::getLLVMStyle();
16095   Style.SortIncludes = true;
16096   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
16097   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
16098       << llvm::toString(FormattedReplaces.takeError()) << "\n";
16099   auto Result = applyAllReplacements(Code, *FormattedReplaces);
16100   EXPECT_TRUE(static_cast<bool>(Result));
16101   EXPECT_EQ(Expected, *Result);
16102 }
16103 
16104 TEST_F(FormatTest, FormatSortsUsingDeclarations) {
16105   EXPECT_EQ("using std::cin;\n"
16106             "using std::cout;",
16107             format("using std::cout;\n"
16108                    "using std::cin;",
16109                    getGoogleStyle()));
16110 }
16111 
16112 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
16113   format::FormatStyle Style = format::getLLVMStyle();
16114   Style.Standard = FormatStyle::LS_Cpp03;
16115   // cpp03 recognize this string as identifier u8 and literal character 'a'
16116   EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
16117 }
16118 
16119 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
16120   // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
16121   // all modes, including C++11, C++14 and C++17
16122   EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
16123 }
16124 
16125 TEST_F(FormatTest, DoNotFormatLikelyXml) {
16126   EXPECT_EQ("<!-- ;> -->", format("<!-- ;> -->", getGoogleStyle()));
16127   EXPECT_EQ(" <!-- >; -->", format(" <!-- >; -->", getGoogleStyle()));
16128 }
16129 
16130 TEST_F(FormatTest, StructuredBindings) {
16131   // Structured bindings is a C++17 feature.
16132   // all modes, including C++11, C++14 and C++17
16133   verifyFormat("auto [a, b] = f();");
16134   EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
16135   EXPECT_EQ("const auto [a, b] = f();", format("const   auto[a, b] = f();"));
16136   EXPECT_EQ("auto const [a, b] = f();", format("auto  const[a, b] = f();"));
16137   EXPECT_EQ("auto const volatile [a, b] = f();",
16138             format("auto  const   volatile[a, b] = f();"));
16139   EXPECT_EQ("auto [a, b, c] = f();", format("auto   [  a  ,  b,c   ] = f();"));
16140   EXPECT_EQ("auto &[a, b, c] = f();",
16141             format("auto   &[  a  ,  b,c   ] = f();"));
16142   EXPECT_EQ("auto &&[a, b, c] = f();",
16143             format("auto   &&[  a  ,  b,c   ] = f();"));
16144   EXPECT_EQ("auto const &[a, b] = f();", format("auto  const&[a, b] = f();"));
16145   EXPECT_EQ("auto const volatile &&[a, b] = f();",
16146             format("auto  const  volatile  &&[a, b] = f();"));
16147   EXPECT_EQ("auto const &&[a, b] = f();",
16148             format("auto  const   &&  [a, b] = f();"));
16149   EXPECT_EQ("const auto &[a, b] = f();",
16150             format("const  auto  &  [a, b] = f();"));
16151   EXPECT_EQ("const auto volatile &&[a, b] = f();",
16152             format("const  auto   volatile  &&[a, b] = f();"));
16153   EXPECT_EQ("volatile const auto &&[a, b] = f();",
16154             format("volatile  const  auto   &&[a, b] = f();"));
16155   EXPECT_EQ("const auto &&[a, b] = f();",
16156             format("const  auto  &&  [a, b] = f();"));
16157 
16158   // Make sure we don't mistake structured bindings for lambdas.
16159   FormatStyle PointerMiddle = getLLVMStyle();
16160   PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
16161   verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
16162   verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
16163   verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
16164   verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
16165   verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
16166   verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
16167   verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
16168   verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
16169   verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
16170   verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
16171   verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
16172   verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
16173 
16174   EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
16175             format("for (const auto   &&   [a, b] : some_range) {\n}"));
16176   EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
16177             format("for (const auto   &   [a, b] : some_range) {\n}"));
16178   EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
16179             format("for (const auto[a, b] : some_range) {\n}"));
16180   EXPECT_EQ("auto [x, y](expr);", format("auto[x,y]  (expr);"));
16181   EXPECT_EQ("auto &[x, y](expr);", format("auto  &  [x,y]  (expr);"));
16182   EXPECT_EQ("auto &&[x, y](expr);", format("auto  &&  [x,y]  (expr);"));
16183   EXPECT_EQ("auto const &[x, y](expr);",
16184             format("auto  const  &  [x,y]  (expr);"));
16185   EXPECT_EQ("auto const &&[x, y](expr);",
16186             format("auto  const  &&  [x,y]  (expr);"));
16187   EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y]     {expr};"));
16188   EXPECT_EQ("auto const &[x, y]{expr};",
16189             format("auto  const  &  [x,y]  {expr};"));
16190   EXPECT_EQ("auto const &&[x, y]{expr};",
16191             format("auto  const  &&  [x,y]  {expr};"));
16192 
16193   format::FormatStyle Spaces = format::getLLVMStyle();
16194   Spaces.SpacesInSquareBrackets = true;
16195   verifyFormat("auto [ a, b ] = f();", Spaces);
16196   verifyFormat("auto &&[ a, b ] = f();", Spaces);
16197   verifyFormat("auto &[ a, b ] = f();", Spaces);
16198   verifyFormat("auto const &&[ a, b ] = f();", Spaces);
16199   verifyFormat("auto const &[ a, b ] = f();", Spaces);
16200 }
16201 
16202 TEST_F(FormatTest, FileAndCode) {
16203   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", ""));
16204   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", ""));
16205   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", ""));
16206   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", ""));
16207   EXPECT_EQ(FormatStyle::LK_ObjC,
16208             guessLanguage("foo.h", "@interface Foo\n@end\n"));
16209   EXPECT_EQ(
16210       FormatStyle::LK_ObjC,
16211       guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }"));
16212   EXPECT_EQ(FormatStyle::LK_ObjC,
16213             guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))"));
16214   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;"));
16215   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", ""));
16216   EXPECT_EQ(FormatStyle::LK_ObjC,
16217             guessLanguage("foo", "@interface Foo\n@end\n"));
16218   EXPECT_EQ(FormatStyle::LK_ObjC,
16219             guessLanguage("foo.h", "int DoStuff(CGRect rect);\n"));
16220   EXPECT_EQ(
16221       FormatStyle::LK_ObjC,
16222       guessLanguage("foo.h",
16223                     "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n"));
16224   EXPECT_EQ(
16225       FormatStyle::LK_Cpp,
16226       guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;"));
16227 }
16228 
16229 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) {
16230   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];"));
16231   EXPECT_EQ(FormatStyle::LK_ObjC,
16232             guessLanguage("foo.h", "array[[calculator getIndex]];"));
16233   EXPECT_EQ(FormatStyle::LK_Cpp,
16234             guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];"));
16235   EXPECT_EQ(
16236       FormatStyle::LK_Cpp,
16237       guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];"));
16238   EXPECT_EQ(FormatStyle::LK_ObjC,
16239             guessLanguage("foo.h", "[[noreturn foo] bar];"));
16240   EXPECT_EQ(FormatStyle::LK_Cpp,
16241             guessLanguage("foo.h", "[[clang::fallthrough]];"));
16242   EXPECT_EQ(FormatStyle::LK_ObjC,
16243             guessLanguage("foo.h", "[[clang:fallthrough] foo];"));
16244   EXPECT_EQ(FormatStyle::LK_Cpp,
16245             guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];"));
16246   EXPECT_EQ(FormatStyle::LK_Cpp,
16247             guessLanguage("foo.h", "[[using clang: fallthrough]];"));
16248   EXPECT_EQ(FormatStyle::LK_ObjC,
16249             guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];"));
16250   EXPECT_EQ(FormatStyle::LK_Cpp,
16251             guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];"));
16252   EXPECT_EQ(
16253       FormatStyle::LK_Cpp,
16254       guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)"));
16255   EXPECT_EQ(
16256       FormatStyle::LK_Cpp,
16257       guessLanguage("foo.h",
16258                     "[[clang::callable_when(\"unconsumed\", \"unknown\")]]"));
16259   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]"));
16260 }
16261 
16262 TEST_F(FormatTest, GuessLanguageWithCaret) {
16263   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);"));
16264   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);"));
16265   EXPECT_EQ(FormatStyle::LK_ObjC,
16266             guessLanguage("foo.h", "int(^)(char, float);"));
16267   EXPECT_EQ(FormatStyle::LK_ObjC,
16268             guessLanguage("foo.h", "int(^foo)(char, float);"));
16269   EXPECT_EQ(FormatStyle::LK_ObjC,
16270             guessLanguage("foo.h", "int(^foo[10])(char, float);"));
16271   EXPECT_EQ(FormatStyle::LK_ObjC,
16272             guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);"));
16273   EXPECT_EQ(
16274       FormatStyle::LK_ObjC,
16275       guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);"));
16276 }
16277 
16278 TEST_F(FormatTest, FormatsInlineAsmSymbolicNames) {
16279   // ASM symbolic names are identifiers that must be surrounded by [] without
16280   // space in between:
16281   // https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#InputOperands
16282 
16283   // Example from https://bugs.llvm.org/show_bug.cgi?id=45108.
16284   verifyFormat(R"(//
16285 asm volatile("mrs %x[result], FPCR" : [result] "=r"(result));
16286 )");
16287 
16288   // A list of several ASM symbolic names.
16289   verifyFormat(R"(asm("mov %[e], %[d]" : [d] "=rm"(d), [e] "rm"(*e));)");
16290 
16291   // ASM symbolic names in inline ASM with inputs and outputs.
16292   verifyFormat(R"(//
16293 asm("cmoveq %1, %2, %[result]"
16294     : [result] "=r"(result)
16295     : "r"(test), "r"(new), "[result]"(old));
16296 )");
16297 
16298   // ASM symbolic names in inline ASM with no outputs.
16299   verifyFormat(R"(asm("mov %[e], %[d]" : : [d] "=rm"(d), [e] "rm"(*e));)");
16300 }
16301 
16302 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) {
16303   EXPECT_EQ(FormatStyle::LK_Cpp,
16304             guessLanguage("foo.h", "void f() {\n"
16305                                    "  asm (\"mov %[e], %[d]\"\n"
16306                                    "     : [d] \"=rm\" (d)\n"
16307                                    "       [e] \"rm\" (*e));\n"
16308                                    "}"));
16309   EXPECT_EQ(FormatStyle::LK_Cpp,
16310             guessLanguage("foo.h", "void f() {\n"
16311                                    "  _asm (\"mov %[e], %[d]\"\n"
16312                                    "     : [d] \"=rm\" (d)\n"
16313                                    "       [e] \"rm\" (*e));\n"
16314                                    "}"));
16315   EXPECT_EQ(FormatStyle::LK_Cpp,
16316             guessLanguage("foo.h", "void f() {\n"
16317                                    "  __asm (\"mov %[e], %[d]\"\n"
16318                                    "     : [d] \"=rm\" (d)\n"
16319                                    "       [e] \"rm\" (*e));\n"
16320                                    "}"));
16321   EXPECT_EQ(FormatStyle::LK_Cpp,
16322             guessLanguage("foo.h", "void f() {\n"
16323                                    "  __asm__ (\"mov %[e], %[d]\"\n"
16324                                    "     : [d] \"=rm\" (d)\n"
16325                                    "       [e] \"rm\" (*e));\n"
16326                                    "}"));
16327   EXPECT_EQ(FormatStyle::LK_Cpp,
16328             guessLanguage("foo.h", "void f() {\n"
16329                                    "  asm (\"mov %[e], %[d]\"\n"
16330                                    "     : [d] \"=rm\" (d),\n"
16331                                    "       [e] \"rm\" (*e));\n"
16332                                    "}"));
16333   EXPECT_EQ(FormatStyle::LK_Cpp,
16334             guessLanguage("foo.h", "void f() {\n"
16335                                    "  asm volatile (\"mov %[e], %[d]\"\n"
16336                                    "     : [d] \"=rm\" (d)\n"
16337                                    "       [e] \"rm\" (*e));\n"
16338                                    "}"));
16339 }
16340 
16341 TEST_F(FormatTest, GuessLanguageWithChildLines) {
16342   EXPECT_EQ(FormatStyle::LK_Cpp,
16343             guessLanguage("foo.h", "#define FOO ({ std::string s; })"));
16344   EXPECT_EQ(FormatStyle::LK_ObjC,
16345             guessLanguage("foo.h", "#define FOO ({ NSString *s; })"));
16346   EXPECT_EQ(
16347       FormatStyle::LK_Cpp,
16348       guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })"));
16349   EXPECT_EQ(
16350       FormatStyle::LK_ObjC,
16351       guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })"));
16352 }
16353 
16354 TEST_F(FormatTest, TypenameMacros) {
16355   std::vector<std::string> TypenameMacros = {"STACK_OF", "LIST", "TAILQ_ENTRY"};
16356 
16357   // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=30353
16358   FormatStyle Google = getGoogleStyleWithColumns(0);
16359   Google.TypenameMacros = TypenameMacros;
16360   verifyFormat("struct foo {\n"
16361                "  int bar;\n"
16362                "  TAILQ_ENTRY(a) bleh;\n"
16363                "};",
16364                Google);
16365 
16366   FormatStyle Macros = getLLVMStyle();
16367   Macros.TypenameMacros = TypenameMacros;
16368 
16369   verifyFormat("STACK_OF(int) a;", Macros);
16370   verifyFormat("STACK_OF(int) *a;", Macros);
16371   verifyFormat("STACK_OF(int const *) *a;", Macros);
16372   verifyFormat("STACK_OF(int *const) *a;", Macros);
16373   verifyFormat("STACK_OF(int, string) a;", Macros);
16374   verifyFormat("STACK_OF(LIST(int)) a;", Macros);
16375   verifyFormat("STACK_OF(LIST(int)) a, b;", Macros);
16376   verifyFormat("for (LIST(int) *a = NULL; a;) {\n}", Macros);
16377   verifyFormat("STACK_OF(int) f(LIST(int) *arg);", Macros);
16378 
16379   Macros.PointerAlignment = FormatStyle::PAS_Left;
16380   verifyFormat("STACK_OF(int)* a;", Macros);
16381   verifyFormat("STACK_OF(int*)* a;", Macros);
16382 }
16383 
16384 TEST_F(FormatTest, AmbersandInLamda) {
16385   // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=41899
16386   FormatStyle AlignStyle = getLLVMStyle();
16387   AlignStyle.PointerAlignment = FormatStyle::PAS_Left;
16388   verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle);
16389   AlignStyle.PointerAlignment = FormatStyle::PAS_Right;
16390   verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle);
16391 }
16392 
16393 TEST_F(FormatTest, SpacesInConditionalStatement) {
16394   FormatStyle Spaces = getLLVMStyle();
16395   Spaces.SpacesInConditionalStatement = true;
16396   verifyFormat("for ( int i = 0; i; i++ )\n  continue;", Spaces);
16397   verifyFormat("if ( !a )\n  return;", Spaces);
16398   verifyFormat("if ( a )\n  return;", Spaces);
16399   verifyFormat("if constexpr ( a )\n  return;", Spaces);
16400   verifyFormat("switch ( a )\ncase 1:\n  return;", Spaces);
16401   verifyFormat("while ( a )\n  return;", Spaces);
16402   verifyFormat("while ( (a && b) )\n  return;", Spaces);
16403   verifyFormat("do {\n} while ( 1 != 0 );", Spaces);
16404   verifyFormat("try {\n} catch ( const std::exception & ) {\n}", Spaces);
16405   // Check that space on the left of "::" is inserted as expected at beginning
16406   // of condition.
16407   verifyFormat("while ( ::func() )\n  return;", Spaces);
16408 }
16409 
16410 TEST_F(FormatTest, AlternativeOperators) {
16411   // Test case for ensuring alternate operators are not
16412   // combined with their right most neighbour.
16413   verifyFormat("int a and b;");
16414   verifyFormat("int a and_eq b;");
16415   verifyFormat("int a bitand b;");
16416   verifyFormat("int a bitor b;");
16417   verifyFormat("int a compl b;");
16418   verifyFormat("int a not b;");
16419   verifyFormat("int a not_eq b;");
16420   verifyFormat("int a or b;");
16421   verifyFormat("int a xor b;");
16422   verifyFormat("int a xor_eq b;");
16423   verifyFormat("return this not_eq bitand other;");
16424   verifyFormat("bool operator not_eq(const X bitand other)");
16425 
16426   verifyFormat("int a and 5;");
16427   verifyFormat("int a and_eq 5;");
16428   verifyFormat("int a bitand 5;");
16429   verifyFormat("int a bitor 5;");
16430   verifyFormat("int a compl 5;");
16431   verifyFormat("int a not 5;");
16432   verifyFormat("int a not_eq 5;");
16433   verifyFormat("int a or 5;");
16434   verifyFormat("int a xor 5;");
16435   verifyFormat("int a xor_eq 5;");
16436 
16437   verifyFormat("int a compl(5);");
16438   verifyFormat("int a not(5);");
16439 
16440   /* FIXME handle alternate tokens
16441    * https://en.cppreference.com/w/cpp/language/operator_alternative
16442   // alternative tokens
16443   verifyFormat("compl foo();");     //  ~foo();
16444   verifyFormat("foo() <%%>;");      // foo();
16445   verifyFormat("void foo() <%%>;"); // void foo(){}
16446   verifyFormat("int a <:1:>;");     // int a[1];[
16447   verifyFormat("%:define ABC abc"); // #define ABC abc
16448   verifyFormat("%:%:");             // ##
16449   */
16450 }
16451 
16452 TEST_F(FormatTest, STLWhileNotDefineChed) {
16453   verifyFormat("#if defined(while)\n"
16454                "#define while EMIT WARNING C4005\n"
16455                "#endif // while");
16456 }
16457 
16458 TEST_F(FormatTest, OperatorSpacing) {
16459   FormatStyle Style = getLLVMStyle();
16460   Style.PointerAlignment = FormatStyle::PAS_Right;
16461   verifyFormat("Foo::operator*();", Style);
16462   verifyFormat("Foo::operator void *();", Style);
16463   verifyFormat("Foo::operator void **();", Style);
16464   verifyFormat("Foo::operator void *&();", Style);
16465   verifyFormat("Foo::operator void *&&();", Style);
16466   verifyFormat("Foo::operator()(void *);", Style);
16467   verifyFormat("Foo::operator*(void *);", Style);
16468   verifyFormat("Foo::operator*();", Style);
16469   verifyFormat("Foo::operator**();", Style);
16470   verifyFormat("Foo::operator&();", Style);
16471   verifyFormat("Foo::operator<int> *();", Style);
16472   verifyFormat("Foo::operator<Foo> *();", Style);
16473   verifyFormat("Foo::operator<int> **();", Style);
16474   verifyFormat("Foo::operator<Foo> **();", Style);
16475   verifyFormat("Foo::operator<int> &();", Style);
16476   verifyFormat("Foo::operator<Foo> &();", Style);
16477   verifyFormat("Foo::operator<int> &&();", Style);
16478   verifyFormat("Foo::operator<Foo> &&();", Style);
16479   verifyFormat("Foo::operator<int> *&();", Style);
16480   verifyFormat("Foo::operator<Foo> *&();", Style);
16481   verifyFormat("Foo::operator<int> *&&();", Style);
16482   verifyFormat("Foo::operator<Foo> *&&();", Style);
16483   verifyFormat("operator*(int (*)(), class Foo);", Style);
16484 
16485   verifyFormat("Foo::operator&();", Style);
16486   verifyFormat("Foo::operator void &();", Style);
16487   verifyFormat("Foo::operator()(void &);", Style);
16488   verifyFormat("Foo::operator&(void &);", Style);
16489   verifyFormat("Foo::operator&();", Style);
16490   verifyFormat("operator&(int (&)(), class Foo);", Style);
16491 
16492   verifyFormat("Foo::operator&&();", Style);
16493   verifyFormat("Foo::operator**();", Style);
16494   verifyFormat("Foo::operator void &&();", Style);
16495   verifyFormat("Foo::operator()(void &&);", Style);
16496   verifyFormat("Foo::operator&&(void &&);", Style);
16497   verifyFormat("Foo::operator&&();", Style);
16498   verifyFormat("operator&&(int(&&)(), class Foo);", Style);
16499   verifyFormat("operator const nsTArrayRight<E> &()", Style);
16500   verifyFormat("[[nodiscard]] operator const nsTArrayRight<E, Allocator> &()",
16501                Style);
16502   verifyFormat("operator void **()", Style);
16503   verifyFormat("operator const FooRight<Object> &()", Style);
16504   verifyFormat("operator const FooRight<Object> *()", Style);
16505   verifyFormat("operator const FooRight<Object> **()", Style);
16506   verifyFormat("operator const FooRight<Object> *&()", Style);
16507   verifyFormat("operator const FooRight<Object> *&&()", Style);
16508 
16509   Style.PointerAlignment = FormatStyle::PAS_Left;
16510   verifyFormat("Foo::operator*();", Style);
16511   verifyFormat("Foo::operator**();", Style);
16512   verifyFormat("Foo::operator void*();", Style);
16513   verifyFormat("Foo::operator void**();", Style);
16514   verifyFormat("Foo::operator void*&();", Style);
16515   verifyFormat("Foo::operator/*comment*/ void*();", Style);
16516   verifyFormat("Foo::operator/*a*/ const /*b*/ void*();", Style);
16517   verifyFormat("Foo::operator/*a*/ volatile /*b*/ void*();", Style);
16518   verifyFormat("Foo::operator()(void*);", Style);
16519   verifyFormat("Foo::operator*(void*);", Style);
16520   verifyFormat("Foo::operator*();", Style);
16521   verifyFormat("Foo::operator<int>*();", Style);
16522   verifyFormat("Foo::operator<Foo>*();", Style);
16523   verifyFormat("Foo::operator<int>**();", Style);
16524   verifyFormat("Foo::operator<Foo>**();", Style);
16525   verifyFormat("Foo::operator<Foo>*&();", Style);
16526   verifyFormat("Foo::operator<int>&();", Style);
16527   verifyFormat("Foo::operator<Foo>&();", Style);
16528   verifyFormat("Foo::operator<int>&&();", Style);
16529   verifyFormat("Foo::operator<Foo>&&();", Style);
16530   verifyFormat("Foo::operator<int>*&();", Style);
16531   verifyFormat("Foo::operator<Foo>*&();", Style);
16532   verifyFormat("operator*(int (*)(), class Foo);", Style);
16533 
16534   verifyFormat("Foo::operator&();", Style);
16535   verifyFormat("Foo::operator void&();", Style);
16536   verifyFormat("Foo::operator/*comment*/ void&();", Style);
16537   verifyFormat("Foo::operator/*a*/ const /*b*/ void&();", Style);
16538   verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&();", Style);
16539   verifyFormat("Foo::operator()(void&);", Style);
16540   verifyFormat("Foo::operator&(void&);", Style);
16541   verifyFormat("Foo::operator&();", Style);
16542   verifyFormat("operator&(int (&)(), class Foo);", Style);
16543 
16544   verifyFormat("Foo::operator&&();", Style);
16545   verifyFormat("Foo::operator void&&();", Style);
16546   verifyFormat("Foo::operator/*comment*/ void&&();", Style);
16547   verifyFormat("Foo::operator/*a*/ const /*b*/ void&&();", Style);
16548   verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&&();", Style);
16549   verifyFormat("Foo::operator()(void&&);", Style);
16550   verifyFormat("Foo::operator&&(void&&);", Style);
16551   verifyFormat("Foo::operator&&();", Style);
16552   verifyFormat("operator&&(int(&&)(), class Foo);", Style);
16553   verifyFormat("operator const nsTArrayLeft<E>&()", Style);
16554   verifyFormat("[[nodiscard]] operator const nsTArrayLeft<E, Allocator>&()",
16555                Style);
16556   verifyFormat("operator void**()", Style);
16557   verifyFormat("operator const FooLeft<Object>&()", Style);
16558   verifyFormat("operator const FooLeft<Object>*()", Style);
16559   verifyFormat("operator const FooLeft<Object>**()", Style);
16560   verifyFormat("operator const FooLeft<Object>*&()", Style);
16561   verifyFormat("operator const FooLeft<Object>*&&()", Style);
16562 
16563   // PR45107
16564   verifyFormat("operator Vector<String>&();", Style);
16565   verifyFormat("operator const Vector<String>&();", Style);
16566   verifyFormat("operator foo::Bar*();", Style);
16567   verifyFormat("operator const Foo<X>::Bar<Y>*();", Style);
16568   verifyFormat("operator/*a*/ const /*b*/ Foo /*c*/<X> /*d*/ ::Bar<Y>*();",
16569                Style);
16570 
16571   Style.PointerAlignment = FormatStyle::PAS_Middle;
16572   verifyFormat("Foo::operator*();", Style);
16573   verifyFormat("Foo::operator void *();", Style);
16574   verifyFormat("Foo::operator()(void *);", Style);
16575   verifyFormat("Foo::operator*(void *);", Style);
16576   verifyFormat("Foo::operator*();", Style);
16577   verifyFormat("operator*(int (*)(), class Foo);", Style);
16578 
16579   verifyFormat("Foo::operator&();", Style);
16580   verifyFormat("Foo::operator void &();", Style);
16581   verifyFormat("Foo::operator()(void &);", Style);
16582   verifyFormat("Foo::operator&(void &);", Style);
16583   verifyFormat("Foo::operator&();", Style);
16584   verifyFormat("operator&(int (&)(), class Foo);", Style);
16585 
16586   verifyFormat("Foo::operator&&();", Style);
16587   verifyFormat("Foo::operator void &&();", Style);
16588   verifyFormat("Foo::operator()(void &&);", Style);
16589   verifyFormat("Foo::operator&&(void &&);", Style);
16590   verifyFormat("Foo::operator&&();", Style);
16591   verifyFormat("operator&&(int(&&)(), class Foo);", Style);
16592 }
16593 
16594 TEST_F(FormatTest, OperatorPassedAsAFunctionPtr) {
16595   FormatStyle Style = getLLVMStyle();
16596   // PR46157
16597   verifyFormat("foo(operator+, -42);", Style);
16598   verifyFormat("foo(operator++, -42);", Style);
16599   verifyFormat("foo(operator--, -42);", Style);
16600   verifyFormat("foo(-42, operator--);", Style);
16601   verifyFormat("foo(-42, operator, );", Style);
16602   verifyFormat("foo(operator, , -42);", Style);
16603 }
16604 
16605 TEST_F(FormatTest, WhitespaceSensitiveMacros) {
16606   FormatStyle Style = getLLVMStyle();
16607   Style.WhitespaceSensitiveMacros.push_back("FOO");
16608 
16609   // Don't use the helpers here, since 'mess up' will change the whitespace
16610   // and these are all whitespace sensitive by definition
16611   EXPECT_EQ("FOO(String-ized&Messy+But(: :Still)=Intentional);",
16612             format("FOO(String-ized&Messy+But(: :Still)=Intentional);", Style));
16613   EXPECT_EQ(
16614       "FOO(String-ized&Messy+But\\(: :Still)=Intentional);",
16615       format("FOO(String-ized&Messy+But\\(: :Still)=Intentional);", Style));
16616   EXPECT_EQ("FOO(String-ized&Messy+But,: :Still=Intentional);",
16617             format("FOO(String-ized&Messy+But,: :Still=Intentional);", Style));
16618   EXPECT_EQ("FOO(String-ized&Messy+But,: :\n"
16619             "       Still=Intentional);",
16620             format("FOO(String-ized&Messy+But,: :\n"
16621                    "       Still=Intentional);",
16622                    Style));
16623   Style.AlignConsecutiveAssignments = true;
16624   EXPECT_EQ("FOO(String-ized=&Messy+But,: :\n"
16625             "       Still=Intentional);",
16626             format("FOO(String-ized=&Messy+But,: :\n"
16627                    "       Still=Intentional);",
16628                    Style));
16629 
16630   Style.ColumnLimit = 21;
16631   EXPECT_EQ("FOO(String-ized&Messy+But: :Still=Intentional);",
16632             format("FOO(String-ized&Messy+But: :Still=Intentional);", Style));
16633 }
16634 
16635 TEST_F(FormatTest, VeryLongNamespaceCommentSplit) {
16636   // These tests are not in NamespaceFixer because that doesn't
16637   // test its interaction with line wrapping
16638   FormatStyle Style = getLLVMStyle();
16639   Style.ColumnLimit = 80;
16640   verifyFormat("namespace {\n"
16641                "int i;\n"
16642                "int j;\n"
16643                "} // namespace",
16644                Style);
16645 
16646   verifyFormat("namespace AAA {\n"
16647                "int i;\n"
16648                "int j;\n"
16649                "} // namespace AAA",
16650                Style);
16651 
16652   EXPECT_EQ("namespace Averyveryveryverylongnamespace {\n"
16653             "int i;\n"
16654             "int j;\n"
16655             "} // namespace Averyveryveryverylongnamespace",
16656             format("namespace Averyveryveryverylongnamespace {\n"
16657                    "int i;\n"
16658                    "int j;\n"
16659                    "}",
16660                    Style));
16661 
16662   EXPECT_EQ(
16663       "namespace "
16664       "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::\n"
16665       "    went::mad::now {\n"
16666       "int i;\n"
16667       "int j;\n"
16668       "} // namespace\n"
16669       "  // "
16670       "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::"
16671       "went::mad::now",
16672       format("namespace "
16673              "would::it::save::you::a::lot::of::time::if_::i::"
16674              "just::gave::up::and_::went::mad::now {\n"
16675              "int i;\n"
16676              "int j;\n"
16677              "}",
16678              Style));
16679 
16680   // This used to duplicate the comment again and again on subsequent runs
16681   EXPECT_EQ(
16682       "namespace "
16683       "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::\n"
16684       "    went::mad::now {\n"
16685       "int i;\n"
16686       "int j;\n"
16687       "} // namespace\n"
16688       "  // "
16689       "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::"
16690       "went::mad::now",
16691       format("namespace "
16692              "would::it::save::you::a::lot::of::time::if_::i::"
16693              "just::gave::up::and_::went::mad::now {\n"
16694              "int i;\n"
16695              "int j;\n"
16696              "} // namespace\n"
16697              "  // "
16698              "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::"
16699              "and_::went::mad::now",
16700              Style));
16701 }
16702 
16703 TEST_F(FormatTest, LikelyUnlikely) {
16704   FormatStyle Style = getLLVMStyle();
16705 
16706   verifyFormat("if (argc > 5) [[unlikely]] {\n"
16707                "  return 29;\n"
16708                "}",
16709                Style);
16710 
16711   verifyFormat("if (argc > 5) [[likely]] {\n"
16712                "  return 29;\n"
16713                "}",
16714                Style);
16715 
16716   verifyFormat("if (argc > 5) [[unlikely]] {\n"
16717                "  return 29;\n"
16718                "} else [[likely]] {\n"
16719                "  return 42;\n"
16720                "}\n",
16721                Style);
16722 
16723   verifyFormat("if (argc > 5) [[unlikely]] {\n"
16724                "  return 29;\n"
16725                "} else if (argc > 10) [[likely]] {\n"
16726                "  return 99;\n"
16727                "} else {\n"
16728                "  return 42;\n"
16729                "}\n",
16730                Style);
16731 
16732   verifyFormat("if (argc > 5) [[gnu::unused]] {\n"
16733                "  return 29;\n"
16734                "}",
16735                Style);
16736 }
16737 
16738 TEST_F(FormatTest, LLVMDefaultStyle) {
16739   FormatStyle Style = getLLVMStyle();
16740   verifyFormat("extern \"C\" {\n"
16741                "int foo();\n"
16742                "}",
16743                Style);
16744 }
16745 TEST_F(FormatTest, GNUDefaultStyle) {
16746   FormatStyle Style = getGNUStyle();
16747   verifyFormat("extern \"C\"\n"
16748                "{\n"
16749                "  int foo ();\n"
16750                "}",
16751                Style);
16752 }
16753 TEST_F(FormatTest, MozillaDefaultStyle) {
16754   FormatStyle Style = getMozillaStyle();
16755   verifyFormat("extern \"C\"\n"
16756                "{\n"
16757                "  int foo();\n"
16758                "}",
16759                Style);
16760 }
16761 TEST_F(FormatTest, GoogleDefaultStyle) {
16762   FormatStyle Style = getGoogleStyle();
16763   verifyFormat("extern \"C\" {\n"
16764                "int foo();\n"
16765                "}",
16766                Style);
16767 }
16768 TEST_F(FormatTest, ChromiumDefaultStyle) {
16769   FormatStyle Style = getChromiumStyle(FormatStyle::LanguageKind::LK_Cpp);
16770   verifyFormat("extern \"C\" {\n"
16771                "int foo();\n"
16772                "}",
16773                Style);
16774 }
16775 TEST_F(FormatTest, MicrosoftDefaultStyle) {
16776   FormatStyle Style = getMicrosoftStyle(FormatStyle::LanguageKind::LK_Cpp);
16777   verifyFormat("extern \"C\"\n"
16778                "{\n"
16779                "    int foo();\n"
16780                "}",
16781                Style);
16782 }
16783 TEST_F(FormatTest, WebKitDefaultStyle) {
16784   FormatStyle Style = getWebKitStyle();
16785   verifyFormat("extern \"C\" {\n"
16786                "int foo();\n"
16787                "}",
16788                Style);
16789 }
16790 } // namespace
16791 } // namespace format
16792 } // namespace clang
16793