1 //===- unittest/Format/FormatTest.cpp - Formatting unit tests -------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "clang/Format/Format.h"
10 
11 #include "../Tooling/ReplacementTest.h"
12 #include "FormatTestUtils.h"
13 
14 #include "clang/Frontend/TextDiagnosticPrinter.h"
15 #include "llvm/Support/Debug.h"
16 #include "llvm/Support/MemoryBuffer.h"
17 #include "gtest/gtest.h"
18 
19 #define DEBUG_TYPE "format-test"
20 
21 using clang::tooling::ReplacementTest;
22 using clang::tooling::toReplacements;
23 
24 namespace clang {
25 namespace format {
26 namespace {
27 
28 FormatStyle getGoogleStyle() { return getGoogleStyle(FormatStyle::LK_Cpp); }
29 
30 class FormatTest : public ::testing::Test {
31 protected:
32   enum StatusCheck { SC_ExpectComplete, SC_ExpectIncomplete, SC_DoNotCheck };
33 
34   std::string format(llvm::StringRef Code,
35                      const FormatStyle &Style = getLLVMStyle(),
36                      StatusCheck CheckComplete = SC_ExpectComplete) {
37     LLVM_DEBUG(llvm::errs() << "---\n");
38     LLVM_DEBUG(llvm::errs() << Code << "\n\n");
39     std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
40     FormattingAttemptStatus Status;
41     tooling::Replacements Replaces =
42         reformat(Style, Code, Ranges, "<stdin>", &Status);
43     if (CheckComplete != SC_DoNotCheck) {
44       bool ExpectedCompleteFormat = CheckComplete == SC_ExpectComplete;
45       EXPECT_EQ(ExpectedCompleteFormat, Status.FormatComplete)
46           << Code << "\n\n";
47     }
48     ReplacementCount = Replaces.size();
49     auto Result = applyAllReplacements(Code, Replaces);
50     EXPECT_TRUE(static_cast<bool>(Result));
51     LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
52     return *Result;
53   }
54 
55   FormatStyle getStyleWithColumns(FormatStyle Style, unsigned ColumnLimit) {
56     Style.ColumnLimit = ColumnLimit;
57     return Style;
58   }
59 
60   FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) {
61     return getStyleWithColumns(getLLVMStyle(), ColumnLimit);
62   }
63 
64   FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) {
65     return getStyleWithColumns(getGoogleStyle(), ColumnLimit);
66   }
67 
68   void verifyFormat(llvm::StringRef Expected, llvm::StringRef Code,
69                     const FormatStyle &Style = getLLVMStyle()) {
70     EXPECT_EQ(Expected.str(), format(Expected, Style))
71         << "Expected code is not stable";
72     EXPECT_EQ(Expected.str(), format(Code, Style));
73     if (Style.Language == FormatStyle::LK_Cpp) {
74       // Objective-C++ is a superset of C++, so everything checked for C++
75       // needs to be checked for Objective-C++ as well.
76       FormatStyle ObjCStyle = Style;
77       ObjCStyle.Language = FormatStyle::LK_ObjC;
78       EXPECT_EQ(Expected.str(), format(test::messUp(Code), ObjCStyle));
79     }
80   }
81 
82   void verifyFormat(llvm::StringRef Code,
83                     const FormatStyle &Style = getLLVMStyle()) {
84     verifyFormat(Code, test::messUp(Code), Style);
85   }
86 
87   void verifyIncompleteFormat(llvm::StringRef Code,
88                               const FormatStyle &Style = getLLVMStyle()) {
89     EXPECT_EQ(Code.str(),
90               format(test::messUp(Code), Style, SC_ExpectIncomplete));
91   }
92 
93   void verifyGoogleFormat(llvm::StringRef Code) {
94     verifyFormat(Code, getGoogleStyle());
95   }
96 
97   void verifyIndependentOfContext(llvm::StringRef text) {
98     verifyFormat(text);
99     verifyFormat(llvm::Twine("void f() { " + text + " }").str());
100   }
101 
102   /// \brief Verify that clang-format does not crash on the given input.
103   void verifyNoCrash(llvm::StringRef Code,
104                      const FormatStyle &Style = getLLVMStyle()) {
105     format(Code, Style, SC_DoNotCheck);
106   }
107 
108   int ReplacementCount;
109 };
110 
111 TEST_F(FormatTest, MessUp) {
112   EXPECT_EQ("1 2 3", test::messUp("1 2 3"));
113   EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n"));
114   EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc"));
115   EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc"));
116   EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne"));
117 }
118 
119 TEST_F(FormatTest, DefaultLLVMStyleIsCpp) {
120   EXPECT_EQ(FormatStyle::LK_Cpp, getLLVMStyle().Language);
121 }
122 
123 TEST_F(FormatTest, LLVMStyleOverride) {
124   EXPECT_EQ(FormatStyle::LK_Proto,
125             getLLVMStyle(FormatStyle::LK_Proto).Language);
126 }
127 
128 //===----------------------------------------------------------------------===//
129 // Basic function tests.
130 //===----------------------------------------------------------------------===//
131 
132 TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) {
133   EXPECT_EQ(";", format(";"));
134 }
135 
136 TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
137   EXPECT_EQ("int i;", format("  int i;"));
138   EXPECT_EQ("\nint i;", format(" \n\t \v \f  int i;"));
139   EXPECT_EQ("int i;\nint j;", format("    int i; int j;"));
140   EXPECT_EQ("int i;\nint j;", format("    int i;\n  int j;"));
141 }
142 
143 TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
144   EXPECT_EQ("int i;", format("int\ni;"));
145 }
146 
147 TEST_F(FormatTest, FormatsNestedBlockStatements) {
148   EXPECT_EQ("{\n  {\n    {}\n  }\n}", format("{{{}}}"));
149 }
150 
151 TEST_F(FormatTest, FormatsNestedCall) {
152   verifyFormat("Method(f1, f2(f3));");
153   verifyFormat("Method(f1(f2, f3()));");
154   verifyFormat("Method(f1(f2, (f3())));");
155 }
156 
157 TEST_F(FormatTest, NestedNameSpecifiers) {
158   verifyFormat("vector<::Type> v;");
159   verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())");
160   verifyFormat("static constexpr bool Bar = decltype(bar())::value;");
161   verifyFormat("bool a = 2 < ::SomeFunction();");
162   verifyFormat("ALWAYS_INLINE ::std::string getName();");
163   verifyFormat("some::string getName();");
164 }
165 
166 TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
167   EXPECT_EQ("if (a) {\n"
168             "  f();\n"
169             "}",
170             format("if(a){f();}"));
171   EXPECT_EQ(4, ReplacementCount);
172   EXPECT_EQ("if (a) {\n"
173             "  f();\n"
174             "}",
175             format("if (a) {\n"
176                    "  f();\n"
177                    "}"));
178   EXPECT_EQ(0, ReplacementCount);
179   EXPECT_EQ("/*\r\n"
180             "\r\n"
181             "*/\r\n",
182             format("/*\r\n"
183                    "\r\n"
184                    "*/\r\n"));
185   EXPECT_EQ(0, ReplacementCount);
186 }
187 
188 TEST_F(FormatTest, RemovesEmptyLines) {
189   EXPECT_EQ("class C {\n"
190             "  int i;\n"
191             "};",
192             format("class C {\n"
193                    " int i;\n"
194                    "\n"
195                    "};"));
196 
197   // Don't remove empty lines at the start of namespaces or extern "C" blocks.
198   EXPECT_EQ("namespace N {\n"
199             "\n"
200             "int i;\n"
201             "}",
202             format("namespace N {\n"
203                    "\n"
204                    "int    i;\n"
205                    "}",
206                    getGoogleStyle()));
207   EXPECT_EQ("/* something */ namespace N {\n"
208             "\n"
209             "int i;\n"
210             "}",
211             format("/* something */ namespace N {\n"
212                    "\n"
213                    "int    i;\n"
214                    "}",
215                    getGoogleStyle()));
216   EXPECT_EQ("inline namespace N {\n"
217             "\n"
218             "int i;\n"
219             "}",
220             format("inline namespace N {\n"
221                    "\n"
222                    "int    i;\n"
223                    "}",
224                    getGoogleStyle()));
225   EXPECT_EQ("/* something */ inline namespace N {\n"
226             "\n"
227             "int i;\n"
228             "}",
229             format("/* something */ inline namespace N {\n"
230                    "\n"
231                    "int    i;\n"
232                    "}",
233                    getGoogleStyle()));
234   EXPECT_EQ("export namespace N {\n"
235             "\n"
236             "int i;\n"
237             "}",
238             format("export namespace N {\n"
239                    "\n"
240                    "int    i;\n"
241                    "}",
242                    getGoogleStyle()));
243   EXPECT_EQ("extern /**/ \"C\" /**/ {\n"
244             "\n"
245             "int i;\n"
246             "}",
247             format("extern /**/ \"C\" /**/ {\n"
248                    "\n"
249                    "int    i;\n"
250                    "}",
251                    getGoogleStyle()));
252 
253   // ...but do keep inlining and removing empty lines for non-block extern "C"
254   // functions.
255   verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle());
256   EXPECT_EQ("extern \"C\" int f() {\n"
257             "  int i = 42;\n"
258             "  return i;\n"
259             "}",
260             format("extern \"C\" int f() {\n"
261                    "\n"
262                    "  int i = 42;\n"
263                    "  return i;\n"
264                    "}",
265                    getGoogleStyle()));
266 
267   // Remove empty lines at the beginning and end of blocks.
268   EXPECT_EQ("void f() {\n"
269             "\n"
270             "  if (a) {\n"
271             "\n"
272             "    f();\n"
273             "  }\n"
274             "}",
275             format("void f() {\n"
276                    "\n"
277                    "  if (a) {\n"
278                    "\n"
279                    "    f();\n"
280                    "\n"
281                    "  }\n"
282                    "\n"
283                    "}",
284                    getLLVMStyle()));
285   EXPECT_EQ("void f() {\n"
286             "  if (a) {\n"
287             "    f();\n"
288             "  }\n"
289             "}",
290             format("void f() {\n"
291                    "\n"
292                    "  if (a) {\n"
293                    "\n"
294                    "    f();\n"
295                    "\n"
296                    "  }\n"
297                    "\n"
298                    "}",
299                    getGoogleStyle()));
300 
301   // Don't remove empty lines in more complex control statements.
302   EXPECT_EQ("void f() {\n"
303             "  if (a) {\n"
304             "    f();\n"
305             "\n"
306             "  } else if (b) {\n"
307             "    f();\n"
308             "  }\n"
309             "}",
310             format("void f() {\n"
311                    "  if (a) {\n"
312                    "    f();\n"
313                    "\n"
314                    "  } else if (b) {\n"
315                    "    f();\n"
316                    "\n"
317                    "  }\n"
318                    "\n"
319                    "}"));
320 
321   // Don't remove empty lines before namespace endings.
322   FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
323   LLVMWithNoNamespaceFix.FixNamespaceComments = false;
324   EXPECT_EQ("namespace {\n"
325             "int i;\n"
326             "\n"
327             "}",
328             format("namespace {\n"
329                    "int i;\n"
330                    "\n"
331                    "}",
332                    LLVMWithNoNamespaceFix));
333   EXPECT_EQ("namespace {\n"
334             "int i;\n"
335             "}",
336             format("namespace {\n"
337                    "int i;\n"
338                    "}",
339                    LLVMWithNoNamespaceFix));
340   EXPECT_EQ("namespace {\n"
341             "int i;\n"
342             "\n"
343             "};",
344             format("namespace {\n"
345                    "int i;\n"
346                    "\n"
347                    "};",
348                    LLVMWithNoNamespaceFix));
349   EXPECT_EQ("namespace {\n"
350             "int i;\n"
351             "};",
352             format("namespace {\n"
353                    "int i;\n"
354                    "};",
355                    LLVMWithNoNamespaceFix));
356   EXPECT_EQ("namespace {\n"
357             "int i;\n"
358             "\n"
359             "}",
360             format("namespace {\n"
361                    "int i;\n"
362                    "\n"
363                    "}"));
364   EXPECT_EQ("namespace {\n"
365             "int i;\n"
366             "\n"
367             "} // namespace",
368             format("namespace {\n"
369                    "int i;\n"
370                    "\n"
371                    "}  // namespace"));
372 
373   FormatStyle Style = getLLVMStyle();
374   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
375   Style.MaxEmptyLinesToKeep = 2;
376   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
377   Style.BraceWrapping.AfterClass = true;
378   Style.BraceWrapping.AfterFunction = true;
379   Style.KeepEmptyLinesAtTheStartOfBlocks = false;
380 
381   EXPECT_EQ("class Foo\n"
382             "{\n"
383             "  Foo() {}\n"
384             "\n"
385             "  void funk() {}\n"
386             "};",
387             format("class Foo\n"
388                    "{\n"
389                    "  Foo()\n"
390                    "  {\n"
391                    "  }\n"
392                    "\n"
393                    "  void funk() {}\n"
394                    "};",
395                    Style));
396 }
397 
398 TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
399   verifyFormat("x = (a) and (b);");
400   verifyFormat("x = (a) or (b);");
401   verifyFormat("x = (a) bitand (b);");
402   verifyFormat("x = (a) bitor (b);");
403   verifyFormat("x = (a) not_eq (b);");
404   verifyFormat("x = (a) and_eq (b);");
405   verifyFormat("x = (a) or_eq (b);");
406   verifyFormat("x = (a) xor (b);");
407 }
408 
409 TEST_F(FormatTest, RecognizesUnaryOperatorKeywords) {
410   verifyFormat("x = compl(a);");
411   verifyFormat("x = not(a);");
412   verifyFormat("x = bitand(a);");
413   // Unary operator must not be merged with the next identifier
414   verifyFormat("x = compl a;");
415   verifyFormat("x = not a;");
416   verifyFormat("x = bitand a;");
417 }
418 
419 //===----------------------------------------------------------------------===//
420 // Tests for control statements.
421 //===----------------------------------------------------------------------===//
422 
423 TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
424   verifyFormat("if (true)\n  f();\ng();");
425   verifyFormat("if (a)\n  if (b)\n    if (c)\n      g();\nh();");
426   verifyFormat("if (a)\n  if (b) {\n    f();\n  }\ng();");
427   verifyFormat("if constexpr (true)\n"
428                "  f();\ng();");
429   verifyFormat("if CONSTEXPR (true)\n"
430                "  f();\ng();");
431   verifyFormat("if constexpr (a)\n"
432                "  if constexpr (b)\n"
433                "    if constexpr (c)\n"
434                "      g();\n"
435                "h();");
436   verifyFormat("if CONSTEXPR (a)\n"
437                "  if CONSTEXPR (b)\n"
438                "    if CONSTEXPR (c)\n"
439                "      g();\n"
440                "h();");
441   verifyFormat("if constexpr (a)\n"
442                "  if constexpr (b) {\n"
443                "    f();\n"
444                "  }\n"
445                "g();");
446   verifyFormat("if CONSTEXPR (a)\n"
447                "  if CONSTEXPR (b) {\n"
448                "    f();\n"
449                "  }\n"
450                "g();");
451 
452   FormatStyle AllowsMergedIf = getLLVMStyle();
453   AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left;
454   AllowsMergedIf.AllowShortIfStatementsOnASingleLine =
455       FormatStyle::SIS_WithoutElse;
456   verifyFormat("if (a)\n"
457                "  // comment\n"
458                "  f();",
459                AllowsMergedIf);
460   verifyFormat("{\n"
461                "  if (a)\n"
462                "  label:\n"
463                "    f();\n"
464                "}",
465                AllowsMergedIf);
466   verifyFormat("#define A \\\n"
467                "  if (a)  \\\n"
468                "  label:  \\\n"
469                "    f()",
470                AllowsMergedIf);
471   verifyFormat("if (a)\n"
472                "  ;",
473                AllowsMergedIf);
474   verifyFormat("if (a)\n"
475                "  if (b) return;",
476                AllowsMergedIf);
477 
478   verifyFormat("if (a) // Can't merge this\n"
479                "  f();\n",
480                AllowsMergedIf);
481   verifyFormat("if (a) /* still don't merge */\n"
482                "  f();",
483                AllowsMergedIf);
484   verifyFormat("if (a) { // Never merge this\n"
485                "  f();\n"
486                "}",
487                AllowsMergedIf);
488   verifyFormat("if (a) { /* Never merge this */\n"
489                "  f();\n"
490                "}",
491                AllowsMergedIf);
492 
493   AllowsMergedIf.ColumnLimit = 14;
494   verifyFormat("if (a) return;", AllowsMergedIf);
495   verifyFormat("if (aaaaaaaaa)\n"
496                "  return;",
497                AllowsMergedIf);
498 
499   AllowsMergedIf.ColumnLimit = 13;
500   verifyFormat("if (a)\n  return;", AllowsMergedIf);
501 }
502 
503 TEST_F(FormatTest, FormatIfWithoutCompoundStatementButElseWith) {
504   FormatStyle AllowsMergedIf = getLLVMStyle();
505   AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left;
506   AllowsMergedIf.AllowShortIfStatementsOnASingleLine =
507       FormatStyle::SIS_WithoutElse;
508   verifyFormat("if (a)\n"
509                "  f();\n"
510                "else {\n"
511                "  g();\n"
512                "}",
513                AllowsMergedIf);
514   verifyFormat("if (a)\n"
515                "  f();\n"
516                "else\n"
517                "  g();\n",
518                AllowsMergedIf);
519 
520   AllowsMergedIf.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always;
521 
522   verifyFormat("if (a) f();\n"
523                "else {\n"
524                "  g();\n"
525                "}",
526                AllowsMergedIf);
527   verifyFormat("if (a) f();\n"
528                "else {\n"
529                "  if (a) f();\n"
530                "  else {\n"
531                "    g();\n"
532                "  }\n"
533                "  g();\n"
534                "}",
535                AllowsMergedIf);
536 }
537 
538 TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
539   FormatStyle AllowsMergedLoops = getLLVMStyle();
540   AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
541   verifyFormat("while (true) continue;", AllowsMergedLoops);
542   verifyFormat("for (;;) continue;", AllowsMergedLoops);
543   verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
544   verifyFormat("while (true)\n"
545                "  ;",
546                AllowsMergedLoops);
547   verifyFormat("for (;;)\n"
548                "  ;",
549                AllowsMergedLoops);
550   verifyFormat("for (;;)\n"
551                "  for (;;) continue;",
552                AllowsMergedLoops);
553   verifyFormat("for (;;) // Can't merge this\n"
554                "  continue;",
555                AllowsMergedLoops);
556   verifyFormat("for (;;) /* still don't merge */\n"
557                "  continue;",
558                AllowsMergedLoops);
559 }
560 
561 TEST_F(FormatTest, FormatShortBracedStatements) {
562   FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
563   AllowSimpleBracedStatements.ColumnLimit = 40;
564   AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine =
565       FormatStyle::SBS_Always;
566 
567   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine =
568       FormatStyle::SIS_WithoutElse;
569   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
570 
571   AllowSimpleBracedStatements.BreakBeforeBraces = FormatStyle::BS_Custom;
572   AllowSimpleBracedStatements.BraceWrapping.AfterFunction = true;
573   AllowSimpleBracedStatements.BraceWrapping.SplitEmptyRecord = false;
574 
575   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
576   verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
577   verifyFormat("if CONSTEXPR (true) {}", AllowSimpleBracedStatements);
578   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
579   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
580   verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
581   verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
582   verifyFormat("if CONSTEXPR (true) { f(); }", AllowSimpleBracedStatements);
583   verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
584   verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
585   verifyFormat("if (true) {\n"
586                "  ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
587                "}",
588                AllowSimpleBracedStatements);
589   verifyFormat("if (true) { //\n"
590                "  f();\n"
591                "}",
592                AllowSimpleBracedStatements);
593   verifyFormat("if (true) {\n"
594                "  f();\n"
595                "  f();\n"
596                "}",
597                AllowSimpleBracedStatements);
598   verifyFormat("if (true) {\n"
599                "  f();\n"
600                "} else {\n"
601                "  f();\n"
602                "}",
603                AllowSimpleBracedStatements);
604 
605   verifyFormat("struct A2 {\n"
606                "  int X;\n"
607                "};",
608                AllowSimpleBracedStatements);
609   verifyFormat("typedef struct A2 {\n"
610                "  int X;\n"
611                "} A2_t;",
612                AllowSimpleBracedStatements);
613   verifyFormat("template <int> struct A2 {\n"
614                "  struct B {};\n"
615                "};",
616                AllowSimpleBracedStatements);
617 
618   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine =
619       FormatStyle::SIS_Never;
620   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
621   verifyFormat("if (true) {\n"
622                "  f();\n"
623                "}",
624                AllowSimpleBracedStatements);
625   verifyFormat("if (true) {\n"
626                "  f();\n"
627                "} else {\n"
628                "  f();\n"
629                "}",
630                AllowSimpleBracedStatements);
631 
632   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
633   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
634   verifyFormat("while (true) {\n"
635                "  f();\n"
636                "}",
637                AllowSimpleBracedStatements);
638   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
639   verifyFormat("for (;;) {\n"
640                "  f();\n"
641                "}",
642                AllowSimpleBracedStatements);
643 
644   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine =
645       FormatStyle::SIS_WithoutElse;
646   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
647   AllowSimpleBracedStatements.BraceWrapping.AfterControlStatement =
648       FormatStyle::BWACS_Always;
649 
650   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
651   verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
652   verifyFormat("if CONSTEXPR (true) {}", AllowSimpleBracedStatements);
653   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
654   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
655   verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
656   verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
657   verifyFormat("if CONSTEXPR (true) { f(); }", AllowSimpleBracedStatements);
658   verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
659   verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
660   verifyFormat("if (true)\n"
661                "{\n"
662                "  ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
663                "}",
664                AllowSimpleBracedStatements);
665   verifyFormat("if (true)\n"
666                "{ //\n"
667                "  f();\n"
668                "}",
669                AllowSimpleBracedStatements);
670   verifyFormat("if (true)\n"
671                "{\n"
672                "  f();\n"
673                "  f();\n"
674                "}",
675                AllowSimpleBracedStatements);
676   verifyFormat("if (true)\n"
677                "{\n"
678                "  f();\n"
679                "} else\n"
680                "{\n"
681                "  f();\n"
682                "}",
683                AllowSimpleBracedStatements);
684 
685   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine =
686       FormatStyle::SIS_Never;
687   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
688   verifyFormat("if (true)\n"
689                "{\n"
690                "  f();\n"
691                "}",
692                AllowSimpleBracedStatements);
693   verifyFormat("if (true)\n"
694                "{\n"
695                "  f();\n"
696                "} else\n"
697                "{\n"
698                "  f();\n"
699                "}",
700                AllowSimpleBracedStatements);
701 
702   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
703   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
704   verifyFormat("while (true)\n"
705                "{\n"
706                "  f();\n"
707                "}",
708                AllowSimpleBracedStatements);
709   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
710   verifyFormat("for (;;)\n"
711                "{\n"
712                "  f();\n"
713                "}",
714                AllowSimpleBracedStatements);
715 }
716 
717 TEST_F(FormatTest, ShortBlocksInMacrosDontMergeWithCodeAfterMacro) {
718   FormatStyle Style = getLLVMStyleWithColumns(60);
719   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always;
720   Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse;
721   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
722   EXPECT_EQ("#define A                                                  \\\n"
723             "  if (HANDLEwernufrnuLwrmviferuvnierv)                     \\\n"
724             "  { RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; }\n"
725             "X;",
726             format("#define A \\\n"
727                    "   if (HANDLEwernufrnuLwrmviferuvnierv) { \\\n"
728                    "      RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; \\\n"
729                    "   }\n"
730                    "X;",
731                    Style));
732 }
733 
734 TEST_F(FormatTest, ParseIfElse) {
735   verifyFormat("if (true)\n"
736                "  if (true)\n"
737                "    if (true)\n"
738                "      f();\n"
739                "    else\n"
740                "      g();\n"
741                "  else\n"
742                "    h();\n"
743                "else\n"
744                "  i();");
745   verifyFormat("if (true)\n"
746                "  if (true)\n"
747                "    if (true) {\n"
748                "      if (true)\n"
749                "        f();\n"
750                "    } else {\n"
751                "      g();\n"
752                "    }\n"
753                "  else\n"
754                "    h();\n"
755                "else {\n"
756                "  i();\n"
757                "}");
758   verifyFormat("if (true)\n"
759                "  if constexpr (true)\n"
760                "    if (true) {\n"
761                "      if constexpr (true)\n"
762                "        f();\n"
763                "    } else {\n"
764                "      g();\n"
765                "    }\n"
766                "  else\n"
767                "    h();\n"
768                "else {\n"
769                "  i();\n"
770                "}");
771   verifyFormat("if (true)\n"
772                "  if CONSTEXPR (true)\n"
773                "    if (true) {\n"
774                "      if CONSTEXPR (true)\n"
775                "        f();\n"
776                "    } else {\n"
777                "      g();\n"
778                "    }\n"
779                "  else\n"
780                "    h();\n"
781                "else {\n"
782                "  i();\n"
783                "}");
784   verifyFormat("void f() {\n"
785                "  if (a) {\n"
786                "  } else {\n"
787                "  }\n"
788                "}");
789 }
790 
791 TEST_F(FormatTest, ElseIf) {
792   verifyFormat("if (a) {\n} else if (b) {\n}");
793   verifyFormat("if (a)\n"
794                "  f();\n"
795                "else if (b)\n"
796                "  g();\n"
797                "else\n"
798                "  h();");
799   verifyFormat("if constexpr (a)\n"
800                "  f();\n"
801                "else if constexpr (b)\n"
802                "  g();\n"
803                "else\n"
804                "  h();");
805   verifyFormat("if CONSTEXPR (a)\n"
806                "  f();\n"
807                "else if CONSTEXPR (b)\n"
808                "  g();\n"
809                "else\n"
810                "  h();");
811   verifyFormat("if (a) {\n"
812                "  f();\n"
813                "}\n"
814                "// or else ..\n"
815                "else {\n"
816                "  g()\n"
817                "}");
818 
819   verifyFormat("if (a) {\n"
820                "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
821                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
822                "}");
823   verifyFormat("if (a) {\n"
824                "} else if constexpr (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
825                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
826                "}");
827   verifyFormat("if (a) {\n"
828                "} else if CONSTEXPR (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
829                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
830                "}");
831   verifyFormat("if (a) {\n"
832                "} else if (\n"
833                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
834                "}",
835                getLLVMStyleWithColumns(62));
836   verifyFormat("if (a) {\n"
837                "} else if constexpr (\n"
838                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
839                "}",
840                getLLVMStyleWithColumns(62));
841   verifyFormat("if (a) {\n"
842                "} else if CONSTEXPR (\n"
843                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
844                "}",
845                getLLVMStyleWithColumns(62));
846 }
847 
848 TEST_F(FormatTest, FormatsForLoop) {
849   verifyFormat(
850       "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
851       "     ++VeryVeryLongLoopVariable)\n"
852       "  ;");
853   verifyFormat("for (;;)\n"
854                "  f();");
855   verifyFormat("for (;;) {\n}");
856   verifyFormat("for (;;) {\n"
857                "  f();\n"
858                "}");
859   verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
860 
861   verifyFormat(
862       "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
863       "                                          E = UnwrappedLines.end();\n"
864       "     I != E; ++I) {\n}");
865 
866   verifyFormat(
867       "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
868       "     ++IIIII) {\n}");
869   verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
870                "         aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
871                "     aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
872   verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
873                "         I = FD->getDeclsInPrototypeScope().begin(),\n"
874                "         E = FD->getDeclsInPrototypeScope().end();\n"
875                "     I != E; ++I) {\n}");
876   verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
877                "         I = Container.begin(),\n"
878                "         E = Container.end();\n"
879                "     I != E; ++I) {\n}",
880                getLLVMStyleWithColumns(76));
881 
882   verifyFormat(
883       "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
884       "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
885       "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
886       "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
887       "     ++aaaaaaaaaaa) {\n}");
888   verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
889                "                bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
890                "     ++i) {\n}");
891   verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
892                "     aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
893                "}");
894   verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
895                "         aaaaaaaaaa);\n"
896                "     iter; ++iter) {\n"
897                "}");
898   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
899                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
900                "     aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
901                "     ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
902 
903   // These should not be formatted as Objective-C for-in loops.
904   verifyFormat("for (Foo *x = 0; x != in; x++) {\n}");
905   verifyFormat("Foo *x;\nfor (x = 0; x != in; x++) {\n}");
906   verifyFormat("Foo *x;\nfor (x in y) {\n}");
907   verifyFormat(
908       "for (const Foo<Bar> &baz = in.value(); !baz.at_end(); ++baz) {\n}");
909 
910   FormatStyle NoBinPacking = getLLVMStyle();
911   NoBinPacking.BinPackParameters = false;
912   verifyFormat("for (int aaaaaaaaaaa = 1;\n"
913                "     aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
914                "                                           aaaaaaaaaaaaaaaa,\n"
915                "                                           aaaaaaaaaaaaaaaa,\n"
916                "                                           aaaaaaaaaaaaaaaa);\n"
917                "     aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
918                "}",
919                NoBinPacking);
920   verifyFormat(
921       "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
922       "                                          E = UnwrappedLines.end();\n"
923       "     I != E;\n"
924       "     ++I) {\n}",
925       NoBinPacking);
926 
927   FormatStyle AlignLeft = getLLVMStyle();
928   AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
929   verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft);
930 }
931 
932 TEST_F(FormatTest, RangeBasedForLoops) {
933   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
934                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
935   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
936                "     aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
937   verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
938                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
939   verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
940                "     aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
941 }
942 
943 TEST_F(FormatTest, ForEachLoops) {
944   verifyFormat("void f() {\n"
945                "  foreach (Item *item, itemlist) {}\n"
946                "  Q_FOREACH (Item *item, itemlist) {}\n"
947                "  BOOST_FOREACH (Item *item, itemlist) {}\n"
948                "  UNKNOWN_FORACH(Item * item, itemlist) {}\n"
949                "}");
950 
951   // As function-like macros.
952   verifyFormat("#define foreach(x, y)\n"
953                "#define Q_FOREACH(x, y)\n"
954                "#define BOOST_FOREACH(x, y)\n"
955                "#define UNKNOWN_FOREACH(x, y)\n");
956 
957   // Not as function-like macros.
958   verifyFormat("#define foreach (x, y)\n"
959                "#define Q_FOREACH (x, y)\n"
960                "#define BOOST_FOREACH (x, y)\n"
961                "#define UNKNOWN_FOREACH (x, y)\n");
962 }
963 
964 TEST_F(FormatTest, FormatsWhileLoop) {
965   verifyFormat("while (true) {\n}");
966   verifyFormat("while (true)\n"
967                "  f();");
968   verifyFormat("while () {\n}");
969   verifyFormat("while () {\n"
970                "  f();\n"
971                "}");
972 }
973 
974 TEST_F(FormatTest, FormatsDoWhile) {
975   verifyFormat("do {\n"
976                "  do_something();\n"
977                "} while (something());");
978   verifyFormat("do\n"
979                "  do_something();\n"
980                "while (something());");
981 }
982 
983 TEST_F(FormatTest, FormatsSwitchStatement) {
984   verifyFormat("switch (x) {\n"
985                "case 1:\n"
986                "  f();\n"
987                "  break;\n"
988                "case kFoo:\n"
989                "case ns::kBar:\n"
990                "case kBaz:\n"
991                "  break;\n"
992                "default:\n"
993                "  g();\n"
994                "  break;\n"
995                "}");
996   verifyFormat("switch (x) {\n"
997                "case 1: {\n"
998                "  f();\n"
999                "  break;\n"
1000                "}\n"
1001                "case 2: {\n"
1002                "  break;\n"
1003                "}\n"
1004                "}");
1005   verifyFormat("switch (x) {\n"
1006                "case 1: {\n"
1007                "  f();\n"
1008                "  {\n"
1009                "    g();\n"
1010                "    h();\n"
1011                "  }\n"
1012                "  break;\n"
1013                "}\n"
1014                "}");
1015   verifyFormat("switch (x) {\n"
1016                "case 1: {\n"
1017                "  f();\n"
1018                "  if (foo) {\n"
1019                "    g();\n"
1020                "    h();\n"
1021                "  }\n"
1022                "  break;\n"
1023                "}\n"
1024                "}");
1025   verifyFormat("switch (x) {\n"
1026                "case 1: {\n"
1027                "  f();\n"
1028                "  g();\n"
1029                "} break;\n"
1030                "}");
1031   verifyFormat("switch (test)\n"
1032                "  ;");
1033   verifyFormat("switch (x) {\n"
1034                "default: {\n"
1035                "  // Do nothing.\n"
1036                "}\n"
1037                "}");
1038   verifyFormat("switch (x) {\n"
1039                "// comment\n"
1040                "// if 1, do f()\n"
1041                "case 1:\n"
1042                "  f();\n"
1043                "}");
1044   verifyFormat("switch (x) {\n"
1045                "case 1:\n"
1046                "  // Do amazing stuff\n"
1047                "  {\n"
1048                "    f();\n"
1049                "    g();\n"
1050                "  }\n"
1051                "  break;\n"
1052                "}");
1053   verifyFormat("#define A          \\\n"
1054                "  switch (x) {     \\\n"
1055                "  case a:          \\\n"
1056                "    foo = b;       \\\n"
1057                "  }",
1058                getLLVMStyleWithColumns(20));
1059   verifyFormat("#define OPERATION_CASE(name)           \\\n"
1060                "  case OP_name:                        \\\n"
1061                "    return operations::Operation##name\n",
1062                getLLVMStyleWithColumns(40));
1063   verifyFormat("switch (x) {\n"
1064                "case 1:;\n"
1065                "default:;\n"
1066                "  int i;\n"
1067                "}");
1068 
1069   verifyGoogleFormat("switch (x) {\n"
1070                      "  case 1:\n"
1071                      "    f();\n"
1072                      "    break;\n"
1073                      "  case kFoo:\n"
1074                      "  case ns::kBar:\n"
1075                      "  case kBaz:\n"
1076                      "    break;\n"
1077                      "  default:\n"
1078                      "    g();\n"
1079                      "    break;\n"
1080                      "}");
1081   verifyGoogleFormat("switch (x) {\n"
1082                      "  case 1: {\n"
1083                      "    f();\n"
1084                      "    break;\n"
1085                      "  }\n"
1086                      "}");
1087   verifyGoogleFormat("switch (test)\n"
1088                      "  ;");
1089 
1090   verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
1091                      "  case OP_name:              \\\n"
1092                      "    return operations::Operation##name\n");
1093   verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
1094                      "  // Get the correction operation class.\n"
1095                      "  switch (OpCode) {\n"
1096                      "    CASE(Add);\n"
1097                      "    CASE(Subtract);\n"
1098                      "    default:\n"
1099                      "      return operations::Unknown;\n"
1100                      "  }\n"
1101                      "#undef OPERATION_CASE\n"
1102                      "}");
1103   verifyFormat("DEBUG({\n"
1104                "  switch (x) {\n"
1105                "  case A:\n"
1106                "    f();\n"
1107                "    break;\n"
1108                "    // fallthrough\n"
1109                "  case B:\n"
1110                "    g();\n"
1111                "    break;\n"
1112                "  }\n"
1113                "});");
1114   EXPECT_EQ("DEBUG({\n"
1115             "  switch (x) {\n"
1116             "  case A:\n"
1117             "    f();\n"
1118             "    break;\n"
1119             "  // On B:\n"
1120             "  case B:\n"
1121             "    g();\n"
1122             "    break;\n"
1123             "  }\n"
1124             "});",
1125             format("DEBUG({\n"
1126                    "  switch (x) {\n"
1127                    "  case A:\n"
1128                    "    f();\n"
1129                    "    break;\n"
1130                    "  // On B:\n"
1131                    "  case B:\n"
1132                    "    g();\n"
1133                    "    break;\n"
1134                    "  }\n"
1135                    "});",
1136                    getLLVMStyle()));
1137   EXPECT_EQ("switch (n) {\n"
1138             "case 0: {\n"
1139             "  return false;\n"
1140             "}\n"
1141             "default: {\n"
1142             "  return true;\n"
1143             "}\n"
1144             "}",
1145             format("switch (n)\n"
1146                    "{\n"
1147                    "case 0: {\n"
1148                    "  return false;\n"
1149                    "}\n"
1150                    "default: {\n"
1151                    "  return true;\n"
1152                    "}\n"
1153                    "}",
1154                    getLLVMStyle()));
1155   verifyFormat("switch (a) {\n"
1156                "case (b):\n"
1157                "  return;\n"
1158                "}");
1159 
1160   verifyFormat("switch (a) {\n"
1161                "case some_namespace::\n"
1162                "    some_constant:\n"
1163                "  return;\n"
1164                "}",
1165                getLLVMStyleWithColumns(34));
1166 
1167   FormatStyle Style = getLLVMStyle();
1168   Style.IndentCaseLabels = true;
1169   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never;
1170   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1171   Style.BraceWrapping.AfterCaseLabel = true;
1172   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always;
1173   EXPECT_EQ("switch (n)\n"
1174             "{\n"
1175             "  case 0:\n"
1176             "  {\n"
1177             "    return false;\n"
1178             "  }\n"
1179             "  default:\n"
1180             "  {\n"
1181             "    return true;\n"
1182             "  }\n"
1183             "}",
1184             format("switch (n) {\n"
1185                    "  case 0: {\n"
1186                    "    return false;\n"
1187                    "  }\n"
1188                    "  default: {\n"
1189                    "    return true;\n"
1190                    "  }\n"
1191                    "}",
1192                    Style));
1193   Style.BraceWrapping.AfterCaseLabel = false;
1194   EXPECT_EQ("switch (n)\n"
1195             "{\n"
1196             "  case 0: {\n"
1197             "    return false;\n"
1198             "  }\n"
1199             "  default: {\n"
1200             "    return true;\n"
1201             "  }\n"
1202             "}",
1203             format("switch (n) {\n"
1204                    "  case 0:\n"
1205                    "  {\n"
1206                    "    return false;\n"
1207                    "  }\n"
1208                    "  default:\n"
1209                    "  {\n"
1210                    "    return true;\n"
1211                    "  }\n"
1212                    "}",
1213                    Style));
1214 }
1215 
1216 TEST_F(FormatTest, CaseRanges) {
1217   verifyFormat("switch (x) {\n"
1218                "case 'A' ... 'Z':\n"
1219                "case 1 ... 5:\n"
1220                "case a ... b:\n"
1221                "  break;\n"
1222                "}");
1223 }
1224 
1225 TEST_F(FormatTest, ShortCaseLabels) {
1226   FormatStyle Style = getLLVMStyle();
1227   Style.AllowShortCaseLabelsOnASingleLine = true;
1228   verifyFormat("switch (a) {\n"
1229                "case 1: x = 1; break;\n"
1230                "case 2: return;\n"
1231                "case 3:\n"
1232                "case 4:\n"
1233                "case 5: return;\n"
1234                "case 6: // comment\n"
1235                "  return;\n"
1236                "case 7:\n"
1237                "  // comment\n"
1238                "  return;\n"
1239                "case 8:\n"
1240                "  x = 8; // comment\n"
1241                "  break;\n"
1242                "default: y = 1; break;\n"
1243                "}",
1244                Style);
1245   verifyFormat("switch (a) {\n"
1246                "case 0: return; // comment\n"
1247                "case 1: break;  // comment\n"
1248                "case 2: return;\n"
1249                "// comment\n"
1250                "case 3: return;\n"
1251                "// comment 1\n"
1252                "// comment 2\n"
1253                "// comment 3\n"
1254                "case 4: break; /* comment */\n"
1255                "case 5:\n"
1256                "  // comment\n"
1257                "  break;\n"
1258                "case 6: /* comment */ x = 1; break;\n"
1259                "case 7: x = /* comment */ 1; break;\n"
1260                "case 8:\n"
1261                "  x = 1; /* comment */\n"
1262                "  break;\n"
1263                "case 9:\n"
1264                "  break; // comment line 1\n"
1265                "         // comment line 2\n"
1266                "}",
1267                Style);
1268   EXPECT_EQ("switch (a) {\n"
1269             "case 1:\n"
1270             "  x = 8;\n"
1271             "  // fall through\n"
1272             "case 2: x = 8;\n"
1273             "// comment\n"
1274             "case 3:\n"
1275             "  return; /* comment line 1\n"
1276             "           * comment line 2 */\n"
1277             "case 4: i = 8;\n"
1278             "// something else\n"
1279             "#if FOO\n"
1280             "case 5: break;\n"
1281             "#endif\n"
1282             "}",
1283             format("switch (a) {\n"
1284                    "case 1: x = 8;\n"
1285                    "  // fall through\n"
1286                    "case 2:\n"
1287                    "  x = 8;\n"
1288                    "// comment\n"
1289                    "case 3:\n"
1290                    "  return; /* comment line 1\n"
1291                    "           * comment line 2 */\n"
1292                    "case 4:\n"
1293                    "  i = 8;\n"
1294                    "// something else\n"
1295                    "#if FOO\n"
1296                    "case 5: break;\n"
1297                    "#endif\n"
1298                    "}",
1299                    Style));
1300   EXPECT_EQ("switch (a) {\n"
1301             "case 0:\n"
1302             "  return; // long long long long long long long long long long "
1303             "long long comment\n"
1304             "          // line\n"
1305             "}",
1306             format("switch (a) {\n"
1307                    "case 0: return; // long long long long long long long long "
1308                    "long long long long comment line\n"
1309                    "}",
1310                    Style));
1311   EXPECT_EQ("switch (a) {\n"
1312             "case 0:\n"
1313             "  return; /* long long long long long long long long long long "
1314             "long long comment\n"
1315             "             line */\n"
1316             "}",
1317             format("switch (a) {\n"
1318                    "case 0: return; /* long long long long long long long long "
1319                    "long long long long comment line */\n"
1320                    "}",
1321                    Style));
1322   verifyFormat("switch (a) {\n"
1323                "#if FOO\n"
1324                "case 0: return 0;\n"
1325                "#endif\n"
1326                "}",
1327                Style);
1328   verifyFormat("switch (a) {\n"
1329                "case 1: {\n"
1330                "}\n"
1331                "case 2: {\n"
1332                "  return;\n"
1333                "}\n"
1334                "case 3: {\n"
1335                "  x = 1;\n"
1336                "  return;\n"
1337                "}\n"
1338                "case 4:\n"
1339                "  if (x)\n"
1340                "    return;\n"
1341                "}",
1342                Style);
1343   Style.ColumnLimit = 21;
1344   verifyFormat("switch (a) {\n"
1345                "case 1: x = 1; break;\n"
1346                "case 2: return;\n"
1347                "case 3:\n"
1348                "case 4:\n"
1349                "case 5: return;\n"
1350                "default:\n"
1351                "  y = 1;\n"
1352                "  break;\n"
1353                "}",
1354                Style);
1355   Style.ColumnLimit = 80;
1356   Style.AllowShortCaseLabelsOnASingleLine = false;
1357   Style.IndentCaseLabels = true;
1358   EXPECT_EQ("switch (n) {\n"
1359             "  default /*comments*/:\n"
1360             "    return true;\n"
1361             "  case 0:\n"
1362             "    return false;\n"
1363             "}",
1364             format("switch (n) {\n"
1365                    "default/*comments*/:\n"
1366                    "  return true;\n"
1367                    "case 0:\n"
1368                    "  return false;\n"
1369                    "}",
1370                    Style));
1371   Style.AllowShortCaseLabelsOnASingleLine = true;
1372   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1373   Style.BraceWrapping.AfterCaseLabel = true;
1374   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always;
1375   EXPECT_EQ("switch (n)\n"
1376             "{\n"
1377             "  case 0:\n"
1378             "  {\n"
1379             "    return false;\n"
1380             "  }\n"
1381             "  default:\n"
1382             "  {\n"
1383             "    return true;\n"
1384             "  }\n"
1385             "}",
1386             format("switch (n) {\n"
1387                    "  case 0: {\n"
1388                    "    return false;\n"
1389                    "  }\n"
1390                    "  default:\n"
1391                    "  {\n"
1392                    "    return true;\n"
1393                    "  }\n"
1394                    "}",
1395                    Style));
1396 }
1397 
1398 TEST_F(FormatTest, FormatsLabels) {
1399   verifyFormat("void f() {\n"
1400                "  some_code();\n"
1401                "test_label:\n"
1402                "  some_other_code();\n"
1403                "  {\n"
1404                "    some_more_code();\n"
1405                "  another_label:\n"
1406                "    some_more_code();\n"
1407                "  }\n"
1408                "}");
1409   verifyFormat("{\n"
1410                "  some_code();\n"
1411                "test_label:\n"
1412                "  some_other_code();\n"
1413                "}");
1414   verifyFormat("{\n"
1415                "  some_code();\n"
1416                "test_label:;\n"
1417                "  int i = 0;\n"
1418                "}");
1419   FormatStyle Style = getLLVMStyle();
1420   Style.IndentGotoLabels = false;
1421   verifyFormat("void f() {\n"
1422                "  some_code();\n"
1423                "test_label:\n"
1424                "  some_other_code();\n"
1425                "  {\n"
1426                "    some_more_code();\n"
1427                "another_label:\n"
1428                "    some_more_code();\n"
1429                "  }\n"
1430                "}",
1431                Style);
1432   verifyFormat("{\n"
1433                "  some_code();\n"
1434                "test_label:\n"
1435                "  some_other_code();\n"
1436                "}",
1437                Style);
1438   verifyFormat("{\n"
1439                "  some_code();\n"
1440                "test_label:;\n"
1441                "  int i = 0;\n"
1442                "}");
1443 }
1444 
1445 TEST_F(FormatTest, MultiLineControlStatements) {
1446   FormatStyle Style = getLLVMStyle();
1447   Style.BreakBeforeBraces = FormatStyle::BraceBreakingStyle::BS_Custom;
1448   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_MultiLine;
1449   Style.ColumnLimit = 20;
1450   // Short lines should keep opening brace on same line.
1451   EXPECT_EQ("if (foo) {\n"
1452             "  bar();\n"
1453             "}",
1454             format("if(foo){bar();}", Style));
1455   EXPECT_EQ("if (foo) {\n"
1456             "  bar();\n"
1457             "} else {\n"
1458             "  baz();\n"
1459             "}",
1460             format("if(foo){bar();}else{baz();}", Style));
1461   EXPECT_EQ("if (foo && bar) {\n"
1462             "  baz();\n"
1463             "}",
1464             format("if(foo&&bar){baz();}", Style));
1465   EXPECT_EQ("if (foo) {\n"
1466             "  bar();\n"
1467             "} else if (baz) {\n"
1468             "  quux();\n"
1469             "}",
1470             format("if(foo){bar();}else if(baz){quux();}", Style));
1471   EXPECT_EQ(
1472       "if (foo) {\n"
1473       "  bar();\n"
1474       "} else if (baz) {\n"
1475       "  quux();\n"
1476       "} else {\n"
1477       "  foobar();\n"
1478       "}",
1479       format("if(foo){bar();}else if(baz){quux();}else{foobar();}", Style));
1480   EXPECT_EQ("for (;;) {\n"
1481             "  foo();\n"
1482             "}",
1483             format("for(;;){foo();}"));
1484   EXPECT_EQ("while (1) {\n"
1485             "  foo();\n"
1486             "}",
1487             format("while(1){foo();}", Style));
1488   EXPECT_EQ("switch (foo) {\n"
1489             "case bar:\n"
1490             "  return;\n"
1491             "}",
1492             format("switch(foo){case bar:return;}", Style));
1493   EXPECT_EQ("try {\n"
1494             "  foo();\n"
1495             "} catch (...) {\n"
1496             "  bar();\n"
1497             "}",
1498             format("try{foo();}catch(...){bar();}", Style));
1499   EXPECT_EQ("do {\n"
1500             "  foo();\n"
1501             "} while (bar &&\n"
1502             "         baz);",
1503             format("do{foo();}while(bar&&baz);", Style));
1504   // Long lines should put opening brace on new line.
1505   EXPECT_EQ("if (foo && bar &&\n"
1506             "    baz)\n"
1507             "{\n"
1508             "  quux();\n"
1509             "}",
1510             format("if(foo&&bar&&baz){quux();}", Style));
1511   EXPECT_EQ("if (foo && bar &&\n"
1512             "    baz)\n"
1513             "{\n"
1514             "  quux();\n"
1515             "}",
1516             format("if (foo && bar &&\n"
1517                    "    baz) {\n"
1518                    "  quux();\n"
1519                    "}",
1520                    Style));
1521   EXPECT_EQ("if (foo) {\n"
1522             "  bar();\n"
1523             "} else if (baz ||\n"
1524             "           quux)\n"
1525             "{\n"
1526             "  foobar();\n"
1527             "}",
1528             format("if(foo){bar();}else if(baz||quux){foobar();}", Style));
1529   EXPECT_EQ(
1530       "if (foo) {\n"
1531       "  bar();\n"
1532       "} else if (baz ||\n"
1533       "           quux)\n"
1534       "{\n"
1535       "  foobar();\n"
1536       "} else {\n"
1537       "  barbaz();\n"
1538       "}",
1539       format("if(foo){bar();}else if(baz||quux){foobar();}else{barbaz();}",
1540              Style));
1541   EXPECT_EQ("for (int i = 0;\n"
1542             "     i < 10; ++i)\n"
1543             "{\n"
1544             "  foo();\n"
1545             "}",
1546             format("for(int i=0;i<10;++i){foo();}", Style));
1547   EXPECT_EQ("while (foo || bar ||\n"
1548             "       baz)\n"
1549             "{\n"
1550             "  quux();\n"
1551             "}",
1552             format("while(foo||bar||baz){quux();}", Style));
1553   EXPECT_EQ("switch (\n"
1554             "    foo = barbaz)\n"
1555             "{\n"
1556             "case quux:\n"
1557             "  return;\n"
1558             "}",
1559             format("switch(foo=barbaz){case quux:return;}", Style));
1560   EXPECT_EQ("try {\n"
1561             "  foo();\n"
1562             "} catch (\n"
1563             "    Exception &bar)\n"
1564             "{\n"
1565             "  baz();\n"
1566             "}",
1567             format("try{foo();}catch(Exception&bar){baz();}", Style));
1568 }
1569 
1570 //===----------------------------------------------------------------------===//
1571 // Tests for classes, namespaces, etc.
1572 //===----------------------------------------------------------------------===//
1573 
1574 TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
1575   verifyFormat("class A {};");
1576 }
1577 
1578 TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1579   verifyFormat("class A {\n"
1580                "public:\n"
1581                "public: // comment\n"
1582                "protected:\n"
1583                "private:\n"
1584                "  void f() {}\n"
1585                "};");
1586   verifyFormat("export class A {\n"
1587                "public:\n"
1588                "public: // comment\n"
1589                "protected:\n"
1590                "private:\n"
1591                "  void f() {}\n"
1592                "};");
1593   verifyGoogleFormat("class A {\n"
1594                      " public:\n"
1595                      " protected:\n"
1596                      " private:\n"
1597                      "  void f() {}\n"
1598                      "};");
1599   verifyGoogleFormat("export class A {\n"
1600                      " public:\n"
1601                      " protected:\n"
1602                      " private:\n"
1603                      "  void f() {}\n"
1604                      "};");
1605   verifyFormat("class A {\n"
1606                "public slots:\n"
1607                "  void f1() {}\n"
1608                "public Q_SLOTS:\n"
1609                "  void f2() {}\n"
1610                "protected slots:\n"
1611                "  void f3() {}\n"
1612                "protected Q_SLOTS:\n"
1613                "  void f4() {}\n"
1614                "private slots:\n"
1615                "  void f5() {}\n"
1616                "private Q_SLOTS:\n"
1617                "  void f6() {}\n"
1618                "signals:\n"
1619                "  void g1();\n"
1620                "Q_SIGNALS:\n"
1621                "  void g2();\n"
1622                "};");
1623 
1624   // Don't interpret 'signals' the wrong way.
1625   verifyFormat("signals.set();");
1626   verifyFormat("for (Signals signals : f()) {\n}");
1627   verifyFormat("{\n"
1628                "  signals.set(); // This needs indentation.\n"
1629                "}");
1630   verifyFormat("void f() {\n"
1631                "label:\n"
1632                "  signals.baz();\n"
1633                "}");
1634 }
1635 
1636 TEST_F(FormatTest, SeparatesLogicalBlocks) {
1637   EXPECT_EQ("class A {\n"
1638             "public:\n"
1639             "  void f();\n"
1640             "\n"
1641             "private:\n"
1642             "  void g() {}\n"
1643             "  // test\n"
1644             "protected:\n"
1645             "  int h;\n"
1646             "};",
1647             format("class A {\n"
1648                    "public:\n"
1649                    "void f();\n"
1650                    "private:\n"
1651                    "void g() {}\n"
1652                    "// test\n"
1653                    "protected:\n"
1654                    "int h;\n"
1655                    "};"));
1656   EXPECT_EQ("class A {\n"
1657             "protected:\n"
1658             "public:\n"
1659             "  void f();\n"
1660             "};",
1661             format("class A {\n"
1662                    "protected:\n"
1663                    "\n"
1664                    "public:\n"
1665                    "\n"
1666                    "  void f();\n"
1667                    "};"));
1668 
1669   // Even ensure proper spacing inside macros.
1670   EXPECT_EQ("#define B     \\\n"
1671             "  class A {   \\\n"
1672             "   protected: \\\n"
1673             "   public:    \\\n"
1674             "    void f(); \\\n"
1675             "  };",
1676             format("#define B     \\\n"
1677                    "  class A {   \\\n"
1678                    "   protected: \\\n"
1679                    "              \\\n"
1680                    "   public:    \\\n"
1681                    "              \\\n"
1682                    "    void f(); \\\n"
1683                    "  };",
1684                    getGoogleStyle()));
1685   // But don't remove empty lines after macros ending in access specifiers.
1686   EXPECT_EQ("#define A private:\n"
1687             "\n"
1688             "int i;",
1689             format("#define A         private:\n"
1690                    "\n"
1691                    "int              i;"));
1692 }
1693 
1694 TEST_F(FormatTest, FormatsClasses) {
1695   verifyFormat("class A : public B {};");
1696   verifyFormat("class A : public ::B {};");
1697 
1698   verifyFormat(
1699       "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1700       "                             public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
1701   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1702                "    : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1703                "      public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
1704   verifyFormat(
1705       "class A : public B, public C, public D, public E, public F {};");
1706   verifyFormat("class AAAAAAAAAAAA : public B,\n"
1707                "                     public C,\n"
1708                "                     public D,\n"
1709                "                     public E,\n"
1710                "                     public F,\n"
1711                "                     public G {};");
1712 
1713   verifyFormat("class\n"
1714                "    ReallyReallyLongClassName {\n"
1715                "  int i;\n"
1716                "};",
1717                getLLVMStyleWithColumns(32));
1718   verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1719                "                           aaaaaaaaaaaaaaaa> {};");
1720   verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1721                "    : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1722                "                                 aaaaaaaaaaaaaaaaaaaaaa> {};");
1723   verifyFormat("template <class R, class C>\n"
1724                "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1725                "    : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
1726   verifyFormat("class ::A::B {};");
1727 }
1728 
1729 TEST_F(FormatTest, BreakInheritanceStyle) {
1730   FormatStyle StyleWithInheritanceBreakBeforeComma = getLLVMStyle();
1731   StyleWithInheritanceBreakBeforeComma.BreakInheritanceList =
1732       FormatStyle::BILS_BeforeComma;
1733   verifyFormat("class MyClass : public X {};",
1734                StyleWithInheritanceBreakBeforeComma);
1735   verifyFormat("class MyClass\n"
1736                "    : public X\n"
1737                "    , public Y {};",
1738                StyleWithInheritanceBreakBeforeComma);
1739   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA\n"
1740                "    : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n"
1741                "    , public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};",
1742                StyleWithInheritanceBreakBeforeComma);
1743   verifyFormat("struct aaaaaaaaaaaaa\n"
1744                "    : public aaaaaaaaaaaaaaaaaaa< // break\n"
1745                "          aaaaaaaaaaaaaaaa> {};",
1746                StyleWithInheritanceBreakBeforeComma);
1747 
1748   FormatStyle StyleWithInheritanceBreakAfterColon = getLLVMStyle();
1749   StyleWithInheritanceBreakAfterColon.BreakInheritanceList =
1750       FormatStyle::BILS_AfterColon;
1751   verifyFormat("class MyClass : public X {};",
1752                StyleWithInheritanceBreakAfterColon);
1753   verifyFormat("class MyClass : public X, public Y {};",
1754                StyleWithInheritanceBreakAfterColon);
1755   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA :\n"
1756                "    public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1757                "    public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};",
1758                StyleWithInheritanceBreakAfterColon);
1759   verifyFormat("struct aaaaaaaaaaaaa :\n"
1760                "    public aaaaaaaaaaaaaaaaaaa< // break\n"
1761                "        aaaaaaaaaaaaaaaa> {};",
1762                StyleWithInheritanceBreakAfterColon);
1763 }
1764 
1765 TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
1766   verifyFormat("class A {\n} a, b;");
1767   verifyFormat("struct A {\n} a, b;");
1768   verifyFormat("union A {\n} a;");
1769 }
1770 
1771 TEST_F(FormatTest, FormatsEnum) {
1772   verifyFormat("enum {\n"
1773                "  Zero,\n"
1774                "  One = 1,\n"
1775                "  Two = One + 1,\n"
1776                "  Three = (One + Two),\n"
1777                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1778                "  Five = (One, Two, Three, Four, 5)\n"
1779                "};");
1780   verifyGoogleFormat("enum {\n"
1781                      "  Zero,\n"
1782                      "  One = 1,\n"
1783                      "  Two = One + 1,\n"
1784                      "  Three = (One + Two),\n"
1785                      "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1786                      "  Five = (One, Two, Three, Four, 5)\n"
1787                      "};");
1788   verifyFormat("enum Enum {};");
1789   verifyFormat("enum {};");
1790   verifyFormat("enum X E {} d;");
1791   verifyFormat("enum __attribute__((...)) E {} d;");
1792   verifyFormat("enum __declspec__((...)) E {} d;");
1793   verifyFormat("enum {\n"
1794                "  Bar = Foo<int, int>::value\n"
1795                "};",
1796                getLLVMStyleWithColumns(30));
1797 
1798   verifyFormat("enum ShortEnum { A, B, C };");
1799   verifyGoogleFormat("enum ShortEnum { A, B, C };");
1800 
1801   EXPECT_EQ("enum KeepEmptyLines {\n"
1802             "  ONE,\n"
1803             "\n"
1804             "  TWO,\n"
1805             "\n"
1806             "  THREE\n"
1807             "}",
1808             format("enum KeepEmptyLines {\n"
1809                    "  ONE,\n"
1810                    "\n"
1811                    "  TWO,\n"
1812                    "\n"
1813                    "\n"
1814                    "  THREE\n"
1815                    "}"));
1816   verifyFormat("enum E { // comment\n"
1817                "  ONE,\n"
1818                "  TWO\n"
1819                "};\n"
1820                "int i;");
1821   // Not enums.
1822   verifyFormat("enum X f() {\n"
1823                "  a();\n"
1824                "  return 42;\n"
1825                "}");
1826   verifyFormat("enum X Type::f() {\n"
1827                "  a();\n"
1828                "  return 42;\n"
1829                "}");
1830   verifyFormat("enum ::X f() {\n"
1831                "  a();\n"
1832                "  return 42;\n"
1833                "}");
1834   verifyFormat("enum ns::X f() {\n"
1835                "  a();\n"
1836                "  return 42;\n"
1837                "}");
1838 }
1839 
1840 TEST_F(FormatTest, FormatsEnumsWithErrors) {
1841   verifyFormat("enum Type {\n"
1842                "  One = 0; // These semicolons should be commas.\n"
1843                "  Two = 1;\n"
1844                "};");
1845   verifyFormat("namespace n {\n"
1846                "enum Type {\n"
1847                "  One,\n"
1848                "  Two, // missing };\n"
1849                "  int i;\n"
1850                "}\n"
1851                "void g() {}");
1852 }
1853 
1854 TEST_F(FormatTest, FormatsEnumStruct) {
1855   verifyFormat("enum struct {\n"
1856                "  Zero,\n"
1857                "  One = 1,\n"
1858                "  Two = One + 1,\n"
1859                "  Three = (One + Two),\n"
1860                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1861                "  Five = (One, Two, Three, Four, 5)\n"
1862                "};");
1863   verifyFormat("enum struct Enum {};");
1864   verifyFormat("enum struct {};");
1865   verifyFormat("enum struct X E {} d;");
1866   verifyFormat("enum struct __attribute__((...)) E {} d;");
1867   verifyFormat("enum struct __declspec__((...)) E {} d;");
1868   verifyFormat("enum struct X f() {\n  a();\n  return 42;\n}");
1869 }
1870 
1871 TEST_F(FormatTest, FormatsEnumClass) {
1872   verifyFormat("enum class {\n"
1873                "  Zero,\n"
1874                "  One = 1,\n"
1875                "  Two = One + 1,\n"
1876                "  Three = (One + Two),\n"
1877                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1878                "  Five = (One, Two, Three, Four, 5)\n"
1879                "};");
1880   verifyFormat("enum class Enum {};");
1881   verifyFormat("enum class {};");
1882   verifyFormat("enum class X E {} d;");
1883   verifyFormat("enum class __attribute__((...)) E {} d;");
1884   verifyFormat("enum class __declspec__((...)) E {} d;");
1885   verifyFormat("enum class X f() {\n  a();\n  return 42;\n}");
1886 }
1887 
1888 TEST_F(FormatTest, FormatsEnumTypes) {
1889   verifyFormat("enum X : int {\n"
1890                "  A, // Force multiple lines.\n"
1891                "  B\n"
1892                "};");
1893   verifyFormat("enum X : int { A, B };");
1894   verifyFormat("enum X : std::uint32_t { A, B };");
1895 }
1896 
1897 TEST_F(FormatTest, FormatsTypedefEnum) {
1898   FormatStyle Style = getLLVMStyle();
1899   Style.ColumnLimit = 40;
1900   verifyFormat("typedef enum {} EmptyEnum;");
1901   verifyFormat("typedef enum { A, B, C } ShortEnum;");
1902   verifyFormat("typedef enum {\n"
1903                "  ZERO = 0,\n"
1904                "  ONE = 1,\n"
1905                "  TWO = 2,\n"
1906                "  THREE = 3\n"
1907                "} LongEnum;",
1908                Style);
1909   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1910   Style.BraceWrapping.AfterEnum = true;
1911   verifyFormat("typedef enum {} EmptyEnum;");
1912   verifyFormat("typedef enum { A, B, C } ShortEnum;");
1913   verifyFormat("typedef enum\n"
1914                "{\n"
1915                "  ZERO = 0,\n"
1916                "  ONE = 1,\n"
1917                "  TWO = 2,\n"
1918                "  THREE = 3\n"
1919                "} LongEnum;",
1920                Style);
1921 }
1922 
1923 TEST_F(FormatTest, FormatsNSEnums) {
1924   verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
1925   verifyGoogleFormat(
1926       "typedef NS_CLOSED_ENUM(NSInteger, SomeName) { AAA, BBB }");
1927   verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
1928                      "  // Information about someDecentlyLongValue.\n"
1929                      "  someDecentlyLongValue,\n"
1930                      "  // Information about anotherDecentlyLongValue.\n"
1931                      "  anotherDecentlyLongValue,\n"
1932                      "  // Information about aThirdDecentlyLongValue.\n"
1933                      "  aThirdDecentlyLongValue\n"
1934                      "};");
1935   verifyGoogleFormat("typedef NS_CLOSED_ENUM(NSInteger, MyType) {\n"
1936                      "  // Information about someDecentlyLongValue.\n"
1937                      "  someDecentlyLongValue,\n"
1938                      "  // Information about anotherDecentlyLongValue.\n"
1939                      "  anotherDecentlyLongValue,\n"
1940                      "  // Information about aThirdDecentlyLongValue.\n"
1941                      "  aThirdDecentlyLongValue\n"
1942                      "};");
1943   verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
1944                      "  a = 1,\n"
1945                      "  b = 2,\n"
1946                      "  c = 3,\n"
1947                      "};");
1948   verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
1949                      "  a = 1,\n"
1950                      "  b = 2,\n"
1951                      "  c = 3,\n"
1952                      "};");
1953   verifyGoogleFormat("typedef CF_CLOSED_ENUM(NSInteger, MyType) {\n"
1954                      "  a = 1,\n"
1955                      "  b = 2,\n"
1956                      "  c = 3,\n"
1957                      "};");
1958   verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
1959                      "  a = 1,\n"
1960                      "  b = 2,\n"
1961                      "  c = 3,\n"
1962                      "};");
1963 }
1964 
1965 TEST_F(FormatTest, FormatsBitfields) {
1966   verifyFormat("struct Bitfields {\n"
1967                "  unsigned sClass : 8;\n"
1968                "  unsigned ValueKind : 2;\n"
1969                "};");
1970   verifyFormat("struct A {\n"
1971                "  int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
1972                "      bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
1973                "};");
1974   verifyFormat("struct MyStruct {\n"
1975                "  uchar data;\n"
1976                "  uchar : 8;\n"
1977                "  uchar : 8;\n"
1978                "  uchar other;\n"
1979                "};");
1980 }
1981 
1982 TEST_F(FormatTest, FormatsNamespaces) {
1983   FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
1984   LLVMWithNoNamespaceFix.FixNamespaceComments = false;
1985 
1986   verifyFormat("namespace some_namespace {\n"
1987                "class A {};\n"
1988                "void f() { f(); }\n"
1989                "}",
1990                LLVMWithNoNamespaceFix);
1991   verifyFormat("namespace N::inline D {\n"
1992                "class A {};\n"
1993                "void f() { f(); }\n"
1994                "}",
1995                LLVMWithNoNamespaceFix);
1996   verifyFormat("namespace N::inline D::E {\n"
1997                "class A {};\n"
1998                "void f() { f(); }\n"
1999                "}",
2000                LLVMWithNoNamespaceFix);
2001   verifyFormat("namespace [[deprecated(\"foo[bar\")]] some_namespace {\n"
2002                "class A {};\n"
2003                "void f() { f(); }\n"
2004                "}",
2005                LLVMWithNoNamespaceFix);
2006   verifyFormat("/* something */ namespace some_namespace {\n"
2007                "class A {};\n"
2008                "void f() { f(); }\n"
2009                "}",
2010                LLVMWithNoNamespaceFix);
2011   verifyFormat("namespace {\n"
2012                "class A {};\n"
2013                "void f() { f(); }\n"
2014                "}",
2015                LLVMWithNoNamespaceFix);
2016   verifyFormat("/* something */ namespace {\n"
2017                "class A {};\n"
2018                "void f() { f(); }\n"
2019                "}",
2020                LLVMWithNoNamespaceFix);
2021   verifyFormat("inline namespace X {\n"
2022                "class A {};\n"
2023                "void f() { f(); }\n"
2024                "}",
2025                LLVMWithNoNamespaceFix);
2026   verifyFormat("/* something */ inline namespace X {\n"
2027                "class A {};\n"
2028                "void f() { f(); }\n"
2029                "}",
2030                LLVMWithNoNamespaceFix);
2031   verifyFormat("export namespace X {\n"
2032                "class A {};\n"
2033                "void f() { f(); }\n"
2034                "}",
2035                LLVMWithNoNamespaceFix);
2036   verifyFormat("using namespace some_namespace;\n"
2037                "class A {};\n"
2038                "void f() { f(); }",
2039                LLVMWithNoNamespaceFix);
2040 
2041   // This code is more common than we thought; if we
2042   // layout this correctly the semicolon will go into
2043   // its own line, which is undesirable.
2044   verifyFormat("namespace {};", LLVMWithNoNamespaceFix);
2045   verifyFormat("namespace {\n"
2046                "class A {};\n"
2047                "};",
2048                LLVMWithNoNamespaceFix);
2049 
2050   verifyFormat("namespace {\n"
2051                "int SomeVariable = 0; // comment\n"
2052                "} // namespace",
2053                LLVMWithNoNamespaceFix);
2054   EXPECT_EQ("#ifndef HEADER_GUARD\n"
2055             "#define HEADER_GUARD\n"
2056             "namespace my_namespace {\n"
2057             "int i;\n"
2058             "} // my_namespace\n"
2059             "#endif // HEADER_GUARD",
2060             format("#ifndef HEADER_GUARD\n"
2061                    " #define HEADER_GUARD\n"
2062                    "   namespace my_namespace {\n"
2063                    "int i;\n"
2064                    "}    // my_namespace\n"
2065                    "#endif    // HEADER_GUARD",
2066                    LLVMWithNoNamespaceFix));
2067 
2068   EXPECT_EQ("namespace A::B {\n"
2069             "class C {};\n"
2070             "}",
2071             format("namespace A::B {\n"
2072                    "class C {};\n"
2073                    "}",
2074                    LLVMWithNoNamespaceFix));
2075 
2076   FormatStyle Style = getLLVMStyle();
2077   Style.NamespaceIndentation = FormatStyle::NI_All;
2078   EXPECT_EQ("namespace out {\n"
2079             "  int i;\n"
2080             "  namespace in {\n"
2081             "    int i;\n"
2082             "  } // namespace in\n"
2083             "} // namespace out",
2084             format("namespace out {\n"
2085                    "int i;\n"
2086                    "namespace in {\n"
2087                    "int i;\n"
2088                    "} // namespace in\n"
2089                    "} // namespace out",
2090                    Style));
2091 
2092   Style.NamespaceIndentation = FormatStyle::NI_Inner;
2093   EXPECT_EQ("namespace out {\n"
2094             "int i;\n"
2095             "namespace in {\n"
2096             "  int i;\n"
2097             "} // namespace in\n"
2098             "} // namespace out",
2099             format("namespace out {\n"
2100                    "int i;\n"
2101                    "namespace in {\n"
2102                    "int i;\n"
2103                    "} // namespace in\n"
2104                    "} // namespace out",
2105                    Style));
2106 }
2107 
2108 TEST_F(FormatTest, NamespaceMacros) {
2109   FormatStyle Style = getLLVMStyle();
2110   Style.NamespaceMacros.push_back("TESTSUITE");
2111 
2112   verifyFormat("TESTSUITE(A) {\n"
2113                "int foo();\n"
2114                "} // TESTSUITE(A)",
2115                Style);
2116 
2117   verifyFormat("TESTSUITE(A, B) {\n"
2118                "int foo();\n"
2119                "} // TESTSUITE(A)",
2120                Style);
2121 
2122   // Properly indent according to NamespaceIndentation style
2123   Style.NamespaceIndentation = FormatStyle::NI_All;
2124   verifyFormat("TESTSUITE(A) {\n"
2125                "  int foo();\n"
2126                "} // TESTSUITE(A)",
2127                Style);
2128   verifyFormat("TESTSUITE(A) {\n"
2129                "  namespace B {\n"
2130                "    int foo();\n"
2131                "  } // namespace B\n"
2132                "} // TESTSUITE(A)",
2133                Style);
2134   verifyFormat("namespace A {\n"
2135                "  TESTSUITE(B) {\n"
2136                "    int foo();\n"
2137                "  } // TESTSUITE(B)\n"
2138                "} // namespace A",
2139                Style);
2140 
2141   Style.NamespaceIndentation = FormatStyle::NI_Inner;
2142   verifyFormat("TESTSUITE(A) {\n"
2143                "TESTSUITE(B) {\n"
2144                "  int foo();\n"
2145                "} // TESTSUITE(B)\n"
2146                "} // TESTSUITE(A)",
2147                Style);
2148   verifyFormat("TESTSUITE(A) {\n"
2149                "namespace B {\n"
2150                "  int foo();\n"
2151                "} // namespace B\n"
2152                "} // TESTSUITE(A)",
2153                Style);
2154   verifyFormat("namespace A {\n"
2155                "TESTSUITE(B) {\n"
2156                "  int foo();\n"
2157                "} // TESTSUITE(B)\n"
2158                "} // namespace A",
2159                Style);
2160 
2161   // Properly merge namespace-macros blocks in CompactNamespaces mode
2162   Style.NamespaceIndentation = FormatStyle::NI_None;
2163   Style.CompactNamespaces = true;
2164   verifyFormat("TESTSUITE(A) { TESTSUITE(B) {\n"
2165                "}} // TESTSUITE(A::B)",
2166                Style);
2167 
2168   EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n"
2169             "}} // TESTSUITE(out::in)",
2170             format("TESTSUITE(out) {\n"
2171                    "TESTSUITE(in) {\n"
2172                    "} // TESTSUITE(in)\n"
2173                    "} // TESTSUITE(out)",
2174                    Style));
2175 
2176   EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n"
2177             "}} // TESTSUITE(out::in)",
2178             format("TESTSUITE(out) {\n"
2179                    "TESTSUITE(in) {\n"
2180                    "} // TESTSUITE(in)\n"
2181                    "} // TESTSUITE(out)",
2182                    Style));
2183 
2184   // Do not merge different namespaces/macros
2185   EXPECT_EQ("namespace out {\n"
2186             "TESTSUITE(in) {\n"
2187             "} // TESTSUITE(in)\n"
2188             "} // namespace out",
2189             format("namespace out {\n"
2190                    "TESTSUITE(in) {\n"
2191                    "} // TESTSUITE(in)\n"
2192                    "} // namespace out",
2193                    Style));
2194   EXPECT_EQ("TESTSUITE(out) {\n"
2195             "namespace in {\n"
2196             "} // namespace in\n"
2197             "} // TESTSUITE(out)",
2198             format("TESTSUITE(out) {\n"
2199                    "namespace in {\n"
2200                    "} // namespace in\n"
2201                    "} // TESTSUITE(out)",
2202                    Style));
2203   Style.NamespaceMacros.push_back("FOOBAR");
2204   EXPECT_EQ("TESTSUITE(out) {\n"
2205             "FOOBAR(in) {\n"
2206             "} // FOOBAR(in)\n"
2207             "} // TESTSUITE(out)",
2208             format("TESTSUITE(out) {\n"
2209                    "FOOBAR(in) {\n"
2210                    "} // FOOBAR(in)\n"
2211                    "} // TESTSUITE(out)",
2212                    Style));
2213 }
2214 
2215 TEST_F(FormatTest, FormatsCompactNamespaces) {
2216   FormatStyle Style = getLLVMStyle();
2217   Style.CompactNamespaces = true;
2218   Style.NamespaceMacros.push_back("TESTSUITE");
2219 
2220   verifyFormat("namespace A { namespace B {\n"
2221                "}} // namespace A::B",
2222                Style);
2223 
2224   EXPECT_EQ("namespace out { namespace in {\n"
2225             "}} // namespace out::in",
2226             format("namespace out {\n"
2227                    "namespace in {\n"
2228                    "} // namespace in\n"
2229                    "} // namespace out",
2230                    Style));
2231 
2232   // Only namespaces which have both consecutive opening and end get compacted
2233   EXPECT_EQ("namespace out {\n"
2234             "namespace in1 {\n"
2235             "} // namespace in1\n"
2236             "namespace in2 {\n"
2237             "} // namespace in2\n"
2238             "} // namespace out",
2239             format("namespace out {\n"
2240                    "namespace in1 {\n"
2241                    "} // namespace in1\n"
2242                    "namespace in2 {\n"
2243                    "} // namespace in2\n"
2244                    "} // namespace out",
2245                    Style));
2246 
2247   EXPECT_EQ("namespace out {\n"
2248             "int i;\n"
2249             "namespace in {\n"
2250             "int j;\n"
2251             "} // namespace in\n"
2252             "int k;\n"
2253             "} // namespace out",
2254             format("namespace out { int i;\n"
2255                    "namespace in { int j; } // namespace in\n"
2256                    "int k; } // namespace out",
2257                    Style));
2258 
2259   EXPECT_EQ("namespace A { namespace B { namespace C {\n"
2260             "}}} // namespace A::B::C\n",
2261             format("namespace A { namespace B {\n"
2262                    "namespace C {\n"
2263                    "}} // namespace B::C\n"
2264                    "} // namespace A\n",
2265                    Style));
2266 
2267   Style.ColumnLimit = 40;
2268   EXPECT_EQ("namespace aaaaaaaaaa {\n"
2269             "namespace bbbbbbbbbb {\n"
2270             "}} // namespace aaaaaaaaaa::bbbbbbbbbb",
2271             format("namespace aaaaaaaaaa {\n"
2272                    "namespace bbbbbbbbbb {\n"
2273                    "} // namespace bbbbbbbbbb\n"
2274                    "} // namespace aaaaaaaaaa",
2275                    Style));
2276 
2277   EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n"
2278             "namespace cccccc {\n"
2279             "}}} // namespace aaaaaa::bbbbbb::cccccc",
2280             format("namespace aaaaaa {\n"
2281                    "namespace bbbbbb {\n"
2282                    "namespace cccccc {\n"
2283                    "} // namespace cccccc\n"
2284                    "} // namespace bbbbbb\n"
2285                    "} // namespace aaaaaa",
2286                    Style));
2287   Style.ColumnLimit = 80;
2288 
2289   // Extra semicolon after 'inner' closing brace prevents merging
2290   EXPECT_EQ("namespace out { namespace in {\n"
2291             "}; } // namespace out::in",
2292             format("namespace out {\n"
2293                    "namespace in {\n"
2294                    "}; // namespace in\n"
2295                    "} // namespace out",
2296                    Style));
2297 
2298   // Extra semicolon after 'outer' closing brace is conserved
2299   EXPECT_EQ("namespace out { namespace in {\n"
2300             "}}; // namespace out::in",
2301             format("namespace out {\n"
2302                    "namespace in {\n"
2303                    "} // namespace in\n"
2304                    "}; // namespace out",
2305                    Style));
2306 
2307   Style.NamespaceIndentation = FormatStyle::NI_All;
2308   EXPECT_EQ("namespace out { namespace in {\n"
2309             "  int i;\n"
2310             "}} // namespace out::in",
2311             format("namespace out {\n"
2312                    "namespace in {\n"
2313                    "int i;\n"
2314                    "} // namespace in\n"
2315                    "} // namespace out",
2316                    Style));
2317   EXPECT_EQ("namespace out { namespace mid {\n"
2318             "  namespace in {\n"
2319             "    int j;\n"
2320             "  } // namespace in\n"
2321             "  int k;\n"
2322             "}} // namespace out::mid",
2323             format("namespace out { namespace mid {\n"
2324                    "namespace in { int j; } // namespace in\n"
2325                    "int k; }} // namespace out::mid",
2326                    Style));
2327 
2328   Style.NamespaceIndentation = FormatStyle::NI_Inner;
2329   EXPECT_EQ("namespace out { namespace in {\n"
2330             "  int i;\n"
2331             "}} // namespace out::in",
2332             format("namespace out {\n"
2333                    "namespace in {\n"
2334                    "int i;\n"
2335                    "} // namespace in\n"
2336                    "} // namespace out",
2337                    Style));
2338   EXPECT_EQ("namespace out { namespace mid { namespace in {\n"
2339             "  int i;\n"
2340             "}}} // namespace out::mid::in",
2341             format("namespace out {\n"
2342                    "namespace mid {\n"
2343                    "namespace in {\n"
2344                    "int i;\n"
2345                    "} // namespace in\n"
2346                    "} // namespace mid\n"
2347                    "} // namespace out",
2348                    Style));
2349 }
2350 
2351 TEST_F(FormatTest, FormatsExternC) {
2352   verifyFormat("extern \"C\" {\nint a;");
2353   verifyFormat("extern \"C\" {}");
2354   verifyFormat("extern \"C\" {\n"
2355                "int foo();\n"
2356                "}");
2357   verifyFormat("extern \"C\" int foo() {}");
2358   verifyFormat("extern \"C\" int foo();");
2359   verifyFormat("extern \"C\" int foo() {\n"
2360                "  int i = 42;\n"
2361                "  return i;\n"
2362                "}");
2363 
2364   FormatStyle Style = getLLVMStyle();
2365   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2366   Style.BraceWrapping.AfterFunction = true;
2367   verifyFormat("extern \"C\" int foo() {}", Style);
2368   verifyFormat("extern \"C\" int foo();", Style);
2369   verifyFormat("extern \"C\" int foo()\n"
2370                "{\n"
2371                "  int i = 42;\n"
2372                "  return i;\n"
2373                "}",
2374                Style);
2375 
2376   Style.BraceWrapping.AfterExternBlock = true;
2377   Style.BraceWrapping.SplitEmptyRecord = false;
2378   verifyFormat("extern \"C\"\n"
2379                "{}",
2380                Style);
2381   verifyFormat("extern \"C\"\n"
2382                "{\n"
2383                "  int foo();\n"
2384                "}",
2385                Style);
2386 }
2387 
2388 TEST_F(FormatTest, FormatsInlineASM) {
2389   verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
2390   verifyFormat("asm(\"nop\" ::: \"memory\");");
2391   verifyFormat(
2392       "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
2393       "    \"cpuid\\n\\t\"\n"
2394       "    \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
2395       "    : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
2396       "    : \"a\"(value));");
2397   EXPECT_EQ(
2398       "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
2399       "  __asm {\n"
2400       "        mov     edx,[that] // vtable in edx\n"
2401       "        mov     eax,methodIndex\n"
2402       "        call    [edx][eax*4] // stdcall\n"
2403       "  }\n"
2404       "}",
2405       format("void NS_InvokeByIndex(void *that,   unsigned int methodIndex) {\n"
2406              "    __asm {\n"
2407              "        mov     edx,[that] // vtable in edx\n"
2408              "        mov     eax,methodIndex\n"
2409              "        call    [edx][eax*4] // stdcall\n"
2410              "    }\n"
2411              "}"));
2412   EXPECT_EQ("_asm {\n"
2413             "  xor eax, eax;\n"
2414             "  cpuid;\n"
2415             "}",
2416             format("_asm {\n"
2417                    "  xor eax, eax;\n"
2418                    "  cpuid;\n"
2419                    "}"));
2420   verifyFormat("void function() {\n"
2421                "  // comment\n"
2422                "  asm(\"\");\n"
2423                "}");
2424   EXPECT_EQ("__asm {\n"
2425             "}\n"
2426             "int i;",
2427             format("__asm   {\n"
2428                    "}\n"
2429                    "int   i;"));
2430 }
2431 
2432 TEST_F(FormatTest, FormatTryCatch) {
2433   verifyFormat("try {\n"
2434                "  throw a * b;\n"
2435                "} catch (int a) {\n"
2436                "  // Do nothing.\n"
2437                "} catch (...) {\n"
2438                "  exit(42);\n"
2439                "}");
2440 
2441   // Function-level try statements.
2442   verifyFormat("int f() try { return 4; } catch (...) {\n"
2443                "  return 5;\n"
2444                "}");
2445   verifyFormat("class A {\n"
2446                "  int a;\n"
2447                "  A() try : a(0) {\n"
2448                "  } catch (...) {\n"
2449                "    throw;\n"
2450                "  }\n"
2451                "};\n");
2452 
2453   // Incomplete try-catch blocks.
2454   verifyIncompleteFormat("try {} catch (");
2455 }
2456 
2457 TEST_F(FormatTest, FormatSEHTryCatch) {
2458   verifyFormat("__try {\n"
2459                "  int a = b * c;\n"
2460                "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
2461                "  // Do nothing.\n"
2462                "}");
2463 
2464   verifyFormat("__try {\n"
2465                "  int a = b * c;\n"
2466                "} __finally {\n"
2467                "  // Do nothing.\n"
2468                "}");
2469 
2470   verifyFormat("DEBUG({\n"
2471                "  __try {\n"
2472                "  } __finally {\n"
2473                "  }\n"
2474                "});\n");
2475 }
2476 
2477 TEST_F(FormatTest, IncompleteTryCatchBlocks) {
2478   verifyFormat("try {\n"
2479                "  f();\n"
2480                "} catch {\n"
2481                "  g();\n"
2482                "}");
2483   verifyFormat("try {\n"
2484                "  f();\n"
2485                "} catch (A a) MACRO(x) {\n"
2486                "  g();\n"
2487                "} catch (B b) MACRO(x) {\n"
2488                "  g();\n"
2489                "}");
2490 }
2491 
2492 TEST_F(FormatTest, FormatTryCatchBraceStyles) {
2493   FormatStyle Style = getLLVMStyle();
2494   for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
2495                           FormatStyle::BS_WebKit}) {
2496     Style.BreakBeforeBraces = BraceStyle;
2497     verifyFormat("try {\n"
2498                  "  // something\n"
2499                  "} catch (...) {\n"
2500                  "  // something\n"
2501                  "}",
2502                  Style);
2503   }
2504   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
2505   verifyFormat("try {\n"
2506                "  // something\n"
2507                "}\n"
2508                "catch (...) {\n"
2509                "  // something\n"
2510                "}",
2511                Style);
2512   verifyFormat("__try {\n"
2513                "  // something\n"
2514                "}\n"
2515                "__finally {\n"
2516                "  // something\n"
2517                "}",
2518                Style);
2519   verifyFormat("@try {\n"
2520                "  // something\n"
2521                "}\n"
2522                "@finally {\n"
2523                "  // something\n"
2524                "}",
2525                Style);
2526   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2527   verifyFormat("try\n"
2528                "{\n"
2529                "  // something\n"
2530                "}\n"
2531                "catch (...)\n"
2532                "{\n"
2533                "  // something\n"
2534                "}",
2535                Style);
2536   Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths;
2537   verifyFormat("try\n"
2538                "  {\n"
2539                "  // something white\n"
2540                "  }\n"
2541                "catch (...)\n"
2542                "  {\n"
2543                "  // something white\n"
2544                "  }",
2545                Style);
2546   Style.BreakBeforeBraces = FormatStyle::BS_GNU;
2547   verifyFormat("try\n"
2548                "  {\n"
2549                "    // something\n"
2550                "  }\n"
2551                "catch (...)\n"
2552                "  {\n"
2553                "    // something\n"
2554                "  }",
2555                Style);
2556   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2557   Style.BraceWrapping.BeforeCatch = true;
2558   verifyFormat("try {\n"
2559                "  // something\n"
2560                "}\n"
2561                "catch (...) {\n"
2562                "  // something\n"
2563                "}",
2564                Style);
2565 }
2566 
2567 TEST_F(FormatTest, StaticInitializers) {
2568   verifyFormat("static SomeClass SC = {1, 'a'};");
2569 
2570   verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
2571                "    100000000, "
2572                "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
2573 
2574   // Here, everything other than the "}" would fit on a line.
2575   verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
2576                "    10000000000000000000000000};");
2577   EXPECT_EQ("S s = {a,\n"
2578             "\n"
2579             "       b};",
2580             format("S s = {\n"
2581                    "  a,\n"
2582                    "\n"
2583                    "  b\n"
2584                    "};"));
2585 
2586   // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
2587   // line. However, the formatting looks a bit off and this probably doesn't
2588   // happen often in practice.
2589   verifyFormat("static int Variable[1] = {\n"
2590                "    {1000000000000000000000000000000000000}};",
2591                getLLVMStyleWithColumns(40));
2592 }
2593 
2594 TEST_F(FormatTest, DesignatedInitializers) {
2595   verifyFormat("const struct A a = {.a = 1, .b = 2};");
2596   verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
2597                "                    .bbbbbbbbbb = 2,\n"
2598                "                    .cccccccccc = 3,\n"
2599                "                    .dddddddddd = 4,\n"
2600                "                    .eeeeeeeeee = 5};");
2601   verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
2602                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
2603                "    .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
2604                "    .ccccccccccccccccccccccccccc = 3,\n"
2605                "    .ddddddddddddddddddddddddddd = 4,\n"
2606                "    .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
2607 
2608   verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
2609 
2610   verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
2611   verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n"
2612                "                    [2] = bbbbbbbbbb,\n"
2613                "                    [3] = cccccccccc,\n"
2614                "                    [4] = dddddddddd,\n"
2615                "                    [5] = eeeeeeeeee};");
2616   verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
2617                "    [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2618                "    [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2619                "    [3] = cccccccccccccccccccccccccccccccccccccc,\n"
2620                "    [4] = dddddddddddddddddddddddddddddddddddddd,\n"
2621                "    [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};");
2622 }
2623 
2624 TEST_F(FormatTest, NestedStaticInitializers) {
2625   verifyFormat("static A x = {{{}}};\n");
2626   verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
2627                "               {init1, init2, init3, init4}}};",
2628                getLLVMStyleWithColumns(50));
2629 
2630   verifyFormat("somes Status::global_reps[3] = {\n"
2631                "    {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2632                "    {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2633                "    {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
2634                getLLVMStyleWithColumns(60));
2635   verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
2636                      "    {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2637                      "    {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2638                      "    {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
2639   verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
2640                "                  {rect.fRight - rect.fLeft, rect.fBottom - "
2641                "rect.fTop}};");
2642 
2643   verifyFormat(
2644       "SomeArrayOfSomeType a = {\n"
2645       "    {{1, 2, 3},\n"
2646       "     {1, 2, 3},\n"
2647       "     {111111111111111111111111111111, 222222222222222222222222222222,\n"
2648       "      333333333333333333333333333333},\n"
2649       "     {1, 2, 3},\n"
2650       "     {1, 2, 3}}};");
2651   verifyFormat(
2652       "SomeArrayOfSomeType a = {\n"
2653       "    {{1, 2, 3}},\n"
2654       "    {{1, 2, 3}},\n"
2655       "    {{111111111111111111111111111111, 222222222222222222222222222222,\n"
2656       "      333333333333333333333333333333}},\n"
2657       "    {{1, 2, 3}},\n"
2658       "    {{1, 2, 3}}};");
2659 
2660   verifyFormat("struct {\n"
2661                "  unsigned bit;\n"
2662                "  const char *const name;\n"
2663                "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
2664                "                 {kOsWin, \"Windows\"},\n"
2665                "                 {kOsLinux, \"Linux\"},\n"
2666                "                 {kOsCrOS, \"Chrome OS\"}};");
2667   verifyFormat("struct {\n"
2668                "  unsigned bit;\n"
2669                "  const char *const name;\n"
2670                "} kBitsToOs[] = {\n"
2671                "    {kOsMac, \"Mac\"},\n"
2672                "    {kOsWin, \"Windows\"},\n"
2673                "    {kOsLinux, \"Linux\"},\n"
2674                "    {kOsCrOS, \"Chrome OS\"},\n"
2675                "};");
2676 }
2677 
2678 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
2679   verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2680                "                      \\\n"
2681                "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
2682 }
2683 
2684 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
2685   verifyFormat("virtual void write(ELFWriter *writerrr,\n"
2686                "                   OwningPtr<FileOutputBuffer> &buffer) = 0;");
2687 
2688   // Do break defaulted and deleted functions.
2689   verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2690                "    default;",
2691                getLLVMStyleWithColumns(40));
2692   verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2693                "    delete;",
2694                getLLVMStyleWithColumns(40));
2695 }
2696 
2697 TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
2698   verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
2699                getLLVMStyleWithColumns(40));
2700   verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2701                getLLVMStyleWithColumns(40));
2702   EXPECT_EQ("#define Q                              \\\n"
2703             "  \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\"    \\\n"
2704             "  \"aaaaaaaa.cpp\"",
2705             format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2706                    getLLVMStyleWithColumns(40)));
2707 }
2708 
2709 TEST_F(FormatTest, UnderstandsLinePPDirective) {
2710   EXPECT_EQ("# 123 \"A string literal\"",
2711             format("   #     123    \"A string literal\""));
2712 }
2713 
2714 TEST_F(FormatTest, LayoutUnknownPPDirective) {
2715   EXPECT_EQ("#;", format("#;"));
2716   verifyFormat("#\n;\n;\n;");
2717 }
2718 
2719 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
2720   EXPECT_EQ("#line 42 \"test\"\n",
2721             format("#  \\\n  line  \\\n  42  \\\n  \"test\"\n"));
2722   EXPECT_EQ("#define A B\n", format("#  \\\n define  \\\n    A  \\\n       B\n",
2723                                     getLLVMStyleWithColumns(12)));
2724 }
2725 
2726 TEST_F(FormatTest, EndOfFileEndsPPDirective) {
2727   EXPECT_EQ("#line 42 \"test\"",
2728             format("#  \\\n  line  \\\n  42  \\\n  \"test\""));
2729   EXPECT_EQ("#define A B", format("#  \\\n define  \\\n    A  \\\n       B"));
2730 }
2731 
2732 TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
2733   verifyFormat("#define A \\x20");
2734   verifyFormat("#define A \\ x20");
2735   EXPECT_EQ("#define A \\ x20", format("#define A \\   x20"));
2736   verifyFormat("#define A ''");
2737   verifyFormat("#define A ''qqq");
2738   verifyFormat("#define A `qqq");
2739   verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
2740   EXPECT_EQ("const char *c = STRINGIFY(\n"
2741             "\\na : b);",
2742             format("const char * c = STRINGIFY(\n"
2743                    "\\na : b);"));
2744 
2745   verifyFormat("a\r\\");
2746   verifyFormat("a\v\\");
2747   verifyFormat("a\f\\");
2748 }
2749 
2750 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
2751   verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
2752   verifyFormat("#define A( \\\n    BB)", getLLVMStyleWithColumns(12));
2753   verifyFormat("#define A( \\\n    A, B)", getLLVMStyleWithColumns(12));
2754   // FIXME: We never break before the macro name.
2755   verifyFormat("#define AA( \\\n    B)", getLLVMStyleWithColumns(12));
2756 
2757   verifyFormat("#define A A\n#define A A");
2758   verifyFormat("#define A(X) A\n#define A A");
2759 
2760   verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
2761   verifyFormat("#define Something    \\\n  Other", getLLVMStyleWithColumns(22));
2762 }
2763 
2764 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
2765   EXPECT_EQ("// somecomment\n"
2766             "#include \"a.h\"\n"
2767             "#define A(  \\\n"
2768             "    A, B)\n"
2769             "#include \"b.h\"\n"
2770             "// somecomment\n",
2771             format("  // somecomment\n"
2772                    "  #include \"a.h\"\n"
2773                    "#define A(A,\\\n"
2774                    "    B)\n"
2775                    "    #include \"b.h\"\n"
2776                    " // somecomment\n",
2777                    getLLVMStyleWithColumns(13)));
2778 }
2779 
2780 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
2781 
2782 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
2783   EXPECT_EQ("#define A    \\\n"
2784             "  c;         \\\n"
2785             "  e;\n"
2786             "f;",
2787             format("#define A c; e;\n"
2788                    "f;",
2789                    getLLVMStyleWithColumns(14)));
2790 }
2791 
2792 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
2793 
2794 TEST_F(FormatTest, MacroDefinitionInsideStatement) {
2795   EXPECT_EQ("int x,\n"
2796             "#define A\n"
2797             "    y;",
2798             format("int x,\n#define A\ny;"));
2799 }
2800 
2801 TEST_F(FormatTest, HashInMacroDefinition) {
2802   EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
2803   verifyFormat("#define A \\\n  b #c;", getLLVMStyleWithColumns(11));
2804   verifyFormat("#define A  \\\n"
2805                "  {        \\\n"
2806                "    f(#c); \\\n"
2807                "  }",
2808                getLLVMStyleWithColumns(11));
2809 
2810   verifyFormat("#define A(X)         \\\n"
2811                "  void function##X()",
2812                getLLVMStyleWithColumns(22));
2813 
2814   verifyFormat("#define A(a, b, c)   \\\n"
2815                "  void a##b##c()",
2816                getLLVMStyleWithColumns(22));
2817 
2818   verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
2819 }
2820 
2821 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
2822   EXPECT_EQ("#define A (x)", format("#define A (x)"));
2823   EXPECT_EQ("#define A(x)", format("#define A(x)"));
2824 
2825   FormatStyle Style = getLLVMStyle();
2826   Style.SpaceBeforeParens = FormatStyle::SBPO_Never;
2827   verifyFormat("#define true ((foo)1)", Style);
2828   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
2829   verifyFormat("#define false((foo)0)", Style);
2830 }
2831 
2832 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
2833   EXPECT_EQ("#define A b;", format("#define A \\\n"
2834                                    "          \\\n"
2835                                    "  b;",
2836                                    getLLVMStyleWithColumns(25)));
2837   EXPECT_EQ("#define A \\\n"
2838             "          \\\n"
2839             "  a;      \\\n"
2840             "  b;",
2841             format("#define A \\\n"
2842                    "          \\\n"
2843                    "  a;      \\\n"
2844                    "  b;",
2845                    getLLVMStyleWithColumns(11)));
2846   EXPECT_EQ("#define A \\\n"
2847             "  a;      \\\n"
2848             "          \\\n"
2849             "  b;",
2850             format("#define A \\\n"
2851                    "  a;      \\\n"
2852                    "          \\\n"
2853                    "  b;",
2854                    getLLVMStyleWithColumns(11)));
2855 }
2856 
2857 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
2858   verifyIncompleteFormat("#define A :");
2859   verifyFormat("#define SOMECASES  \\\n"
2860                "  case 1:          \\\n"
2861                "  case 2\n",
2862                getLLVMStyleWithColumns(20));
2863   verifyFormat("#define MACRO(a) \\\n"
2864                "  if (a)         \\\n"
2865                "    f();         \\\n"
2866                "  else           \\\n"
2867                "    g()",
2868                getLLVMStyleWithColumns(18));
2869   verifyFormat("#define A template <typename T>");
2870   verifyIncompleteFormat("#define STR(x) #x\n"
2871                          "f(STR(this_is_a_string_literal{));");
2872   verifyFormat("#pragma omp threadprivate( \\\n"
2873                "    y)), // expected-warning",
2874                getLLVMStyleWithColumns(28));
2875   verifyFormat("#d, = };");
2876   verifyFormat("#if \"a");
2877   verifyIncompleteFormat("({\n"
2878                          "#define b     \\\n"
2879                          "  }           \\\n"
2880                          "  a\n"
2881                          "a",
2882                          getLLVMStyleWithColumns(15));
2883   verifyFormat("#define A     \\\n"
2884                "  {           \\\n"
2885                "    {\n"
2886                "#define B     \\\n"
2887                "  }           \\\n"
2888                "  }",
2889                getLLVMStyleWithColumns(15));
2890   verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
2891   verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
2892   verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
2893   verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() {      \n)}");
2894 }
2895 
2896 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
2897   verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
2898   EXPECT_EQ("class A : public QObject {\n"
2899             "  Q_OBJECT\n"
2900             "\n"
2901             "  A() {}\n"
2902             "};",
2903             format("class A  :  public QObject {\n"
2904                    "     Q_OBJECT\n"
2905                    "\n"
2906                    "  A() {\n}\n"
2907                    "}  ;"));
2908   EXPECT_EQ("MACRO\n"
2909             "/*static*/ int i;",
2910             format("MACRO\n"
2911                    " /*static*/ int   i;"));
2912   EXPECT_EQ("SOME_MACRO\n"
2913             "namespace {\n"
2914             "void f();\n"
2915             "} // namespace",
2916             format("SOME_MACRO\n"
2917                    "  namespace    {\n"
2918                    "void   f(  );\n"
2919                    "} // namespace"));
2920   // Only if the identifier contains at least 5 characters.
2921   EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
2922   EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
2923   // Only if everything is upper case.
2924   EXPECT_EQ("class A : public QObject {\n"
2925             "  Q_Object A() {}\n"
2926             "};",
2927             format("class A  :  public QObject {\n"
2928                    "     Q_Object\n"
2929                    "  A() {\n}\n"
2930                    "}  ;"));
2931 
2932   // Only if the next line can actually start an unwrapped line.
2933   EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
2934             format("SOME_WEIRD_LOG_MACRO\n"
2935                    "<< SomeThing;"));
2936 
2937   verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
2938                "(n, buffers))\n",
2939                getChromiumStyle(FormatStyle::LK_Cpp));
2940 
2941   // See PR41483
2942   EXPECT_EQ("/**/ FOO(a)\n"
2943             "FOO(b)",
2944             format("/**/ FOO(a)\n"
2945                    "FOO(b)"));
2946 }
2947 
2948 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2949   EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2950             "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2951             "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2952             "class X {};\n"
2953             "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2954             "int *createScopDetectionPass() { return 0; }",
2955             format("  INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2956                    "  INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2957                    "  INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2958                    "  class X {};\n"
2959                    "  INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2960                    "  int *createScopDetectionPass() { return 0; }"));
2961   // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2962   // braces, so that inner block is indented one level more.
2963   EXPECT_EQ("int q() {\n"
2964             "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2965             "  IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2966             "  IPC_END_MESSAGE_MAP()\n"
2967             "}",
2968             format("int q() {\n"
2969                    "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2970                    "    IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2971                    "  IPC_END_MESSAGE_MAP()\n"
2972                    "}"));
2973 
2974   // Same inside macros.
2975   EXPECT_EQ("#define LIST(L) \\\n"
2976             "  L(A)          \\\n"
2977             "  L(B)          \\\n"
2978             "  L(C)",
2979             format("#define LIST(L) \\\n"
2980                    "  L(A) \\\n"
2981                    "  L(B) \\\n"
2982                    "  L(C)",
2983                    getGoogleStyle()));
2984 
2985   // These must not be recognized as macros.
2986   EXPECT_EQ("int q() {\n"
2987             "  f(x);\n"
2988             "  f(x) {}\n"
2989             "  f(x)->g();\n"
2990             "  f(x)->*g();\n"
2991             "  f(x).g();\n"
2992             "  f(x) = x;\n"
2993             "  f(x) += x;\n"
2994             "  f(x) -= x;\n"
2995             "  f(x) *= x;\n"
2996             "  f(x) /= x;\n"
2997             "  f(x) %= x;\n"
2998             "  f(x) &= x;\n"
2999             "  f(x) |= x;\n"
3000             "  f(x) ^= x;\n"
3001             "  f(x) >>= x;\n"
3002             "  f(x) <<= x;\n"
3003             "  f(x)[y].z();\n"
3004             "  LOG(INFO) << x;\n"
3005             "  ifstream(x) >> x;\n"
3006             "}\n",
3007             format("int q() {\n"
3008                    "  f(x)\n;\n"
3009                    "  f(x)\n {}\n"
3010                    "  f(x)\n->g();\n"
3011                    "  f(x)\n->*g();\n"
3012                    "  f(x)\n.g();\n"
3013                    "  f(x)\n = x;\n"
3014                    "  f(x)\n += x;\n"
3015                    "  f(x)\n -= x;\n"
3016                    "  f(x)\n *= x;\n"
3017                    "  f(x)\n /= x;\n"
3018                    "  f(x)\n %= x;\n"
3019                    "  f(x)\n &= x;\n"
3020                    "  f(x)\n |= x;\n"
3021                    "  f(x)\n ^= x;\n"
3022                    "  f(x)\n >>= x;\n"
3023                    "  f(x)\n <<= x;\n"
3024                    "  f(x)\n[y].z();\n"
3025                    "  LOG(INFO)\n << x;\n"
3026                    "  ifstream(x)\n >> x;\n"
3027                    "}\n"));
3028   EXPECT_EQ("int q() {\n"
3029             "  F(x)\n"
3030             "  if (1) {\n"
3031             "  }\n"
3032             "  F(x)\n"
3033             "  while (1) {\n"
3034             "  }\n"
3035             "  F(x)\n"
3036             "  G(x);\n"
3037             "  F(x)\n"
3038             "  try {\n"
3039             "    Q();\n"
3040             "  } catch (...) {\n"
3041             "  }\n"
3042             "}\n",
3043             format("int q() {\n"
3044                    "F(x)\n"
3045                    "if (1) {}\n"
3046                    "F(x)\n"
3047                    "while (1) {}\n"
3048                    "F(x)\n"
3049                    "G(x);\n"
3050                    "F(x)\n"
3051                    "try { Q(); } catch (...) {}\n"
3052                    "}\n"));
3053   EXPECT_EQ("class A {\n"
3054             "  A() : t(0) {}\n"
3055             "  A(int i) noexcept() : {}\n"
3056             "  A(X x)\n" // FIXME: function-level try blocks are broken.
3057             "  try : t(0) {\n"
3058             "  } catch (...) {\n"
3059             "  }\n"
3060             "};",
3061             format("class A {\n"
3062                    "  A()\n : t(0) {}\n"
3063                    "  A(int i)\n noexcept() : {}\n"
3064                    "  A(X x)\n"
3065                    "  try : t(0) {} catch (...) {}\n"
3066                    "};"));
3067   FormatStyle Style = getLLVMStyle();
3068   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
3069   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always;
3070   Style.BraceWrapping.AfterFunction = true;
3071   EXPECT_EQ("void f()\n"
3072             "try\n"
3073             "{\n"
3074             "}",
3075             format("void f() try {\n"
3076                    "}",
3077                    Style));
3078   EXPECT_EQ("class SomeClass {\n"
3079             "public:\n"
3080             "  SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3081             "};",
3082             format("class SomeClass {\n"
3083                    "public:\n"
3084                    "  SomeClass()\n"
3085                    "  EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3086                    "};"));
3087   EXPECT_EQ("class SomeClass {\n"
3088             "public:\n"
3089             "  SomeClass()\n"
3090             "      EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3091             "};",
3092             format("class SomeClass {\n"
3093                    "public:\n"
3094                    "  SomeClass()\n"
3095                    "  EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3096                    "};",
3097                    getLLVMStyleWithColumns(40)));
3098 
3099   verifyFormat("MACRO(>)");
3100 
3101   // Some macros contain an implicit semicolon.
3102   Style = getLLVMStyle();
3103   Style.StatementMacros.push_back("FOO");
3104   verifyFormat("FOO(a) int b = 0;");
3105   verifyFormat("FOO(a)\n"
3106                "int b = 0;",
3107                Style);
3108   verifyFormat("FOO(a);\n"
3109                "int b = 0;",
3110                Style);
3111   verifyFormat("FOO(argc, argv, \"4.0.2\")\n"
3112                "int b = 0;",
3113                Style);
3114   verifyFormat("FOO()\n"
3115                "int b = 0;",
3116                Style);
3117   verifyFormat("FOO\n"
3118                "int b = 0;",
3119                Style);
3120   verifyFormat("void f() {\n"
3121                "  FOO(a)\n"
3122                "  return a;\n"
3123                "}",
3124                Style);
3125   verifyFormat("FOO(a)\n"
3126                "FOO(b)",
3127                Style);
3128   verifyFormat("int a = 0;\n"
3129                "FOO(b)\n"
3130                "int c = 0;",
3131                Style);
3132   verifyFormat("int a = 0;\n"
3133                "int x = FOO(a)\n"
3134                "int b = 0;",
3135                Style);
3136   verifyFormat("void foo(int a) { FOO(a) }\n"
3137                "uint32_t bar() {}",
3138                Style);
3139 }
3140 
3141 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
3142   verifyFormat("#define A \\\n"
3143                "  f({     \\\n"
3144                "    g();  \\\n"
3145                "  });",
3146                getLLVMStyleWithColumns(11));
3147 }
3148 
3149 TEST_F(FormatTest, IndentPreprocessorDirectives) {
3150   FormatStyle Style = getLLVMStyle();
3151   Style.IndentPPDirectives = FormatStyle::PPDIS_None;
3152   Style.ColumnLimit = 40;
3153   verifyFormat("#ifdef _WIN32\n"
3154                "#define A 0\n"
3155                "#ifdef VAR2\n"
3156                "#define B 1\n"
3157                "#include <someheader.h>\n"
3158                "#define MACRO                          \\\n"
3159                "  some_very_long_func_aaaaaaaaaa();\n"
3160                "#endif\n"
3161                "#else\n"
3162                "#define A 1\n"
3163                "#endif",
3164                Style);
3165   Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash;
3166   verifyFormat("#ifdef _WIN32\n"
3167                "#  define A 0\n"
3168                "#  ifdef VAR2\n"
3169                "#    define B 1\n"
3170                "#    include <someheader.h>\n"
3171                "#    define MACRO                      \\\n"
3172                "      some_very_long_func_aaaaaaaaaa();\n"
3173                "#  endif\n"
3174                "#else\n"
3175                "#  define A 1\n"
3176                "#endif",
3177                Style);
3178   verifyFormat("#if A\n"
3179                "#  define MACRO                        \\\n"
3180                "    void a(int x) {                    \\\n"
3181                "      b();                             \\\n"
3182                "      c();                             \\\n"
3183                "      d();                             \\\n"
3184                "      e();                             \\\n"
3185                "      f();                             \\\n"
3186                "    }\n"
3187                "#endif",
3188                Style);
3189   // Comments before include guard.
3190   verifyFormat("// file comment\n"
3191                "// file comment\n"
3192                "#ifndef HEADER_H\n"
3193                "#define HEADER_H\n"
3194                "code();\n"
3195                "#endif",
3196                Style);
3197   // Test with include guards.
3198   verifyFormat("#ifndef HEADER_H\n"
3199                "#define HEADER_H\n"
3200                "code();\n"
3201                "#endif",
3202                Style);
3203   // Include guards must have a #define with the same variable immediately
3204   // after #ifndef.
3205   verifyFormat("#ifndef NOT_GUARD\n"
3206                "#  define FOO\n"
3207                "code();\n"
3208                "#endif",
3209                Style);
3210 
3211   // Include guards must cover the entire file.
3212   verifyFormat("code();\n"
3213                "code();\n"
3214                "#ifndef NOT_GUARD\n"
3215                "#  define NOT_GUARD\n"
3216                "code();\n"
3217                "#endif",
3218                Style);
3219   verifyFormat("#ifndef NOT_GUARD\n"
3220                "#  define NOT_GUARD\n"
3221                "code();\n"
3222                "#endif\n"
3223                "code();",
3224                Style);
3225   // Test with trailing blank lines.
3226   verifyFormat("#ifndef HEADER_H\n"
3227                "#define HEADER_H\n"
3228                "code();\n"
3229                "#endif\n",
3230                Style);
3231   // Include guards don't have #else.
3232   verifyFormat("#ifndef NOT_GUARD\n"
3233                "#  define NOT_GUARD\n"
3234                "code();\n"
3235                "#else\n"
3236                "#endif",
3237                Style);
3238   verifyFormat("#ifndef NOT_GUARD\n"
3239                "#  define NOT_GUARD\n"
3240                "code();\n"
3241                "#elif FOO\n"
3242                "#endif",
3243                Style);
3244   // Non-identifier #define after potential include guard.
3245   verifyFormat("#ifndef FOO\n"
3246                "#  define 1\n"
3247                "#endif\n",
3248                Style);
3249   // #if closes past last non-preprocessor line.
3250   verifyFormat("#ifndef FOO\n"
3251                "#define FOO\n"
3252                "#if 1\n"
3253                "int i;\n"
3254                "#  define A 0\n"
3255                "#endif\n"
3256                "#endif\n",
3257                Style);
3258   // Don't crash if there is an #elif directive without a condition.
3259   verifyFormat("#if 1\n"
3260                "int x;\n"
3261                "#elif\n"
3262                "int y;\n"
3263                "#else\n"
3264                "int z;\n"
3265                "#endif",
3266                Style);
3267   // FIXME: This doesn't handle the case where there's code between the
3268   // #ifndef and #define but all other conditions hold. This is because when
3269   // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the
3270   // previous code line yet, so we can't detect it.
3271   EXPECT_EQ("#ifndef NOT_GUARD\n"
3272             "code();\n"
3273             "#define NOT_GUARD\n"
3274             "code();\n"
3275             "#endif",
3276             format("#ifndef NOT_GUARD\n"
3277                    "code();\n"
3278                    "#  define NOT_GUARD\n"
3279                    "code();\n"
3280                    "#endif",
3281                    Style));
3282   // FIXME: This doesn't handle cases where legitimate preprocessor lines may
3283   // be outside an include guard. Examples are #pragma once and
3284   // #pragma GCC diagnostic, or anything else that does not change the meaning
3285   // of the file if it's included multiple times.
3286   EXPECT_EQ("#ifdef WIN32\n"
3287             "#  pragma once\n"
3288             "#endif\n"
3289             "#ifndef HEADER_H\n"
3290             "#  define HEADER_H\n"
3291             "code();\n"
3292             "#endif",
3293             format("#ifdef WIN32\n"
3294                    "#  pragma once\n"
3295                    "#endif\n"
3296                    "#ifndef HEADER_H\n"
3297                    "#define HEADER_H\n"
3298                    "code();\n"
3299                    "#endif",
3300                    Style));
3301   // FIXME: This does not detect when there is a single non-preprocessor line
3302   // in front of an include-guard-like structure where other conditions hold
3303   // because ScopedLineState hides the line.
3304   EXPECT_EQ("code();\n"
3305             "#ifndef HEADER_H\n"
3306             "#define HEADER_H\n"
3307             "code();\n"
3308             "#endif",
3309             format("code();\n"
3310                    "#ifndef HEADER_H\n"
3311                    "#  define HEADER_H\n"
3312                    "code();\n"
3313                    "#endif",
3314                    Style));
3315   // Keep comments aligned with #, otherwise indent comments normally. These
3316   // tests cannot use verifyFormat because messUp manipulates leading
3317   // whitespace.
3318   {
3319     const char *Expected = ""
3320                            "void f() {\n"
3321                            "#if 1\n"
3322                            "// Preprocessor aligned.\n"
3323                            "#  define A 0\n"
3324                            "  // Code. Separated by blank line.\n"
3325                            "\n"
3326                            "#  define B 0\n"
3327                            "  // Code. Not aligned with #\n"
3328                            "#  define C 0\n"
3329                            "#endif";
3330     const char *ToFormat = ""
3331                            "void f() {\n"
3332                            "#if 1\n"
3333                            "// Preprocessor aligned.\n"
3334                            "#  define A 0\n"
3335                            "// Code. Separated by blank line.\n"
3336                            "\n"
3337                            "#  define B 0\n"
3338                            "   // Code. Not aligned with #\n"
3339                            "#  define C 0\n"
3340                            "#endif";
3341     EXPECT_EQ(Expected, format(ToFormat, Style));
3342     EXPECT_EQ(Expected, format(Expected, Style));
3343   }
3344   // Keep block quotes aligned.
3345   {
3346     const char *Expected = ""
3347                            "void f() {\n"
3348                            "#if 1\n"
3349                            "/* Preprocessor aligned. */\n"
3350                            "#  define A 0\n"
3351                            "  /* Code. Separated by blank line. */\n"
3352                            "\n"
3353                            "#  define B 0\n"
3354                            "  /* Code. Not aligned with # */\n"
3355                            "#  define C 0\n"
3356                            "#endif";
3357     const char *ToFormat = ""
3358                            "void f() {\n"
3359                            "#if 1\n"
3360                            "/* Preprocessor aligned. */\n"
3361                            "#  define A 0\n"
3362                            "/* Code. Separated by blank line. */\n"
3363                            "\n"
3364                            "#  define B 0\n"
3365                            "   /* Code. Not aligned with # */\n"
3366                            "#  define C 0\n"
3367                            "#endif";
3368     EXPECT_EQ(Expected, format(ToFormat, Style));
3369     EXPECT_EQ(Expected, format(Expected, Style));
3370   }
3371   // Keep comments aligned with un-indented directives.
3372   {
3373     const char *Expected = ""
3374                            "void f() {\n"
3375                            "// Preprocessor aligned.\n"
3376                            "#define A 0\n"
3377                            "  // Code. Separated by blank line.\n"
3378                            "\n"
3379                            "#define B 0\n"
3380                            "  // Code. Not aligned with #\n"
3381                            "#define C 0\n";
3382     const char *ToFormat = ""
3383                            "void f() {\n"
3384                            "// Preprocessor aligned.\n"
3385                            "#define A 0\n"
3386                            "// Code. Separated by blank line.\n"
3387                            "\n"
3388                            "#define B 0\n"
3389                            "   // Code. Not aligned with #\n"
3390                            "#define C 0\n";
3391     EXPECT_EQ(Expected, format(ToFormat, Style));
3392     EXPECT_EQ(Expected, format(Expected, Style));
3393   }
3394   // Test AfterHash with tabs.
3395   {
3396     FormatStyle Tabbed = Style;
3397     Tabbed.UseTab = FormatStyle::UT_Always;
3398     Tabbed.IndentWidth = 8;
3399     Tabbed.TabWidth = 8;
3400     verifyFormat("#ifdef _WIN32\n"
3401                  "#\tdefine A 0\n"
3402                  "#\tifdef VAR2\n"
3403                  "#\t\tdefine B 1\n"
3404                  "#\t\tinclude <someheader.h>\n"
3405                  "#\t\tdefine MACRO          \\\n"
3406                  "\t\t\tsome_very_long_func_aaaaaaaaaa();\n"
3407                  "#\tendif\n"
3408                  "#else\n"
3409                  "#\tdefine A 1\n"
3410                  "#endif",
3411                  Tabbed);
3412   }
3413 
3414   // Regression test: Multiline-macro inside include guards.
3415   verifyFormat("#ifndef HEADER_H\n"
3416                "#define HEADER_H\n"
3417                "#define A()        \\\n"
3418                "  int i;           \\\n"
3419                "  int j;\n"
3420                "#endif // HEADER_H",
3421                getLLVMStyleWithColumns(20));
3422 
3423   Style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash;
3424   // Basic before hash indent tests
3425   verifyFormat("#ifdef _WIN32\n"
3426                "  #define A 0\n"
3427                "  #ifdef VAR2\n"
3428                "    #define B 1\n"
3429                "    #include <someheader.h>\n"
3430                "    #define MACRO                      \\\n"
3431                "      some_very_long_func_aaaaaaaaaa();\n"
3432                "  #endif\n"
3433                "#else\n"
3434                "  #define A 1\n"
3435                "#endif",
3436                Style);
3437   verifyFormat("#if A\n"
3438                "  #define MACRO                        \\\n"
3439                "    void a(int x) {                    \\\n"
3440                "      b();                             \\\n"
3441                "      c();                             \\\n"
3442                "      d();                             \\\n"
3443                "      e();                             \\\n"
3444                "      f();                             \\\n"
3445                "    }\n"
3446                "#endif",
3447                Style);
3448   // Keep comments aligned with indented directives. These
3449   // tests cannot use verifyFormat because messUp manipulates leading
3450   // whitespace.
3451   {
3452     const char *Expected = "void f() {\n"
3453                            "// Aligned to preprocessor.\n"
3454                            "#if 1\n"
3455                            "  // Aligned to code.\n"
3456                            "  int a;\n"
3457                            "  #if 1\n"
3458                            "    // Aligned to preprocessor.\n"
3459                            "    #define A 0\n"
3460                            "  // Aligned to code.\n"
3461                            "  int b;\n"
3462                            "  #endif\n"
3463                            "#endif\n"
3464                            "}";
3465     const char *ToFormat = "void f() {\n"
3466                            "// Aligned to preprocessor.\n"
3467                            "#if 1\n"
3468                            "// Aligned to code.\n"
3469                            "int a;\n"
3470                            "#if 1\n"
3471                            "// Aligned to preprocessor.\n"
3472                            "#define A 0\n"
3473                            "// Aligned to code.\n"
3474                            "int b;\n"
3475                            "#endif\n"
3476                            "#endif\n"
3477                            "}";
3478     EXPECT_EQ(Expected, format(ToFormat, Style));
3479     EXPECT_EQ(Expected, format(Expected, Style));
3480   }
3481   {
3482     const char *Expected = "void f() {\n"
3483                            "/* Aligned to preprocessor. */\n"
3484                            "#if 1\n"
3485                            "  /* Aligned to code. */\n"
3486                            "  int a;\n"
3487                            "  #if 1\n"
3488                            "    /* Aligned to preprocessor. */\n"
3489                            "    #define A 0\n"
3490                            "  /* Aligned to code. */\n"
3491                            "  int b;\n"
3492                            "  #endif\n"
3493                            "#endif\n"
3494                            "}";
3495     const char *ToFormat = "void f() {\n"
3496                            "/* Aligned to preprocessor. */\n"
3497                            "#if 1\n"
3498                            "/* Aligned to code. */\n"
3499                            "int a;\n"
3500                            "#if 1\n"
3501                            "/* Aligned to preprocessor. */\n"
3502                            "#define A 0\n"
3503                            "/* Aligned to code. */\n"
3504                            "int b;\n"
3505                            "#endif\n"
3506                            "#endif\n"
3507                            "}";
3508     EXPECT_EQ(Expected, format(ToFormat, Style));
3509     EXPECT_EQ(Expected, format(Expected, Style));
3510   }
3511 
3512   // Test single comment before preprocessor
3513   verifyFormat("// Comment\n"
3514                "\n"
3515                "#if 1\n"
3516                "#endif",
3517                Style);
3518 }
3519 
3520 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
3521   verifyFormat("{\n  { a #c; }\n}");
3522 }
3523 
3524 TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
3525   EXPECT_EQ("#define A \\\n  {       \\\n    {\nint i;",
3526             format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
3527   EXPECT_EQ("#define A \\\n  }       \\\n  }\nint i;",
3528             format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
3529 }
3530 
3531 TEST_F(FormatTest, EscapedNewlines) {
3532   FormatStyle Narrow = getLLVMStyleWithColumns(11);
3533   EXPECT_EQ("#define A \\\n  int i;  \\\n  int j;",
3534             format("#define A \\\nint i;\\\n  int j;", Narrow));
3535   EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
3536   EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
3537   EXPECT_EQ("/* \\  \\  \\\n */", format("\\\n/* \\  \\  \\\n */"));
3538   EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
3539 
3540   FormatStyle AlignLeft = getLLVMStyle();
3541   AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
3542   EXPECT_EQ("#define MACRO(x) \\\n"
3543             "private:         \\\n"
3544             "  int x(int a);\n",
3545             format("#define MACRO(x) \\\n"
3546                    "private:         \\\n"
3547                    "  int x(int a);\n",
3548                    AlignLeft));
3549 
3550   // CRLF line endings
3551   EXPECT_EQ("#define A \\\r\n  int i;  \\\r\n  int j;",
3552             format("#define A \\\r\nint i;\\\r\n  int j;", Narrow));
3553   EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;"));
3554   EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
3555   EXPECT_EQ("/* \\  \\  \\\r\n */", format("\\\r\n/* \\  \\  \\\r\n */"));
3556   EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>"));
3557   EXPECT_EQ("#define MACRO(x) \\\r\n"
3558             "private:         \\\r\n"
3559             "  int x(int a);\r\n",
3560             format("#define MACRO(x) \\\r\n"
3561                    "private:         \\\r\n"
3562                    "  int x(int a);\r\n",
3563                    AlignLeft));
3564 
3565   FormatStyle DontAlign = getLLVMStyle();
3566   DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
3567   DontAlign.MaxEmptyLinesToKeep = 3;
3568   // FIXME: can't use verifyFormat here because the newline before
3569   // "public:" is not inserted the first time it's reformatted
3570   EXPECT_EQ("#define A \\\n"
3571             "  class Foo { \\\n"
3572             "    void bar(); \\\n"
3573             "\\\n"
3574             "\\\n"
3575             "\\\n"
3576             "  public: \\\n"
3577             "    void baz(); \\\n"
3578             "  };",
3579             format("#define A \\\n"
3580                    "  class Foo { \\\n"
3581                    "    void bar(); \\\n"
3582                    "\\\n"
3583                    "\\\n"
3584                    "\\\n"
3585                    "  public: \\\n"
3586                    "    void baz(); \\\n"
3587                    "  };",
3588                    DontAlign));
3589 }
3590 
3591 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
3592   verifyFormat("#define A \\\n"
3593                "  int v(  \\\n"
3594                "      a); \\\n"
3595                "  int i;",
3596                getLLVMStyleWithColumns(11));
3597 }
3598 
3599 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
3600   EXPECT_EQ(
3601       "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3602       "                      \\\n"
3603       "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3604       "\n"
3605       "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3606       "    aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
3607       format("  #define   ALooooooooooooooooooooooooooooooooooooooongMacro("
3608              "\\\n"
3609              "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3610              "  \n"
3611              "   AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3612              "  aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
3613 }
3614 
3615 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
3616   EXPECT_EQ("int\n"
3617             "#define A\n"
3618             "    a;",
3619             format("int\n#define A\na;"));
3620   verifyFormat("functionCallTo(\n"
3621                "    someOtherFunction(\n"
3622                "        withSomeParameters, whichInSequence,\n"
3623                "        areLongerThanALine(andAnotherCall,\n"
3624                "#define A B\n"
3625                "                           withMoreParamters,\n"
3626                "                           whichStronglyInfluenceTheLayout),\n"
3627                "        andMoreParameters),\n"
3628                "    trailing);",
3629                getLLVMStyleWithColumns(69));
3630   verifyFormat("Foo::Foo()\n"
3631                "#ifdef BAR\n"
3632                "    : baz(0)\n"
3633                "#endif\n"
3634                "{\n"
3635                "}");
3636   verifyFormat("void f() {\n"
3637                "  if (true)\n"
3638                "#ifdef A\n"
3639                "    f(42);\n"
3640                "  x();\n"
3641                "#else\n"
3642                "    g();\n"
3643                "  x();\n"
3644                "#endif\n"
3645                "}");
3646   verifyFormat("void f(param1, param2,\n"
3647                "       param3,\n"
3648                "#ifdef A\n"
3649                "       param4(param5,\n"
3650                "#ifdef A1\n"
3651                "              param6,\n"
3652                "#ifdef A2\n"
3653                "              param7),\n"
3654                "#else\n"
3655                "              param8),\n"
3656                "       param9,\n"
3657                "#endif\n"
3658                "       param10,\n"
3659                "#endif\n"
3660                "       param11)\n"
3661                "#else\n"
3662                "       param12)\n"
3663                "#endif\n"
3664                "{\n"
3665                "  x();\n"
3666                "}",
3667                getLLVMStyleWithColumns(28));
3668   verifyFormat("#if 1\n"
3669                "int i;");
3670   verifyFormat("#if 1\n"
3671                "#endif\n"
3672                "#if 1\n"
3673                "#else\n"
3674                "#endif\n");
3675   verifyFormat("DEBUG({\n"
3676                "  return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3677                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
3678                "});\n"
3679                "#if a\n"
3680                "#else\n"
3681                "#endif");
3682 
3683   verifyIncompleteFormat("void f(\n"
3684                          "#if A\n"
3685                          ");\n"
3686                          "#else\n"
3687                          "#endif");
3688 }
3689 
3690 TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
3691   verifyFormat("#endif\n"
3692                "#if B");
3693 }
3694 
3695 TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
3696   FormatStyle SingleLine = getLLVMStyle();
3697   SingleLine.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse;
3698   verifyFormat("#if 0\n"
3699                "#elif 1\n"
3700                "#endif\n"
3701                "void foo() {\n"
3702                "  if (test) foo2();\n"
3703                "}",
3704                SingleLine);
3705 }
3706 
3707 TEST_F(FormatTest, LayoutBlockInsideParens) {
3708   verifyFormat("functionCall({ int i; });");
3709   verifyFormat("functionCall({\n"
3710                "  int i;\n"
3711                "  int j;\n"
3712                "});");
3713   verifyFormat("functionCall(\n"
3714                "    {\n"
3715                "      int i;\n"
3716                "      int j;\n"
3717                "    },\n"
3718                "    aaaa, bbbb, cccc);");
3719   verifyFormat("functionA(functionB({\n"
3720                "            int i;\n"
3721                "            int j;\n"
3722                "          }),\n"
3723                "          aaaa, bbbb, cccc);");
3724   verifyFormat("functionCall(\n"
3725                "    {\n"
3726                "      int i;\n"
3727                "      int j;\n"
3728                "    },\n"
3729                "    aaaa, bbbb, // comment\n"
3730                "    cccc);");
3731   verifyFormat("functionA(functionB({\n"
3732                "            int i;\n"
3733                "            int j;\n"
3734                "          }),\n"
3735                "          aaaa, bbbb, // comment\n"
3736                "          cccc);");
3737   verifyFormat("functionCall(aaaa, bbbb, { int i; });");
3738   verifyFormat("functionCall(aaaa, bbbb, {\n"
3739                "  int i;\n"
3740                "  int j;\n"
3741                "});");
3742   verifyFormat(
3743       "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
3744       "    {\n"
3745       "      int i; // break\n"
3746       "    },\n"
3747       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
3748       "                                     ccccccccccccccccc));");
3749   verifyFormat("DEBUG({\n"
3750                "  if (a)\n"
3751                "    f();\n"
3752                "});");
3753 }
3754 
3755 TEST_F(FormatTest, LayoutBlockInsideStatement) {
3756   EXPECT_EQ("SOME_MACRO { int i; }\n"
3757             "int i;",
3758             format("  SOME_MACRO  {int i;}  int i;"));
3759 }
3760 
3761 TEST_F(FormatTest, LayoutNestedBlocks) {
3762   verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
3763                "  struct s {\n"
3764                "    int i;\n"
3765                "  };\n"
3766                "  s kBitsToOs[] = {{10}};\n"
3767                "  for (int i = 0; i < 10; ++i)\n"
3768                "    return;\n"
3769                "}");
3770   verifyFormat("call(parameter, {\n"
3771                "  something();\n"
3772                "  // Comment using all columns.\n"
3773                "  somethingelse();\n"
3774                "});",
3775                getLLVMStyleWithColumns(40));
3776   verifyFormat("DEBUG( //\n"
3777                "    { f(); }, a);");
3778   verifyFormat("DEBUG( //\n"
3779                "    {\n"
3780                "      f(); //\n"
3781                "    },\n"
3782                "    a);");
3783 
3784   EXPECT_EQ("call(parameter, {\n"
3785             "  something();\n"
3786             "  // Comment too\n"
3787             "  // looooooooooong.\n"
3788             "  somethingElse();\n"
3789             "});",
3790             format("call(parameter, {\n"
3791                    "  something();\n"
3792                    "  // Comment too looooooooooong.\n"
3793                    "  somethingElse();\n"
3794                    "});",
3795                    getLLVMStyleWithColumns(29)));
3796   EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int   i; });"));
3797   EXPECT_EQ("DEBUG({ // comment\n"
3798             "  int i;\n"
3799             "});",
3800             format("DEBUG({ // comment\n"
3801                    "int  i;\n"
3802                    "});"));
3803   EXPECT_EQ("DEBUG({\n"
3804             "  int i;\n"
3805             "\n"
3806             "  // comment\n"
3807             "  int j;\n"
3808             "});",
3809             format("DEBUG({\n"
3810                    "  int  i;\n"
3811                    "\n"
3812                    "  // comment\n"
3813                    "  int  j;\n"
3814                    "});"));
3815 
3816   verifyFormat("DEBUG({\n"
3817                "  if (a)\n"
3818                "    return;\n"
3819                "});");
3820   verifyGoogleFormat("DEBUG({\n"
3821                      "  if (a) return;\n"
3822                      "});");
3823   FormatStyle Style = getGoogleStyle();
3824   Style.ColumnLimit = 45;
3825   verifyFormat("Debug(\n"
3826                "    aaaaa,\n"
3827                "    {\n"
3828                "      if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3829                "    },\n"
3830                "    a);",
3831                Style);
3832 
3833   verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3834 
3835   verifyNoCrash("^{v^{a}}");
3836 }
3837 
3838 TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3839   EXPECT_EQ("#define MACRO()                     \\\n"
3840             "  Debug(aaa, /* force line break */ \\\n"
3841             "        {                           \\\n"
3842             "          int i;                    \\\n"
3843             "          int j;                    \\\n"
3844             "        })",
3845             format("#define   MACRO()   Debug(aaa,  /* force line break */ \\\n"
3846                    "          {  int   i;  int  j;   })",
3847                    getGoogleStyle()));
3848 
3849   EXPECT_EQ("#define A                                       \\\n"
3850             "  [] {                                          \\\n"
3851             "    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(        \\\n"
3852             "        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3853             "  }",
3854             format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3855                    "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3856                    getGoogleStyle()));
3857 }
3858 
3859 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3860   EXPECT_EQ("{}", format("{}"));
3861   verifyFormat("enum E {};");
3862   verifyFormat("enum E {}");
3863   FormatStyle Style = getLLVMStyle();
3864   Style.SpaceInEmptyBlock = true;
3865   EXPECT_EQ("void f() { }", format("void f() {}", Style));
3866   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty;
3867   EXPECT_EQ("while (true) { }", format("while (true) {}", Style));
3868 }
3869 
3870 TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3871   FormatStyle Style = getLLVMStyle();
3872   Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3873   Style.MacroBlockEnd = "^[A-Z_]+_END$";
3874   verifyFormat("FOO_BEGIN\n"
3875                "  FOO_ENTRY\n"
3876                "FOO_END",
3877                Style);
3878   verifyFormat("FOO_BEGIN\n"
3879                "  NESTED_FOO_BEGIN\n"
3880                "    NESTED_FOO_ENTRY\n"
3881                "  NESTED_FOO_END\n"
3882                "FOO_END",
3883                Style);
3884   verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3885                "  int x;\n"
3886                "  x = 1;\n"
3887                "FOO_END(Baz)",
3888                Style);
3889 }
3890 
3891 //===----------------------------------------------------------------------===//
3892 // Line break tests.
3893 //===----------------------------------------------------------------------===//
3894 
3895 TEST_F(FormatTest, PreventConfusingIndents) {
3896   verifyFormat(
3897       "void f() {\n"
3898       "  SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3899       "                         parameter, parameter, parameter)),\n"
3900       "                     SecondLongCall(parameter));\n"
3901       "}");
3902   verifyFormat(
3903       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3904       "    aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3905       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3906       "    aaaaaaaaaaaaaaaaaaaaaaaa);");
3907   verifyFormat(
3908       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3909       "    [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3910       "         [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3911       "         [aaaaaaaaaaaaaaaaaaaaaaaa]];");
3912   verifyFormat(
3913       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3914       "    aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3915       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3916       "    aaaaaaaaaaaaaaaaaaaaaaaa>;");
3917   verifyFormat("int a = bbbb && ccc &&\n"
3918                "        fffff(\n"
3919                "#define A Just forcing a new line\n"
3920                "            ddd);");
3921 }
3922 
3923 TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3924   verifyFormat(
3925       "bool aaaaaaa =\n"
3926       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3927       "    bbbbbbbb();");
3928   verifyFormat(
3929       "bool aaaaaaa =\n"
3930       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3931       "    bbbbbbbb();");
3932 
3933   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3934                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3935                "    ccccccccc == ddddddddddd;");
3936   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3937                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3938                "    ccccccccc == ddddddddddd;");
3939   verifyFormat(
3940       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3941       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3942       "    ccccccccc == ddddddddddd;");
3943 
3944   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3945                "                 aaaaaa) &&\n"
3946                "         bbbbbb && cccccc;");
3947   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3948                "                 aaaaaa) >>\n"
3949                "         bbbbbb;");
3950   verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
3951                "    SourceMgr.getSpellingColumnNumber(\n"
3952                "        TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3953                "    1);");
3954 
3955   verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3956                "     bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3957                "    cccccc) {\n}");
3958   verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3959                "               bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
3960                "              cccccc) {\n}");
3961   verifyFormat("if CONSTEXPR ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3962                "               bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
3963                "              cccccc) {\n}");
3964   verifyFormat("b = a &&\n"
3965                "    // Comment\n"
3966                "    b.c && d;");
3967 
3968   // If the LHS of a comparison is not a binary expression itself, the
3969   // additional linebreak confuses many people.
3970   verifyFormat(
3971       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3972       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3973       "}");
3974   verifyFormat(
3975       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3976       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3977       "}");
3978   verifyFormat(
3979       "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3980       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3981       "}");
3982   verifyFormat(
3983       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3984       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n"
3985       "}");
3986   // Even explicit parentheses stress the precedence enough to make the
3987   // additional break unnecessary.
3988   verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3989                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3990                "}");
3991   // This cases is borderline, but with the indentation it is still readable.
3992   verifyFormat(
3993       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3994       "        aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3995       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3996       "}",
3997       getLLVMStyleWithColumns(75));
3998 
3999   // If the LHS is a binary expression, we should still use the additional break
4000   // as otherwise the formatting hides the operator precedence.
4001   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4002                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4003                "    5) {\n"
4004                "}");
4005   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4006                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n"
4007                "    5) {\n"
4008                "}");
4009 
4010   FormatStyle OnePerLine = getLLVMStyle();
4011   OnePerLine.BinPackParameters = false;
4012   verifyFormat(
4013       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4014       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4015       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
4016       OnePerLine);
4017 
4018   verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
4019                "                .aaa(aaaaaaaaaaaaa) *\n"
4020                "            aaaaaaa +\n"
4021                "        aaaaaaa;",
4022                getLLVMStyleWithColumns(40));
4023 }
4024 
4025 TEST_F(FormatTest, ExpressionIndentation) {
4026   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4027                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4028                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4029                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4030                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4031                "                     bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
4032                "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4033                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
4034                "                 ccccccccccccccccccccccccccccccccccccccccc;");
4035   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4036                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4037                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4038                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4039   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4040                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4041                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4042                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4043   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4044                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4045                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4046                "        bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4047   verifyFormat("if () {\n"
4048                "} else if (aaaaa && bbbbb > // break\n"
4049                "                        ccccc) {\n"
4050                "}");
4051   verifyFormat("if () {\n"
4052                "} else if constexpr (aaaaa && bbbbb > // break\n"
4053                "                                  ccccc) {\n"
4054                "}");
4055   verifyFormat("if () {\n"
4056                "} else if CONSTEXPR (aaaaa && bbbbb > // break\n"
4057                "                                  ccccc) {\n"
4058                "}");
4059   verifyFormat("if () {\n"
4060                "} else if (aaaaa &&\n"
4061                "           bbbbb > // break\n"
4062                "               ccccc &&\n"
4063                "           ddddd) {\n"
4064                "}");
4065 
4066   // Presence of a trailing comment used to change indentation of b.
4067   verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
4068                "       b;\n"
4069                "return aaaaaaaaaaaaaaaaaaa +\n"
4070                "       b; //",
4071                getLLVMStyleWithColumns(30));
4072 }
4073 
4074 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
4075   // Not sure what the best system is here. Like this, the LHS can be found
4076   // immediately above an operator (everything with the same or a higher
4077   // indent). The RHS is aligned right of the operator and so compasses
4078   // everything until something with the same indent as the operator is found.
4079   // FIXME: Is this a good system?
4080   FormatStyle Style = getLLVMStyle();
4081   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4082   verifyFormat(
4083       "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4084       "                     + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4085       "                     + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4086       "                 == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4087       "                            * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4088       "                        + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4089       "             && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4090       "                        * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4091       "                    > ccccccccccccccccccccccccccccccccccccccccc;",
4092       Style);
4093   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4094                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4095                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4096                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4097                Style);
4098   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4099                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4100                "              * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4101                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4102                Style);
4103   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4104                "    == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4105                "               * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4106                "           + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4107                Style);
4108   verifyFormat("if () {\n"
4109                "} else if (aaaaa\n"
4110                "           && bbbbb // break\n"
4111                "                  > ccccc) {\n"
4112                "}",
4113                Style);
4114   verifyFormat("return (a)\n"
4115                "       // comment\n"
4116                "       + b;",
4117                Style);
4118   verifyFormat(
4119       "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4120       "                 * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4121       "             + cc;",
4122       Style);
4123 
4124   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4125                "    = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4126                Style);
4127 
4128   // Forced by comments.
4129   verifyFormat(
4130       "unsigned ContentSize =\n"
4131       "    sizeof(int16_t)   // DWARF ARange version number\n"
4132       "    + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
4133       "    + sizeof(int8_t)  // Pointer Size (in bytes)\n"
4134       "    + sizeof(int8_t); // Segment Size (in bytes)");
4135 
4136   verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
4137                "       == boost::fusion::at_c<1>(iiii).second;",
4138                Style);
4139 
4140   Style.ColumnLimit = 60;
4141   verifyFormat("zzzzzzzzzz\n"
4142                "    = bbbbbbbbbbbbbbbbb\n"
4143                "      >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
4144                Style);
4145 
4146   Style.ColumnLimit = 80;
4147   Style.IndentWidth = 4;
4148   Style.TabWidth = 4;
4149   Style.UseTab = FormatStyle::UT_Always;
4150   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4151   Style.AlignOperands = false;
4152   EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n"
4153             "\t&& (someOtherLongishConditionPart1\n"
4154             "\t\t|| someOtherEvenLongerNestedConditionPart2);",
4155             format("return someVeryVeryLongConditionThatBarelyFitsOnALine && "
4156                    "(someOtherLongishConditionPart1 || "
4157                    "someOtherEvenLongerNestedConditionPart2);",
4158                    Style));
4159 }
4160 
4161 TEST_F(FormatTest, EnforcedOperatorWraps) {
4162   // Here we'd like to wrap after the || operators, but a comment is forcing an
4163   // earlier wrap.
4164   verifyFormat("bool x = aaaaa //\n"
4165                "         || bbbbb\n"
4166                "         //\n"
4167                "         || cccc;");
4168 }
4169 
4170 TEST_F(FormatTest, NoOperandAlignment) {
4171   FormatStyle Style = getLLVMStyle();
4172   Style.AlignOperands = false;
4173   verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
4174                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4175                "                   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4176                Style);
4177   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4178   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4179                "            + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4180                "            + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4181                "        == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4182                "                * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4183                "            + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4184                "    && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4185                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4186                "        > ccccccccccccccccccccccccccccccccccccccccc;",
4187                Style);
4188 
4189   verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4190                "        * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4191                "    + cc;",
4192                Style);
4193   verifyFormat("int a = aa\n"
4194                "    + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4195                "        * cccccccccccccccccccccccccccccccccccc;\n",
4196                Style);
4197 
4198   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4199   verifyFormat("return (a > b\n"
4200                "    // comment1\n"
4201                "    // comment2\n"
4202                "    || c);",
4203                Style);
4204 }
4205 
4206 TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
4207   FormatStyle Style = getLLVMStyle();
4208   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4209   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4210                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4211                "    + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
4212                Style);
4213 }
4214 
4215 TEST_F(FormatTest, AllowBinPackingInsideArguments) {
4216   FormatStyle Style = getLLVMStyle();
4217   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4218   Style.BinPackArguments = false;
4219   Style.ColumnLimit = 40;
4220   verifyFormat("void test() {\n"
4221                "  someFunction(\n"
4222                "      this + argument + is + quite\n"
4223                "      + long + so + it + gets + wrapped\n"
4224                "      + but + remains + bin - packed);\n"
4225                "}",
4226                Style);
4227   verifyFormat("void test() {\n"
4228                "  someFunction(arg1,\n"
4229                "               this + argument + is\n"
4230                "                   + quite + long + so\n"
4231                "                   + it + gets + wrapped\n"
4232                "                   + but + remains + bin\n"
4233                "                   - packed,\n"
4234                "               arg3);\n"
4235                "}",
4236                Style);
4237   verifyFormat("void test() {\n"
4238                "  someFunction(\n"
4239                "      arg1,\n"
4240                "      this + argument + has\n"
4241                "          + anotherFunc(nested,\n"
4242                "                        calls + whose\n"
4243                "                            + arguments\n"
4244                "                            + are + also\n"
4245                "                            + wrapped,\n"
4246                "                        in + addition)\n"
4247                "          + to + being + bin - packed,\n"
4248                "      arg3);\n"
4249                "}",
4250                Style);
4251 
4252   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4253   verifyFormat("void test() {\n"
4254                "  someFunction(\n"
4255                "      arg1,\n"
4256                "      this + argument + has +\n"
4257                "          anotherFunc(nested,\n"
4258                "                      calls + whose +\n"
4259                "                          arguments +\n"
4260                "                          are + also +\n"
4261                "                          wrapped,\n"
4262                "                      in + addition) +\n"
4263                "          to + being + bin - packed,\n"
4264                "      arg3);\n"
4265                "}",
4266                Style);
4267 }
4268 
4269 TEST_F(FormatTest, ConstructorInitializers) {
4270   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
4271   verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
4272                getLLVMStyleWithColumns(45));
4273   verifyFormat("Constructor()\n"
4274                "    : Inttializer(FitsOnTheLine) {}",
4275                getLLVMStyleWithColumns(44));
4276   verifyFormat("Constructor()\n"
4277                "    : Inttializer(FitsOnTheLine) {}",
4278                getLLVMStyleWithColumns(43));
4279 
4280   verifyFormat("template <typename T>\n"
4281                "Constructor() : Initializer(FitsOnTheLine) {}",
4282                getLLVMStyleWithColumns(45));
4283 
4284   verifyFormat(
4285       "SomeClass::Constructor()\n"
4286       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
4287 
4288   verifyFormat(
4289       "SomeClass::Constructor()\n"
4290       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4291       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
4292   verifyFormat(
4293       "SomeClass::Constructor()\n"
4294       "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4295       "      aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
4296   verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4297                "            aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4298                "    : aaaaaaaaaa(aaaaaa) {}");
4299 
4300   verifyFormat("Constructor()\n"
4301                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4302                "      aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4303                "                               aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4304                "      aaaaaaaaaaaaaaaaaaaaaaa() {}");
4305 
4306   verifyFormat("Constructor()\n"
4307                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4308                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
4309 
4310   verifyFormat("Constructor(int Parameter = 0)\n"
4311                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
4312                "      aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
4313   verifyFormat("Constructor()\n"
4314                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
4315                "}",
4316                getLLVMStyleWithColumns(60));
4317   verifyFormat("Constructor()\n"
4318                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4319                "          aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
4320 
4321   // Here a line could be saved by splitting the second initializer onto two
4322   // lines, but that is not desirable.
4323   verifyFormat("Constructor()\n"
4324                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
4325                "      aaaaaaaaaaa(aaaaaaaaaaa),\n"
4326                "      aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
4327 
4328   FormatStyle OnePerLine = getLLVMStyle();
4329   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4330   OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
4331   verifyFormat("SomeClass::Constructor()\n"
4332                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4333                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4334                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4335                OnePerLine);
4336   verifyFormat("SomeClass::Constructor()\n"
4337                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
4338                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4339                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4340                OnePerLine);
4341   verifyFormat("MyClass::MyClass(int var)\n"
4342                "    : some_var_(var),            // 4 space indent\n"
4343                "      some_other_var_(var + 1) { // lined up\n"
4344                "}",
4345                OnePerLine);
4346   verifyFormat("Constructor()\n"
4347                "    : aaaaa(aaaaaa),\n"
4348                "      aaaaa(aaaaaa),\n"
4349                "      aaaaa(aaaaaa),\n"
4350                "      aaaaa(aaaaaa),\n"
4351                "      aaaaa(aaaaaa) {}",
4352                OnePerLine);
4353   verifyFormat("Constructor()\n"
4354                "    : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4355                "            aaaaaaaaaaaaaaaaaaaaaa) {}",
4356                OnePerLine);
4357   OnePerLine.BinPackParameters = false;
4358   verifyFormat(
4359       "Constructor()\n"
4360       "    : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4361       "          aaaaaaaaaaa().aaa(),\n"
4362       "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4363       OnePerLine);
4364   OnePerLine.ColumnLimit = 60;
4365   verifyFormat("Constructor()\n"
4366                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4367                "      bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
4368                OnePerLine);
4369 
4370   EXPECT_EQ("Constructor()\n"
4371             "    : // Comment forcing unwanted break.\n"
4372             "      aaaa(aaaa) {}",
4373             format("Constructor() :\n"
4374                    "    // Comment forcing unwanted break.\n"
4375                    "    aaaa(aaaa) {}"));
4376 }
4377 
4378 TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) {
4379   FormatStyle Style = getLLVMStyle();
4380   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4381   Style.ColumnLimit = 60;
4382   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4383   Style.AllowAllConstructorInitializersOnNextLine = true;
4384   Style.BinPackParameters = false;
4385 
4386   for (int i = 0; i < 4; ++i) {
4387     // Test all combinations of parameters that should not have an effect.
4388     Style.AllowAllParametersOfDeclarationOnNextLine = i & 1;
4389     Style.AllowAllArgumentsOnNextLine = i & 2;
4390 
4391     Style.AllowAllConstructorInitializersOnNextLine = true;
4392     Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4393     verifyFormat("Constructor()\n"
4394                  "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4395                  Style);
4396     verifyFormat("Constructor() : a(a), b(b) {}", Style);
4397 
4398     Style.AllowAllConstructorInitializersOnNextLine = false;
4399     verifyFormat("Constructor()\n"
4400                  "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4401                  "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4402                  Style);
4403     verifyFormat("Constructor() : a(a), b(b) {}", Style);
4404 
4405     Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
4406     Style.AllowAllConstructorInitializersOnNextLine = true;
4407     verifyFormat("Constructor()\n"
4408                  "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4409                  Style);
4410 
4411     Style.AllowAllConstructorInitializersOnNextLine = false;
4412     verifyFormat("Constructor()\n"
4413                  "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4414                  "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4415                  Style);
4416 
4417     Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4418     Style.AllowAllConstructorInitializersOnNextLine = true;
4419     verifyFormat("Constructor() :\n"
4420                  "    aaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4421                  Style);
4422 
4423     Style.AllowAllConstructorInitializersOnNextLine = false;
4424     verifyFormat("Constructor() :\n"
4425                  "    aaaaaaaaaaaaaaaaaa(a),\n"
4426                  "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4427                  Style);
4428   }
4429 
4430   // Test interactions between AllowAllParametersOfDeclarationOnNextLine and
4431   // AllowAllConstructorInitializersOnNextLine in all
4432   // BreakConstructorInitializers modes
4433   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4434   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4435   Style.AllowAllConstructorInitializersOnNextLine = false;
4436   verifyFormat("SomeClassWithALongName::Constructor(\n"
4437                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n"
4438                "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4439                "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4440                Style);
4441 
4442   Style.AllowAllConstructorInitializersOnNextLine = true;
4443   verifyFormat("SomeClassWithALongName::Constructor(\n"
4444                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4445                "    int bbbbbbbbbbbbb,\n"
4446                "    int cccccccccccccccc)\n"
4447                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4448                Style);
4449 
4450   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4451   Style.AllowAllConstructorInitializersOnNextLine = false;
4452   verifyFormat("SomeClassWithALongName::Constructor(\n"
4453                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4454                "    int bbbbbbbbbbbbb)\n"
4455                "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4456                "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4457                Style);
4458 
4459   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
4460 
4461   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4462   verifyFormat("SomeClassWithALongName::Constructor(\n"
4463                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n"
4464                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4465                "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4466                Style);
4467 
4468   Style.AllowAllConstructorInitializersOnNextLine = true;
4469   verifyFormat("SomeClassWithALongName::Constructor(\n"
4470                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4471                "    int bbbbbbbbbbbbb,\n"
4472                "    int cccccccccccccccc)\n"
4473                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4474                Style);
4475 
4476   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4477   Style.AllowAllConstructorInitializersOnNextLine = false;
4478   verifyFormat("SomeClassWithALongName::Constructor(\n"
4479                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4480                "    int bbbbbbbbbbbbb)\n"
4481                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4482                "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4483                Style);
4484 
4485   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4486   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4487   verifyFormat("SomeClassWithALongName::Constructor(\n"
4488                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb) :\n"
4489                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4490                "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4491                Style);
4492 
4493   Style.AllowAllConstructorInitializersOnNextLine = true;
4494   verifyFormat("SomeClassWithALongName::Constructor(\n"
4495                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4496                "    int bbbbbbbbbbbbb,\n"
4497                "    int cccccccccccccccc) :\n"
4498                "    aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4499                Style);
4500 
4501   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4502   Style.AllowAllConstructorInitializersOnNextLine = false;
4503   verifyFormat("SomeClassWithALongName::Constructor(\n"
4504                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4505                "    int bbbbbbbbbbbbb) :\n"
4506                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4507                "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4508                Style);
4509 }
4510 
4511 TEST_F(FormatTest, AllowAllArgumentsOnNextLine) {
4512   FormatStyle Style = getLLVMStyle();
4513   Style.ColumnLimit = 60;
4514   Style.BinPackArguments = false;
4515   for (int i = 0; i < 4; ++i) {
4516     // Test all combinations of parameters that should not have an effect.
4517     Style.AllowAllParametersOfDeclarationOnNextLine = i & 1;
4518     Style.AllowAllConstructorInitializersOnNextLine = i & 2;
4519 
4520     Style.AllowAllArgumentsOnNextLine = true;
4521     verifyFormat("void foo() {\n"
4522                  "  FunctionCallWithReallyLongName(\n"
4523                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb);\n"
4524                  "}",
4525                  Style);
4526     Style.AllowAllArgumentsOnNextLine = false;
4527     verifyFormat("void foo() {\n"
4528                  "  FunctionCallWithReallyLongName(\n"
4529                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4530                  "      bbbbbbbbbbbb);\n"
4531                  "}",
4532                  Style);
4533 
4534     Style.AllowAllArgumentsOnNextLine = true;
4535     verifyFormat("void foo() {\n"
4536                  "  auto VariableWithReallyLongName = {\n"
4537                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb};\n"
4538                  "}",
4539                  Style);
4540     Style.AllowAllArgumentsOnNextLine = false;
4541     verifyFormat("void foo() {\n"
4542                  "  auto VariableWithReallyLongName = {\n"
4543                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4544                  "      bbbbbbbbbbbb};\n"
4545                  "}",
4546                  Style);
4547   }
4548 
4549   // This parameter should not affect declarations.
4550   Style.BinPackParameters = false;
4551   Style.AllowAllArgumentsOnNextLine = false;
4552   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4553   verifyFormat("void FunctionCallWithReallyLongName(\n"
4554                "    int aaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbb);",
4555                Style);
4556   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4557   verifyFormat("void FunctionCallWithReallyLongName(\n"
4558                "    int aaaaaaaaaaaaaaaaaaaaaaa,\n"
4559                "    int bbbbbbbbbbbb);",
4560                Style);
4561 }
4562 
4563 TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
4564   FormatStyle Style = getLLVMStyle();
4565   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4566 
4567   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
4568   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
4569                getStyleWithColumns(Style, 45));
4570   verifyFormat("Constructor() :\n"
4571                "    Initializer(FitsOnTheLine) {}",
4572                getStyleWithColumns(Style, 44));
4573   verifyFormat("Constructor() :\n"
4574                "    Initializer(FitsOnTheLine) {}",
4575                getStyleWithColumns(Style, 43));
4576 
4577   verifyFormat("template <typename T>\n"
4578                "Constructor() : Initializer(FitsOnTheLine) {}",
4579                getStyleWithColumns(Style, 50));
4580   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4581   verifyFormat(
4582       "SomeClass::Constructor() :\n"
4583       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
4584       Style);
4585 
4586   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = false;
4587   verifyFormat(
4588       "SomeClass::Constructor() :\n"
4589       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
4590       Style);
4591 
4592   verifyFormat(
4593       "SomeClass::Constructor() :\n"
4594       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4595       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4596       Style);
4597   verifyFormat(
4598       "SomeClass::Constructor() :\n"
4599       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4600       "    aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
4601       Style);
4602   verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4603                "            aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4604                "    aaaaaaaaaa(aaaaaa) {}",
4605                Style);
4606 
4607   verifyFormat("Constructor() :\n"
4608                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4609                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4610                "                             aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4611                "    aaaaaaaaaaaaaaaaaaaaaaa() {}",
4612                Style);
4613 
4614   verifyFormat("Constructor() :\n"
4615                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4616                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4617                Style);
4618 
4619   verifyFormat("Constructor(int Parameter = 0) :\n"
4620                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
4621                "    aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
4622                Style);
4623   verifyFormat("Constructor() :\n"
4624                "    aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
4625                "}",
4626                getStyleWithColumns(Style, 60));
4627   verifyFormat("Constructor() :\n"
4628                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4629                "        aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
4630                Style);
4631 
4632   // Here a line could be saved by splitting the second initializer onto two
4633   // lines, but that is not desirable.
4634   verifyFormat("Constructor() :\n"
4635                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
4636                "    aaaaaaaaaaa(aaaaaaaaaaa),\n"
4637                "    aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4638                Style);
4639 
4640   FormatStyle OnePerLine = Style;
4641   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4642   OnePerLine.AllowAllConstructorInitializersOnNextLine = false;
4643   verifyFormat("SomeClass::Constructor() :\n"
4644                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4645                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4646                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4647                OnePerLine);
4648   verifyFormat("SomeClass::Constructor() :\n"
4649                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
4650                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4651                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4652                OnePerLine);
4653   verifyFormat("MyClass::MyClass(int var) :\n"
4654                "    some_var_(var),            // 4 space indent\n"
4655                "    some_other_var_(var + 1) { // lined up\n"
4656                "}",
4657                OnePerLine);
4658   verifyFormat("Constructor() :\n"
4659                "    aaaaa(aaaaaa),\n"
4660                "    aaaaa(aaaaaa),\n"
4661                "    aaaaa(aaaaaa),\n"
4662                "    aaaaa(aaaaaa),\n"
4663                "    aaaaa(aaaaaa) {}",
4664                OnePerLine);
4665   verifyFormat("Constructor() :\n"
4666                "    aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4667                "          aaaaaaaaaaaaaaaaaaaaaa) {}",
4668                OnePerLine);
4669   OnePerLine.BinPackParameters = false;
4670   verifyFormat("Constructor() :\n"
4671                "    aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4672                "        aaaaaaaaaaa().aaa(),\n"
4673                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4674                OnePerLine);
4675   OnePerLine.ColumnLimit = 60;
4676   verifyFormat("Constructor() :\n"
4677                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4678                "    bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
4679                OnePerLine);
4680 
4681   EXPECT_EQ("Constructor() :\n"
4682             "    // Comment forcing unwanted break.\n"
4683             "    aaaa(aaaa) {}",
4684             format("Constructor() :\n"
4685                    "    // Comment forcing unwanted break.\n"
4686                    "    aaaa(aaaa) {}",
4687                    Style));
4688 
4689   Style.ColumnLimit = 0;
4690   verifyFormat("SomeClass::Constructor() :\n"
4691                "    a(a) {}",
4692                Style);
4693   verifyFormat("SomeClass::Constructor() noexcept :\n"
4694                "    a(a) {}",
4695                Style);
4696   verifyFormat("SomeClass::Constructor() :\n"
4697                "    a(a), b(b), c(c) {}",
4698                Style);
4699   verifyFormat("SomeClass::Constructor() :\n"
4700                "    a(a) {\n"
4701                "  foo();\n"
4702                "  bar();\n"
4703                "}",
4704                Style);
4705 
4706   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
4707   verifyFormat("SomeClass::Constructor() :\n"
4708                "    a(a), b(b), c(c) {\n"
4709                "}",
4710                Style);
4711   verifyFormat("SomeClass::Constructor() :\n"
4712                "    a(a) {\n"
4713                "}",
4714                Style);
4715 
4716   Style.ColumnLimit = 80;
4717   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
4718   Style.ConstructorInitializerIndentWidth = 2;
4719   verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}", Style);
4720   verifyFormat("SomeClass::Constructor() :\n"
4721                "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4722                "  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
4723                Style);
4724 
4725   // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as
4726   // well
4727   Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
4728   verifyFormat(
4729       "class SomeClass\n"
4730       "  : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4731       "    public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
4732       Style);
4733   Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
4734   verifyFormat(
4735       "class SomeClass\n"
4736       "  : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4737       "  , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
4738       Style);
4739   Style.BreakInheritanceList = FormatStyle::BILS_AfterColon;
4740   verifyFormat(
4741       "class SomeClass :\n"
4742       "  public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4743       "  public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
4744       Style);
4745 }
4746 
4747 #ifndef EXPENSIVE_CHECKS
4748 // Expensive checks enables libstdc++ checking which includes validating the
4749 // state of ranges used in std::priority_queue - this blows out the
4750 // runtime/scalability of the function and makes this test unacceptably slow.
4751 TEST_F(FormatTest, MemoizationTests) {
4752   // This breaks if the memoization lookup does not take \c Indent and
4753   // \c LastSpace into account.
4754   verifyFormat(
4755       "extern CFRunLoopTimerRef\n"
4756       "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
4757       "                     CFTimeInterval interval, CFOptionFlags flags,\n"
4758       "                     CFIndex order, CFRunLoopTimerCallBack callout,\n"
4759       "                     CFRunLoopTimerContext *context) {}");
4760 
4761   // Deep nesting somewhat works around our memoization.
4762   verifyFormat(
4763       "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4764       "    aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4765       "        aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4766       "            aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4767       "                aaaaa())))))))))))))))))))))))))))))))))))))));",
4768       getLLVMStyleWithColumns(65));
4769   verifyFormat(
4770       "aaaaa(\n"
4771       "    aaaaa,\n"
4772       "    aaaaa(\n"
4773       "        aaaaa,\n"
4774       "        aaaaa(\n"
4775       "            aaaaa,\n"
4776       "            aaaaa(\n"
4777       "                aaaaa,\n"
4778       "                aaaaa(\n"
4779       "                    aaaaa,\n"
4780       "                    aaaaa(\n"
4781       "                        aaaaa,\n"
4782       "                        aaaaa(\n"
4783       "                            aaaaa,\n"
4784       "                            aaaaa(\n"
4785       "                                aaaaa,\n"
4786       "                                aaaaa(\n"
4787       "                                    aaaaa,\n"
4788       "                                    aaaaa(\n"
4789       "                                        aaaaa,\n"
4790       "                                        aaaaa(\n"
4791       "                                            aaaaa,\n"
4792       "                                            aaaaa(\n"
4793       "                                                aaaaa,\n"
4794       "                                                aaaaa))))))))))));",
4795       getLLVMStyleWithColumns(65));
4796   verifyFormat(
4797       "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"
4798       "                                  a),\n"
4799       "                                a),\n"
4800       "                              a),\n"
4801       "                            a),\n"
4802       "                          a),\n"
4803       "                        a),\n"
4804       "                      a),\n"
4805       "                    a),\n"
4806       "                  a),\n"
4807       "                a),\n"
4808       "              a),\n"
4809       "            a),\n"
4810       "          a),\n"
4811       "        a),\n"
4812       "      a),\n"
4813       "    a),\n"
4814       "  a)",
4815       getLLVMStyleWithColumns(65));
4816 
4817   // This test takes VERY long when memoization is broken.
4818   FormatStyle OnePerLine = getLLVMStyle();
4819   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4820   OnePerLine.BinPackParameters = false;
4821   std::string input = "Constructor()\n"
4822                       "    : aaaa(a,\n";
4823   for (unsigned i = 0, e = 80; i != e; ++i) {
4824     input += "           a,\n";
4825   }
4826   input += "           a) {}";
4827   verifyFormat(input, OnePerLine);
4828 }
4829 #endif
4830 
4831 TEST_F(FormatTest, BreaksAsHighAsPossible) {
4832   verifyFormat(
4833       "void f() {\n"
4834       "  if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
4835       "      (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
4836       "    f();\n"
4837       "}");
4838   verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
4839                "    Intervals[i - 1].getRange().getLast()) {\n}");
4840 }
4841 
4842 TEST_F(FormatTest, BreaksFunctionDeclarations) {
4843   // Principially, we break function declarations in a certain order:
4844   // 1) break amongst arguments.
4845   verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
4846                "                              Cccccccccccccc cccccccccccccc);");
4847   verifyFormat("template <class TemplateIt>\n"
4848                "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
4849                "                            TemplateIt *stop) {}");
4850 
4851   // 2) break after return type.
4852   verifyFormat(
4853       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4854       "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
4855       getGoogleStyle());
4856 
4857   // 3) break after (.
4858   verifyFormat(
4859       "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
4860       "    Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
4861       getGoogleStyle());
4862 
4863   // 4) break before after nested name specifiers.
4864   verifyFormat(
4865       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4866       "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
4867       "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
4868       getGoogleStyle());
4869 
4870   // However, there are exceptions, if a sufficient amount of lines can be
4871   // saved.
4872   // FIXME: The precise cut-offs wrt. the number of saved lines might need some
4873   // more adjusting.
4874   verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4875                "                                  Cccccccccccccc cccccccccc,\n"
4876                "                                  Cccccccccccccc cccccccccc,\n"
4877                "                                  Cccccccccccccc cccccccccc,\n"
4878                "                                  Cccccccccccccc cccccccccc);");
4879   verifyFormat(
4880       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4881       "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4882       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4883       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
4884       getGoogleStyle());
4885   verifyFormat(
4886       "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4887       "                                          Cccccccccccccc cccccccccc,\n"
4888       "                                          Cccccccccccccc cccccccccc,\n"
4889       "                                          Cccccccccccccc cccccccccc,\n"
4890       "                                          Cccccccccccccc cccccccccc,\n"
4891       "                                          Cccccccccccccc cccccccccc,\n"
4892       "                                          Cccccccccccccc cccccccccc);");
4893   verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4894                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4895                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4896                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4897                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
4898 
4899   // Break after multi-line parameters.
4900   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4901                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4902                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4903                "    bbbb bbbb);");
4904   verifyFormat("void SomeLoooooooooooongFunction(\n"
4905                "    std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
4906                "        aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4907                "    int bbbbbbbbbbbbb);");
4908 
4909   // Treat overloaded operators like other functions.
4910   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4911                "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
4912   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4913                "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
4914   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4915                "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
4916   verifyGoogleFormat(
4917       "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
4918       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
4919   verifyGoogleFormat(
4920       "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
4921       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
4922   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4923                "    int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
4924   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
4925                "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
4926   verifyGoogleFormat(
4927       "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
4928       "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4929       "    bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
4930   verifyGoogleFormat("template <typename T>\n"
4931                      "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4932                      "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
4933                      "    aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
4934 
4935   FormatStyle Style = getLLVMStyle();
4936   Style.PointerAlignment = FormatStyle::PAS_Left;
4937   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4938                "    aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
4939                Style);
4940   verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
4941                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4942                Style);
4943 }
4944 
4945 TEST_F(FormatTest, DontBreakBeforeQualifiedOperator) {
4946   // Regression test for https://bugs.llvm.org/show_bug.cgi?id=40516:
4947   // Prefer keeping `::` followed by `operator` together.
4948   EXPECT_EQ("const aaaa::bbbbbbb &\n"
4949             "ccccccccc::operator++() {\n"
4950             "  stuff();\n"
4951             "}",
4952             format("const aaaa::bbbbbbb\n"
4953                    "&ccccccccc::operator++() { stuff(); }",
4954                    getLLVMStyleWithColumns(40)));
4955 }
4956 
4957 TEST_F(FormatTest, TrailingReturnType) {
4958   verifyFormat("auto foo() -> int;\n");
4959   // correct trailing return type spacing
4960   verifyFormat("auto operator->() -> int;\n");
4961   verifyFormat("auto operator++(int) -> int;\n");
4962 
4963   verifyFormat("struct S {\n"
4964                "  auto bar() const -> int;\n"
4965                "};");
4966   verifyFormat("template <size_t Order, typename T>\n"
4967                "auto load_img(const std::string &filename)\n"
4968                "    -> alias::tensor<Order, T, mem::tag::cpu> {}");
4969   verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
4970                "    -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
4971   verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
4972   verifyFormat("template <typename T>\n"
4973                "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
4974                "    -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
4975 
4976   // Not trailing return types.
4977   verifyFormat("void f() { auto a = b->c(); }");
4978 }
4979 
4980 TEST_F(FormatTest, DeductionGuides) {
4981   verifyFormat("template <class T> A(const T &, const T &) -> A<T &>;");
4982   verifyFormat("template <class T> explicit A(T &, T &&) -> A<T>;");
4983   verifyFormat("template <class... Ts> S(Ts...) -> S<Ts...>;");
4984   verifyFormat(
4985       "template <class... T>\n"
4986       "array(T &&... t) -> array<std::common_type_t<T...>, sizeof...(T)>;");
4987   verifyFormat("template <class T> A() -> A<decltype(p->foo<3>())>;");
4988   verifyFormat("template <class T> A() -> A<decltype(foo<traits<1>>)>;");
4989   verifyFormat("template <class T> A() -> A<sizeof(p->foo<1>)>;");
4990   verifyFormat("template <class T> A() -> A<(3 < 2)>;");
4991   verifyFormat("template <class T> A() -> A<((3) < (2))>;");
4992   verifyFormat("template <class T> x() -> x<1>;");
4993   verifyFormat("template <class T> explicit x(T &) -> x<1>;");
4994 
4995   // Ensure not deduction guides.
4996   verifyFormat("c()->f<int>();");
4997   verifyFormat("x()->foo<1>;");
4998   verifyFormat("x = p->foo<3>();");
4999   verifyFormat("x()->x<1>();");
5000   verifyFormat("x()->x<1>;");
5001 }
5002 
5003 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
5004   // Avoid breaking before trailing 'const' or other trailing annotations, if
5005   // they are not function-like.
5006   FormatStyle Style = getGoogleStyle();
5007   Style.ColumnLimit = 47;
5008   verifyFormat("void someLongFunction(\n"
5009                "    int someLoooooooooooooongParameter) const {\n}",
5010                getLLVMStyleWithColumns(47));
5011   verifyFormat("LoooooongReturnType\n"
5012                "someLoooooooongFunction() const {}",
5013                getLLVMStyleWithColumns(47));
5014   verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
5015                "    const {}",
5016                Style);
5017   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
5018                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
5019   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
5020                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
5021   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
5022                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
5023   verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
5024                "                   aaaaaaaaaaa aaaaa) const override;");
5025   verifyGoogleFormat(
5026       "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5027       "    const override;");
5028 
5029   // Even if the first parameter has to be wrapped.
5030   verifyFormat("void someLongFunction(\n"
5031                "    int someLongParameter) const {}",
5032                getLLVMStyleWithColumns(46));
5033   verifyFormat("void someLongFunction(\n"
5034                "    int someLongParameter) const {}",
5035                Style);
5036   verifyFormat("void someLongFunction(\n"
5037                "    int someLongParameter) override {}",
5038                Style);
5039   verifyFormat("void someLongFunction(\n"
5040                "    int someLongParameter) OVERRIDE {}",
5041                Style);
5042   verifyFormat("void someLongFunction(\n"
5043                "    int someLongParameter) final {}",
5044                Style);
5045   verifyFormat("void someLongFunction(\n"
5046                "    int someLongParameter) FINAL {}",
5047                Style);
5048   verifyFormat("void someLongFunction(\n"
5049                "    int parameter) const override {}",
5050                Style);
5051 
5052   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
5053   verifyFormat("void someLongFunction(\n"
5054                "    int someLongParameter) const\n"
5055                "{\n"
5056                "}",
5057                Style);
5058 
5059   Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths;
5060   verifyFormat("void someLongFunction(\n"
5061                "    int someLongParameter) const\n"
5062                "  {\n"
5063                "  }",
5064                Style);
5065 
5066   // Unless these are unknown annotations.
5067   verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
5068                "                  aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5069                "    LONG_AND_UGLY_ANNOTATION;");
5070 
5071   // Breaking before function-like trailing annotations is fine to keep them
5072   // close to their arguments.
5073   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5074                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
5075   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
5076                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
5077   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
5078                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
5079   verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
5080                      "    AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
5081   verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
5082 
5083   verifyFormat(
5084       "void aaaaaaaaaaaaaaaaaa()\n"
5085       "    __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
5086       "                   aaaaaaaaaaaaaaaaaaaaaaaaa));");
5087   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5088                "    __attribute__((unused));");
5089   verifyGoogleFormat(
5090       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5091       "    GUARDED_BY(aaaaaaaaaaaa);");
5092   verifyGoogleFormat(
5093       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5094       "    GUARDED_BY(aaaaaaaaaaaa);");
5095   verifyGoogleFormat(
5096       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
5097       "    aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5098   verifyGoogleFormat(
5099       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
5100       "    aaaaaaaaaaaaaaaaaaaaaaaaa;");
5101 }
5102 
5103 TEST_F(FormatTest, FunctionAnnotations) {
5104   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
5105                "int OldFunction(const string &parameter) {}");
5106   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
5107                "string OldFunction(const string &parameter) {}");
5108   verifyFormat("template <typename T>\n"
5109                "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
5110                "string OldFunction(const string &parameter) {}");
5111 
5112   // Not function annotations.
5113   verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5114                "                << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
5115   verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
5116                "       ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
5117   verifyFormat("MACRO(abc).function() // wrap\n"
5118                "    << abc;");
5119   verifyFormat("MACRO(abc)->function() // wrap\n"
5120                "    << abc;");
5121   verifyFormat("MACRO(abc)::function() // wrap\n"
5122                "    << abc;");
5123 }
5124 
5125 TEST_F(FormatTest, BreaksDesireably) {
5126   verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
5127                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
5128                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
5129   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5130                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
5131                "}");
5132 
5133   verifyFormat(
5134       "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5135       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
5136 
5137   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5138                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5139                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
5140 
5141   verifyFormat(
5142       "aaaaaaaa(aaaaaaaaaaaaa,\n"
5143       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5144       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
5145       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5146       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
5147 
5148   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
5149                "    (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5150 
5151   verifyFormat(
5152       "void f() {\n"
5153       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
5154       "                                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5155       "}");
5156   verifyFormat(
5157       "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5158       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
5159   verifyFormat(
5160       "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5161       "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
5162   verifyFormat(
5163       "aaaaaa(aaa,\n"
5164       "       new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5165       "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5166       "       aaaa);");
5167   verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5168                "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5169                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5170 
5171   // Indent consistently independent of call expression and unary operator.
5172   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
5173                "    dddddddddddddddddddddddddddddd));");
5174   verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
5175                "    dddddddddddddddddddddddddddddd));");
5176   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
5177                "    dddddddddddddddddddddddddddddd));");
5178 
5179   // This test case breaks on an incorrect memoization, i.e. an optimization not
5180   // taking into account the StopAt value.
5181   verifyFormat(
5182       "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
5183       "       aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
5184       "       aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
5185       "       (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5186 
5187   verifyFormat("{\n  {\n    {\n"
5188                "      Annotation.SpaceRequiredBefore =\n"
5189                "          Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
5190                "          Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
5191                "    }\n  }\n}");
5192 
5193   // Break on an outer level if there was a break on an inner level.
5194   EXPECT_EQ("f(g(h(a, // comment\n"
5195             "      b, c),\n"
5196             "    d, e),\n"
5197             "  x, y);",
5198             format("f(g(h(a, // comment\n"
5199                    "    b, c), d, e), x, y);"));
5200 
5201   // Prefer breaking similar line breaks.
5202   verifyFormat(
5203       "const int kTrackingOptions = NSTrackingMouseMoved |\n"
5204       "                             NSTrackingMouseEnteredAndExited |\n"
5205       "                             NSTrackingActiveAlways;");
5206 }
5207 
5208 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
5209   FormatStyle NoBinPacking = getGoogleStyle();
5210   NoBinPacking.BinPackParameters = false;
5211   NoBinPacking.BinPackArguments = true;
5212   verifyFormat("void f() {\n"
5213                "  f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
5214                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5215                "}",
5216                NoBinPacking);
5217   verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
5218                "       int aaaaaaaaaaaaaaaaaaaa,\n"
5219                "       int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5220                NoBinPacking);
5221 
5222   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
5223   verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5224                "                        vector<int> bbbbbbbbbbbbbbb);",
5225                NoBinPacking);
5226   // FIXME: This behavior difference is probably not wanted. However, currently
5227   // we cannot distinguish BreakBeforeParameter being set because of the wrapped
5228   // template arguments from BreakBeforeParameter being set because of the
5229   // one-per-line formatting.
5230   verifyFormat(
5231       "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
5232       "                                             aaaaaaaaaa> aaaaaaaaaa);",
5233       NoBinPacking);
5234   verifyFormat(
5235       "void fffffffffff(\n"
5236       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
5237       "        aaaaaaaaaa);");
5238 }
5239 
5240 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
5241   FormatStyle NoBinPacking = getGoogleStyle();
5242   NoBinPacking.BinPackParameters = false;
5243   NoBinPacking.BinPackArguments = false;
5244   verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
5245                "  aaaaaaaaaaaaaaaaaaaa,\n"
5246                "  aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
5247                NoBinPacking);
5248   verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
5249                "        aaaaaaaaaaaaa,\n"
5250                "        aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
5251                NoBinPacking);
5252   verifyFormat(
5253       "aaaaaaaa(aaaaaaaaaaaaa,\n"
5254       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5255       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
5256       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5257       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
5258       NoBinPacking);
5259   verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
5260                "    .aaaaaaaaaaaaaaaaaa();",
5261                NoBinPacking);
5262   verifyFormat("void f() {\n"
5263                "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5264                "      aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
5265                "}",
5266                NoBinPacking);
5267 
5268   verifyFormat(
5269       "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5270       "             aaaaaaaaaaaa,\n"
5271       "             aaaaaaaaaaaa);",
5272       NoBinPacking);
5273   verifyFormat(
5274       "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
5275       "                               ddddddddddddddddddddddddddddd),\n"
5276       "             test);",
5277       NoBinPacking);
5278 
5279   verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
5280                "            aaaaaaaaaaaaaaaaaaaaaaa,\n"
5281                "            aaaaaaaaaaaaaaaaaaaaaaa>\n"
5282                "    aaaaaaaaaaaaaaaaaa;",
5283                NoBinPacking);
5284   verifyFormat("a(\"a\"\n"
5285                "  \"a\",\n"
5286                "  a);");
5287 
5288   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
5289   verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
5290                "                aaaaaaaaa,\n"
5291                "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5292                NoBinPacking);
5293   verifyFormat(
5294       "void f() {\n"
5295       "  aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
5296       "      .aaaaaaa();\n"
5297       "}",
5298       NoBinPacking);
5299   verifyFormat(
5300       "template <class SomeType, class SomeOtherType>\n"
5301       "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
5302       NoBinPacking);
5303 }
5304 
5305 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
5306   FormatStyle Style = getLLVMStyleWithColumns(15);
5307   Style.ExperimentalAutoDetectBinPacking = true;
5308   EXPECT_EQ("aaa(aaaa,\n"
5309             "    aaaa,\n"
5310             "    aaaa);\n"
5311             "aaa(aaaa,\n"
5312             "    aaaa,\n"
5313             "    aaaa);",
5314             format("aaa(aaaa,\n" // one-per-line
5315                    "  aaaa,\n"
5316                    "    aaaa  );\n"
5317                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
5318                    Style));
5319   EXPECT_EQ("aaa(aaaa, aaaa,\n"
5320             "    aaaa);\n"
5321             "aaa(aaaa, aaaa,\n"
5322             "    aaaa);",
5323             format("aaa(aaaa,  aaaa,\n" // bin-packed
5324                    "    aaaa  );\n"
5325                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
5326                    Style));
5327 }
5328 
5329 TEST_F(FormatTest, FormatsBuilderPattern) {
5330   verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
5331                "    .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
5332                "    .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
5333                "    .StartsWith(\".init\", ORDER_INIT)\n"
5334                "    .StartsWith(\".fini\", ORDER_FINI)\n"
5335                "    .StartsWith(\".hash\", ORDER_HASH)\n"
5336                "    .Default(ORDER_TEXT);\n");
5337 
5338   verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
5339                "       aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
5340   verifyFormat("aaaaaaa->aaaaaaa\n"
5341                "    ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5342                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5343                "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
5344   verifyFormat(
5345       "aaaaaaa->aaaaaaa\n"
5346       "    ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5347       "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
5348   verifyFormat(
5349       "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
5350       "    aaaaaaaaaaaaaa);");
5351   verifyFormat(
5352       "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
5353       "    aaaaaa->aaaaaaaaaaaa()\n"
5354       "        ->aaaaaaaaaaaaaaaa(\n"
5355       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5356       "        ->aaaaaaaaaaaaaaaaa();");
5357   verifyGoogleFormat(
5358       "void f() {\n"
5359       "  someo->Add((new util::filetools::Handler(dir))\n"
5360       "                 ->OnEvent1(NewPermanentCallback(\n"
5361       "                     this, &HandlerHolderClass::EventHandlerCBA))\n"
5362       "                 ->OnEvent2(NewPermanentCallback(\n"
5363       "                     this, &HandlerHolderClass::EventHandlerCBB))\n"
5364       "                 ->OnEvent3(NewPermanentCallback(\n"
5365       "                     this, &HandlerHolderClass::EventHandlerCBC))\n"
5366       "                 ->OnEvent5(NewPermanentCallback(\n"
5367       "                     this, &HandlerHolderClass::EventHandlerCBD))\n"
5368       "                 ->OnEvent6(NewPermanentCallback(\n"
5369       "                     this, &HandlerHolderClass::EventHandlerCBE)));\n"
5370       "}");
5371 
5372   verifyFormat(
5373       "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
5374   verifyFormat("aaaaaaaaaaaaaaa()\n"
5375                "    .aaaaaaaaaaaaaaa()\n"
5376                "    .aaaaaaaaaaaaaaa()\n"
5377                "    .aaaaaaaaaaaaaaa()\n"
5378                "    .aaaaaaaaaaaaaaa();");
5379   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
5380                "    .aaaaaaaaaaaaaaa()\n"
5381                "    .aaaaaaaaaaaaaaa()\n"
5382                "    .aaaaaaaaaaaaaaa();");
5383   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
5384                "    .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
5385                "    .aaaaaaaaaaaaaaa();");
5386   verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
5387                "    ->aaaaaaaaaaaaaae(0)\n"
5388                "    ->aaaaaaaaaaaaaaa();");
5389 
5390   // Don't linewrap after very short segments.
5391   verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5392                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5393                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5394   verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5395                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5396                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5397   verifyFormat("aaa()\n"
5398                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5399                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5400                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5401 
5402   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
5403                "    .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5404                "    .has<bbbbbbbbbbbbbbbbbbbbb>();");
5405   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
5406                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
5407                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
5408 
5409   // Prefer not to break after empty parentheses.
5410   verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
5411                "    First->LastNewlineOffset);");
5412 
5413   // Prefer not to create "hanging" indents.
5414   verifyFormat(
5415       "return !soooooooooooooome_map\n"
5416       "            .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5417       "            .second;");
5418   verifyFormat(
5419       "return aaaaaaaaaaaaaaaa\n"
5420       "    .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
5421       "    .aaaa(aaaaaaaaaaaaaa);");
5422   // No hanging indent here.
5423   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
5424                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5425   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
5426                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5427   verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
5428                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5429                getLLVMStyleWithColumns(60));
5430   verifyFormat("aaaaaaaaaaaaaaaaaa\n"
5431                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
5432                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5433                getLLVMStyleWithColumns(59));
5434   verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5435                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5436                "    .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5437 
5438   // Dont break if only closing statements before member call
5439   verifyFormat("test() {\n"
5440                "  ([]() -> {\n"
5441                "    int b = 32;\n"
5442                "    return 3;\n"
5443                "  }).foo();\n"
5444                "}");
5445   verifyFormat("test() {\n"
5446                "  (\n"
5447                "      []() -> {\n"
5448                "        int b = 32;\n"
5449                "        return 3;\n"
5450                "      },\n"
5451                "      foo, bar)\n"
5452                "      .foo();\n"
5453                "}");
5454   verifyFormat("test() {\n"
5455                "  ([]() -> {\n"
5456                "    int b = 32;\n"
5457                "    return 3;\n"
5458                "  })\n"
5459                "      .foo()\n"
5460                "      .bar();\n"
5461                "}");
5462   verifyFormat("test() {\n"
5463                "  ([]() -> {\n"
5464                "    int b = 32;\n"
5465                "    return 3;\n"
5466                "  })\n"
5467                "      .foo(\"aaaaaaaaaaaaaaaaa\"\n"
5468                "           \"bbbb\");\n"
5469                "}",
5470                getLLVMStyleWithColumns(30));
5471 }
5472 
5473 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
5474   verifyFormat(
5475       "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
5476       "    bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
5477   verifyFormat(
5478       "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
5479       "    bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
5480 
5481   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
5482                "    ccccccccccccccccccccccccc) {\n}");
5483   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
5484                "    ccccccccccccccccccccccccc) {\n}");
5485 
5486   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
5487                "    ccccccccccccccccccccccccc) {\n}");
5488   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
5489                "    ccccccccccccccccccccccccc) {\n}");
5490 
5491   verifyFormat(
5492       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
5493       "    ccccccccccccccccccccccccc) {\n}");
5494   verifyFormat(
5495       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
5496       "    ccccccccccccccccccccccccc) {\n}");
5497 
5498   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
5499                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
5500                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
5501                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
5502   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
5503                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
5504                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
5505                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
5506 
5507   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
5508                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
5509                "    aaaaaaaaaaaaaaa != aa) {\n}");
5510   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
5511                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
5512                "    aaaaaaaaaaaaaaa != aa) {\n}");
5513 }
5514 
5515 TEST_F(FormatTest, BreaksAfterAssignments) {
5516   verifyFormat(
5517       "unsigned Cost =\n"
5518       "    TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
5519       "                        SI->getPointerAddressSpaceee());\n");
5520   verifyFormat(
5521       "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
5522       "    Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
5523 
5524   verifyFormat(
5525       "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
5526       "    aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
5527   verifyFormat("unsigned OriginalStartColumn =\n"
5528                "    SourceMgr.getSpellingColumnNumber(\n"
5529                "        Current.FormatTok.getStartOfNonWhitespace()) -\n"
5530                "    1;");
5531 }
5532 
5533 TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
5534   FormatStyle Style = getLLVMStyle();
5535   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5536                "    bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
5537                Style);
5538 
5539   Style.PenaltyBreakAssignment = 20;
5540   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
5541                "                                 cccccccccccccccccccccccccc;",
5542                Style);
5543 }
5544 
5545 TEST_F(FormatTest, AlignsAfterAssignments) {
5546   verifyFormat(
5547       "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5548       "             aaaaaaaaaaaaaaaaaaaaaaaaa;");
5549   verifyFormat(
5550       "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5551       "          aaaaaaaaaaaaaaaaaaaaaaaaa;");
5552   verifyFormat(
5553       "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5554       "           aaaaaaaaaaaaaaaaaaaaaaaaa;");
5555   verifyFormat(
5556       "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5557       "              aaaaaaaaaaaaaaaaaaaaaaaaa);");
5558   verifyFormat(
5559       "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5560       "                                            aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5561       "                                            aaaaaaaaaaaaaaaaaaaaaaaa;");
5562 }
5563 
5564 TEST_F(FormatTest, AlignsAfterReturn) {
5565   verifyFormat(
5566       "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5567       "       aaaaaaaaaaaaaaaaaaaaaaaaa;");
5568   verifyFormat(
5569       "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5570       "        aaaaaaaaaaaaaaaaaaaaaaaaa);");
5571   verifyFormat(
5572       "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
5573       "       aaaaaaaaaaaaaaaaaaaaaa();");
5574   verifyFormat(
5575       "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
5576       "        aaaaaaaaaaaaaaaaaaaaaa());");
5577   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5578                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5579   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5580                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
5581                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5582   verifyFormat("return\n"
5583                "    // true if code is one of a or b.\n"
5584                "    code == a || code == b;");
5585 }
5586 
5587 TEST_F(FormatTest, AlignsAfterOpenBracket) {
5588   verifyFormat(
5589       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5590       "                                                aaaaaaaaa aaaaaaa) {}");
5591   verifyFormat(
5592       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5593       "                                               aaaaaaaaaaa aaaaaaaaa);");
5594   verifyFormat(
5595       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5596       "                                             aaaaaaaaaaaaaaaaaaaaa));");
5597   FormatStyle Style = getLLVMStyle();
5598   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5599   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5600                "    aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
5601                Style);
5602   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5603                "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
5604                Style);
5605   verifyFormat("SomeLongVariableName->someFunction(\n"
5606                "    foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
5607                Style);
5608   verifyFormat(
5609       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5610       "    aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5611       Style);
5612   verifyFormat(
5613       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5614       "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5615       Style);
5616   verifyFormat(
5617       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5618       "    aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
5619       Style);
5620 
5621   verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
5622                "    ccccccc(aaaaaaaaaaaaaaaaa,         //\n"
5623                "        b));",
5624                Style);
5625 
5626   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5627   Style.BinPackArguments = false;
5628   Style.BinPackParameters = false;
5629   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5630                "    aaaaaaaaaaa aaaaaaaa,\n"
5631                "    aaaaaaaaa aaaaaaa,\n"
5632                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5633                Style);
5634   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5635                "    aaaaaaaaaaa aaaaaaaaa,\n"
5636                "    aaaaaaaaaaa aaaaaaaaa,\n"
5637                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5638                Style);
5639   verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
5640                "    aaaaaaaaaaaaaaa,\n"
5641                "    aaaaaaaaaaaaaaaaaaaaa,\n"
5642                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
5643                Style);
5644   verifyFormat(
5645       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
5646       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5647       Style);
5648   verifyFormat(
5649       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
5650       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5651       Style);
5652   verifyFormat(
5653       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5654       "    aaaaaaaaaaaaaaaaaaaaa(\n"
5655       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
5656       "    aaaaaaaaaaaaaaaa);",
5657       Style);
5658   verifyFormat(
5659       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5660       "    aaaaaaaaaaaaaaaaaaaaa(\n"
5661       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
5662       "    aaaaaaaaaaaaaaaa);",
5663       Style);
5664 }
5665 
5666 TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
5667   FormatStyle Style = getLLVMStyleWithColumns(40);
5668   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5669                "          bbbbbbbbbbbbbbbbbbbbbb);",
5670                Style);
5671   Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
5672   Style.AlignOperands = false;
5673   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5674                "          bbbbbbbbbbbbbbbbbbbbbb);",
5675                Style);
5676   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5677   Style.AlignOperands = true;
5678   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5679                "          bbbbbbbbbbbbbbbbbbbbbb);",
5680                Style);
5681   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5682   Style.AlignOperands = false;
5683   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5684                "    bbbbbbbbbbbbbbbbbbbbbb);",
5685                Style);
5686 }
5687 
5688 TEST_F(FormatTest, BreaksConditionalExpressions) {
5689   verifyFormat(
5690       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5691       "                               ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5692       "                               : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5693   verifyFormat(
5694       "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
5695       "     aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5696       "                                : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5697   verifyFormat(
5698       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5699       "                                   : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5700   verifyFormat("aaaa(aaaaaaaaa, aaaaaaaaa,\n"
5701                "     aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5702                "             : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5703   verifyFormat(
5704       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
5705       "                                                    : aaaaaaaaaaaaa);");
5706   verifyFormat(
5707       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5708       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5709       "                                    : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5710       "                   aaaaaaaaaaaaa);");
5711   verifyFormat(
5712       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5713       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5714       "                   aaaaaaaaaaaaa);");
5715   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5716                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5717                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5718                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5719                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5720   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5721                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5722                "           ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5723                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5724                "           : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5725                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5726                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5727   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5728                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5729                "           ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5730                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5731                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5732   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5733                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5734                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5735   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
5736                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5737                "        ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5738                "        : aaaaaaaaaaaaaaaa;");
5739   verifyFormat(
5740       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5741       "    ? aaaaaaaaaaaaaaa\n"
5742       "    : aaaaaaaaaaaaaaa;");
5743   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
5744                "          aaaaaaaaa\n"
5745                "      ? b\n"
5746                "      : c);");
5747   verifyFormat("return aaaa == bbbb\n"
5748                "           // comment\n"
5749                "           ? aaaa\n"
5750                "           : bbbb;");
5751   verifyFormat("unsigned Indent =\n"
5752                "    format(TheLine.First,\n"
5753                "           IndentForLevel[TheLine.Level] >= 0\n"
5754                "               ? IndentForLevel[TheLine.Level]\n"
5755                "               : TheLine * 2,\n"
5756                "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
5757                getLLVMStyleWithColumns(60));
5758   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5759                "                  ? aaaaaaaaaaaaaaa\n"
5760                "                  : bbbbbbbbbbbbbbb //\n"
5761                "                        ? ccccccccccccccc\n"
5762                "                        : ddddddddddddddd;");
5763   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5764                "                  ? aaaaaaaaaaaaaaa\n"
5765                "                  : (bbbbbbbbbbbbbbb //\n"
5766                "                         ? ccccccccccccccc\n"
5767                "                         : ddddddddddddddd);");
5768   verifyFormat(
5769       "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5770       "                                      ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5771       "                                            aaaaaaaaaaaaaaaaaaaaa +\n"
5772       "                                            aaaaaaaaaaaaaaaaaaaaa\n"
5773       "                                      : aaaaaaaaaa;");
5774   verifyFormat(
5775       "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5776       "                                   : aaaaaaaaaaaaaaaaaaaaaa\n"
5777       "                      : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5778 
5779   FormatStyle NoBinPacking = getLLVMStyle();
5780   NoBinPacking.BinPackArguments = false;
5781   verifyFormat(
5782       "void f() {\n"
5783       "  g(aaa,\n"
5784       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5785       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5786       "        ? aaaaaaaaaaaaaaa\n"
5787       "        : aaaaaaaaaaaaaaa);\n"
5788       "}",
5789       NoBinPacking);
5790   verifyFormat(
5791       "void f() {\n"
5792       "  g(aaa,\n"
5793       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5794       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5795       "        ?: aaaaaaaaaaaaaaa);\n"
5796       "}",
5797       NoBinPacking);
5798 
5799   verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
5800                "             // comment.\n"
5801                "             ccccccccccccccccccccccccccccccccccccccc\n"
5802                "                 ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5803                "                 : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
5804 
5805   // Assignments in conditional expressions. Apparently not uncommon :-(.
5806   verifyFormat("return a != b\n"
5807                "           // comment\n"
5808                "           ? a = b\n"
5809                "           : a = b;");
5810   verifyFormat("return a != b\n"
5811                "           // comment\n"
5812                "           ? a = a != b\n"
5813                "                     // comment\n"
5814                "                     ? a = b\n"
5815                "                     : a\n"
5816                "           : a;\n");
5817   verifyFormat("return a != b\n"
5818                "           // comment\n"
5819                "           ? a\n"
5820                "           : a = a != b\n"
5821                "                     // comment\n"
5822                "                     ? a = b\n"
5823                "                     : a;");
5824 }
5825 
5826 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
5827   FormatStyle Style = getLLVMStyle();
5828   Style.BreakBeforeTernaryOperators = false;
5829   Style.ColumnLimit = 70;
5830   verifyFormat(
5831       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5832       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5833       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5834       Style);
5835   verifyFormat(
5836       "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
5837       "     aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5838       "                                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5839       Style);
5840   verifyFormat(
5841       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5842       "                                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5843       Style);
5844   verifyFormat("aaaa(aaaaaaaa, aaaaaaaaaa,\n"
5845                "     aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5846                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5847                Style);
5848   verifyFormat(
5849       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
5850       "                                                      aaaaaaaaaaaaa);",
5851       Style);
5852   verifyFormat(
5853       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5854       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5855       "                                      aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5856       "                   aaaaaaaaaaaaa);",
5857       Style);
5858   verifyFormat(
5859       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5860       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5861       "                   aaaaaaaaaaaaa);",
5862       Style);
5863   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5864                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5865                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5866                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5867                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5868                Style);
5869   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5870                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5871                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5872                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5873                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5874                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5875                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5876                Style);
5877   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5878                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
5879                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5880                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5881                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5882                Style);
5883   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5884                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5885                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5886                Style);
5887   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
5888                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5889                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5890                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5891                Style);
5892   verifyFormat(
5893       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5894       "    aaaaaaaaaaaaaaa :\n"
5895       "    aaaaaaaaaaaaaaa;",
5896       Style);
5897   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
5898                "          aaaaaaaaa ?\n"
5899                "      b :\n"
5900                "      c);",
5901                Style);
5902   verifyFormat("unsigned Indent =\n"
5903                "    format(TheLine.First,\n"
5904                "           IndentForLevel[TheLine.Level] >= 0 ?\n"
5905                "               IndentForLevel[TheLine.Level] :\n"
5906                "               TheLine * 2,\n"
5907                "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
5908                Style);
5909   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5910                "                  aaaaaaaaaaaaaaa :\n"
5911                "                  bbbbbbbbbbbbbbb ? //\n"
5912                "                      ccccccccccccccc :\n"
5913                "                      ddddddddddddddd;",
5914                Style);
5915   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5916                "                  aaaaaaaaaaaaaaa :\n"
5917                "                  (bbbbbbbbbbbbbbb ? //\n"
5918                "                       ccccccccccccccc :\n"
5919                "                       ddddddddddddddd);",
5920                Style);
5921   verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5922                "            /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
5923                "            ccccccccccccccccccccccccccc;",
5924                Style);
5925   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5926                "           aaaaa :\n"
5927                "           bbbbbbbbbbbbbbb + cccccccccccccccc;",
5928                Style);
5929 }
5930 
5931 TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
5932   verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
5933                "     aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
5934   verifyFormat("bool a = true, b = false;");
5935 
5936   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5937                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
5938                "     bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
5939                "         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
5940   verifyFormat(
5941       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
5942       "         bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
5943       "     d = e && f;");
5944   verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
5945                "          c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
5946   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5947                "          *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
5948   verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
5949                "          ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
5950 
5951   FormatStyle Style = getGoogleStyle();
5952   Style.PointerAlignment = FormatStyle::PAS_Left;
5953   Style.DerivePointerAlignment = false;
5954   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5955                "    *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
5956                "    *b = bbbbbbbbbbbbbbbbbbb;",
5957                Style);
5958   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5959                "          *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
5960                Style);
5961   verifyFormat("vector<int*> a, b;", Style);
5962   verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
5963 }
5964 
5965 TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
5966   verifyFormat("arr[foo ? bar : baz];");
5967   verifyFormat("f()[foo ? bar : baz];");
5968   verifyFormat("(a + b)[foo ? bar : baz];");
5969   verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
5970 }
5971 
5972 TEST_F(FormatTest, AlignsStringLiterals) {
5973   verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
5974                "                                      \"short literal\");");
5975   verifyFormat(
5976       "looooooooooooooooooooooooongFunction(\n"
5977       "    \"short literal\"\n"
5978       "    \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
5979   verifyFormat("someFunction(\"Always break between multi-line\"\n"
5980                "             \" string literals\",\n"
5981                "             and, other, parameters);");
5982   EXPECT_EQ("fun + \"1243\" /* comment */\n"
5983             "      \"5678\";",
5984             format("fun + \"1243\" /* comment */\n"
5985                    "    \"5678\";",
5986                    getLLVMStyleWithColumns(28)));
5987   EXPECT_EQ(
5988       "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
5989       "         \"aaaaaaaaaaaaaaaaaaaaa\"\n"
5990       "         \"aaaaaaaaaaaaaaaa\";",
5991       format("aaaaaa ="
5992              "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
5993              "aaaaaaaaaaaaaaaaaaaaa\" "
5994              "\"aaaaaaaaaaaaaaaa\";"));
5995   verifyFormat("a = a + \"a\"\n"
5996                "        \"a\"\n"
5997                "        \"a\";");
5998   verifyFormat("f(\"a\", \"b\"\n"
5999                "       \"c\");");
6000 
6001   verifyFormat(
6002       "#define LL_FORMAT \"ll\"\n"
6003       "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
6004       "       \"d, ddddddddd: %\" LL_FORMAT \"d\");");
6005 
6006   verifyFormat("#define A(X)          \\\n"
6007                "  \"aaaaa\" #X \"bbbbbb\" \\\n"
6008                "  \"ccccc\"",
6009                getLLVMStyleWithColumns(23));
6010   verifyFormat("#define A \"def\"\n"
6011                "f(\"abc\" A \"ghi\"\n"
6012                "  \"jkl\");");
6013 
6014   verifyFormat("f(L\"a\"\n"
6015                "  L\"b\");");
6016   verifyFormat("#define A(X)            \\\n"
6017                "  L\"aaaaa\" #X L\"bbbbbb\" \\\n"
6018                "  L\"ccccc\"",
6019                getLLVMStyleWithColumns(25));
6020 
6021   verifyFormat("f(@\"a\"\n"
6022                "  @\"b\");");
6023   verifyFormat("NSString s = @\"a\"\n"
6024                "             @\"b\"\n"
6025                "             @\"c\";");
6026   verifyFormat("NSString s = @\"a\"\n"
6027                "              \"b\"\n"
6028                "              \"c\";");
6029 }
6030 
6031 TEST_F(FormatTest, ReturnTypeBreakingStyle) {
6032   FormatStyle Style = getLLVMStyle();
6033   // No declarations or definitions should be moved to own line.
6034   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
6035   verifyFormat("class A {\n"
6036                "  int f() { return 1; }\n"
6037                "  int g();\n"
6038                "};\n"
6039                "int f() { return 1; }\n"
6040                "int g();\n",
6041                Style);
6042 
6043   // All declarations and definitions should have the return type moved to its
6044   // own
6045   // line.
6046   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
6047   verifyFormat("class E {\n"
6048                "  int\n"
6049                "  f() {\n"
6050                "    return 1;\n"
6051                "  }\n"
6052                "  int\n"
6053                "  g();\n"
6054                "};\n"
6055                "int\n"
6056                "f() {\n"
6057                "  return 1;\n"
6058                "}\n"
6059                "int\n"
6060                "g();\n",
6061                Style);
6062 
6063   // Top-level definitions, and no kinds of declarations should have the
6064   // return type moved to its own line.
6065   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
6066   verifyFormat("class B {\n"
6067                "  int f() { return 1; }\n"
6068                "  int g();\n"
6069                "};\n"
6070                "int\n"
6071                "f() {\n"
6072                "  return 1;\n"
6073                "}\n"
6074                "int g();\n",
6075                Style);
6076 
6077   // Top-level definitions and declarations should have the return type moved
6078   // to its own line.
6079   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
6080   verifyFormat("class C {\n"
6081                "  int f() { return 1; }\n"
6082                "  int g();\n"
6083                "};\n"
6084                "int\n"
6085                "f() {\n"
6086                "  return 1;\n"
6087                "}\n"
6088                "int\n"
6089                "g();\n",
6090                Style);
6091 
6092   // All definitions should have the return type moved to its own line, but no
6093   // kinds of declarations.
6094   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
6095   verifyFormat("class D {\n"
6096                "  int\n"
6097                "  f() {\n"
6098                "    return 1;\n"
6099                "  }\n"
6100                "  int g();\n"
6101                "};\n"
6102                "int\n"
6103                "f() {\n"
6104                "  return 1;\n"
6105                "}\n"
6106                "int g();\n",
6107                Style);
6108   verifyFormat("const char *\n"
6109                "f(void) {\n" // Break here.
6110                "  return \"\";\n"
6111                "}\n"
6112                "const char *bar(void);\n", // No break here.
6113                Style);
6114   verifyFormat("template <class T>\n"
6115                "T *\n"
6116                "f(T &c) {\n" // Break here.
6117                "  return NULL;\n"
6118                "}\n"
6119                "template <class T> T *f(T &c);\n", // No break here.
6120                Style);
6121   verifyFormat("class C {\n"
6122                "  int\n"
6123                "  operator+() {\n"
6124                "    return 1;\n"
6125                "  }\n"
6126                "  int\n"
6127                "  operator()() {\n"
6128                "    return 1;\n"
6129                "  }\n"
6130                "};\n",
6131                Style);
6132   verifyFormat("void\n"
6133                "A::operator()() {}\n"
6134                "void\n"
6135                "A::operator>>() {}\n"
6136                "void\n"
6137                "A::operator+() {}\n"
6138                "void\n"
6139                "A::operator*() {}\n"
6140                "void\n"
6141                "A::operator->() {}\n"
6142                "void\n"
6143                "A::operator void *() {}\n"
6144                "void\n"
6145                "A::operator void &() {}\n"
6146                "void\n"
6147                "A::operator void &&() {}\n"
6148                "void\n"
6149                "A::operator char *() {}\n"
6150                "void\n"
6151                "A::operator[]() {}\n"
6152                "void\n"
6153                "A::operator!() {}\n",
6154                Style);
6155   verifyFormat("constexpr auto\n"
6156                "operator()() const -> reference {}\n"
6157                "constexpr auto\n"
6158                "operator>>() const -> reference {}\n"
6159                "constexpr auto\n"
6160                "operator+() const -> reference {}\n"
6161                "constexpr auto\n"
6162                "operator*() const -> reference {}\n"
6163                "constexpr auto\n"
6164                "operator->() const -> reference {}\n"
6165                "constexpr auto\n"
6166                "operator++() const -> reference {}\n"
6167                "constexpr auto\n"
6168                "operator void *() const -> reference {}\n"
6169                "constexpr auto\n"
6170                "operator void &() const -> reference {}\n"
6171                "constexpr auto\n"
6172                "operator void &&() const -> reference {}\n"
6173                "constexpr auto\n"
6174                "operator char *() const -> reference {}\n"
6175                "constexpr auto\n"
6176                "operator!() const -> reference {}\n"
6177                "constexpr auto\n"
6178                "operator[]() const -> reference {}\n",
6179                Style);
6180   verifyFormat("void *operator new(std::size_t s);", // No break here.
6181                Style);
6182   verifyFormat("void *\n"
6183                "operator new(std::size_t s) {}",
6184                Style);
6185   verifyFormat("void *\n"
6186                "operator delete[](void *ptr) {}",
6187                Style);
6188   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
6189   verifyFormat("const char *\n"
6190                "f(void)\n" // Break here.
6191                "{\n"
6192                "  return \"\";\n"
6193                "}\n"
6194                "const char *bar(void);\n", // No break here.
6195                Style);
6196   verifyFormat("template <class T>\n"
6197                "T *\n"     // Problem here: no line break
6198                "f(T &c)\n" // Break here.
6199                "{\n"
6200                "  return NULL;\n"
6201                "}\n"
6202                "template <class T> T *f(T &c);\n", // No break here.
6203                Style);
6204   verifyFormat("int\n"
6205                "foo(A<bool> a)\n"
6206                "{\n"
6207                "  return a;\n"
6208                "}\n",
6209                Style);
6210   verifyFormat("int\n"
6211                "foo(A<8> a)\n"
6212                "{\n"
6213                "  return a;\n"
6214                "}\n",
6215                Style);
6216   verifyFormat("int\n"
6217                "foo(A<B<bool>, 8> a)\n"
6218                "{\n"
6219                "  return a;\n"
6220                "}\n",
6221                Style);
6222   verifyFormat("int\n"
6223                "foo(A<B<8>, bool> a)\n"
6224                "{\n"
6225                "  return a;\n"
6226                "}\n",
6227                Style);
6228   verifyFormat("int\n"
6229                "foo(A<B<bool>, bool> a)\n"
6230                "{\n"
6231                "  return a;\n"
6232                "}\n",
6233                Style);
6234   verifyFormat("int\n"
6235                "foo(A<B<8>, 8> a)\n"
6236                "{\n"
6237                "  return a;\n"
6238                "}\n",
6239                Style);
6240 
6241   Style = getGNUStyle();
6242 
6243   // Test for comments at the end of function declarations.
6244   verifyFormat("void\n"
6245                "foo (int a, /*abc*/ int b) // def\n"
6246                "{\n"
6247                "}\n",
6248                Style);
6249 
6250   verifyFormat("void\n"
6251                "foo (int a, /* abc */ int b) /* def */\n"
6252                "{\n"
6253                "}\n",
6254                Style);
6255 
6256   // Definitions that should not break after return type
6257   verifyFormat("void foo (int a, int b); // def\n", Style);
6258   verifyFormat("void foo (int a, int b); /* def */\n", Style);
6259   verifyFormat("void foo (int a, int b);\n", Style);
6260 }
6261 
6262 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
6263   FormatStyle NoBreak = getLLVMStyle();
6264   NoBreak.AlwaysBreakBeforeMultilineStrings = false;
6265   FormatStyle Break = getLLVMStyle();
6266   Break.AlwaysBreakBeforeMultilineStrings = true;
6267   verifyFormat("aaaa = \"bbbb\"\n"
6268                "       \"cccc\";",
6269                NoBreak);
6270   verifyFormat("aaaa =\n"
6271                "    \"bbbb\"\n"
6272                "    \"cccc\";",
6273                Break);
6274   verifyFormat("aaaa(\"bbbb\"\n"
6275                "     \"cccc\");",
6276                NoBreak);
6277   verifyFormat("aaaa(\n"
6278                "    \"bbbb\"\n"
6279                "    \"cccc\");",
6280                Break);
6281   verifyFormat("aaaa(qqq, \"bbbb\"\n"
6282                "          \"cccc\");",
6283                NoBreak);
6284   verifyFormat("aaaa(qqq,\n"
6285                "     \"bbbb\"\n"
6286                "     \"cccc\");",
6287                Break);
6288   verifyFormat("aaaa(qqq,\n"
6289                "     L\"bbbb\"\n"
6290                "     L\"cccc\");",
6291                Break);
6292   verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
6293                "                      \"bbbb\"));",
6294                Break);
6295   verifyFormat("string s = someFunction(\n"
6296                "    \"abc\"\n"
6297                "    \"abc\");",
6298                Break);
6299 
6300   // As we break before unary operators, breaking right after them is bad.
6301   verifyFormat("string foo = abc ? \"x\"\n"
6302                "                   \"blah blah blah blah blah blah\"\n"
6303                "                 : \"y\";",
6304                Break);
6305 
6306   // Don't break if there is no column gain.
6307   verifyFormat("f(\"aaaa\"\n"
6308                "  \"bbbb\");",
6309                Break);
6310 
6311   // Treat literals with escaped newlines like multi-line string literals.
6312   EXPECT_EQ("x = \"a\\\n"
6313             "b\\\n"
6314             "c\";",
6315             format("x = \"a\\\n"
6316                    "b\\\n"
6317                    "c\";",
6318                    NoBreak));
6319   EXPECT_EQ("xxxx =\n"
6320             "    \"a\\\n"
6321             "b\\\n"
6322             "c\";",
6323             format("xxxx = \"a\\\n"
6324                    "b\\\n"
6325                    "c\";",
6326                    Break));
6327 
6328   EXPECT_EQ("NSString *const kString =\n"
6329             "    @\"aaaa\"\n"
6330             "    @\"bbbb\";",
6331             format("NSString *const kString = @\"aaaa\"\n"
6332                    "@\"bbbb\";",
6333                    Break));
6334 
6335   Break.ColumnLimit = 0;
6336   verifyFormat("const char *hello = \"hello llvm\";", Break);
6337 }
6338 
6339 TEST_F(FormatTest, AlignsPipes) {
6340   verifyFormat(
6341       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6342       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6343       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6344   verifyFormat(
6345       "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
6346       "                     << aaaaaaaaaaaaaaaaaaaa;");
6347   verifyFormat(
6348       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6349       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6350   verifyFormat(
6351       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
6352       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6353   verifyFormat(
6354       "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
6355       "                \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
6356       "             << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
6357   verifyFormat(
6358       "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6359       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6360       "         << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6361   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6362                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6363                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6364                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
6365   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
6366                "             << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
6367   verifyFormat(
6368       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6369       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6370   verifyFormat(
6371       "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
6372       "                                       aaaaaaaaaaaaaaaaaaaaaaaaaa);");
6373 
6374   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
6375                "             << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
6376   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6377                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6378                "                    aaaaaaaaaaaaaaaaaaaaa)\n"
6379                "             << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
6380   verifyFormat("LOG_IF(aaa == //\n"
6381                "       bbb)\n"
6382                "    << a << b;");
6383 
6384   // But sometimes, breaking before the first "<<" is desirable.
6385   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
6386                "    << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
6387   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
6388                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6389                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6390   verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
6391                "    << BEF << IsTemplate << Description << E->getType();");
6392   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
6393                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6394                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6395   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
6396                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6397                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6398                "    << aaa;");
6399 
6400   verifyFormat(
6401       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6402       "                    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6403 
6404   // Incomplete string literal.
6405   EXPECT_EQ("llvm::errs() << \"\n"
6406             "             << a;",
6407             format("llvm::errs() << \"\n<<a;"));
6408 
6409   verifyFormat("void f() {\n"
6410                "  CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
6411                "      << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
6412                "}");
6413 
6414   // Handle 'endl'.
6415   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
6416                "             << bbbbbbbbbbbbbbbbbbbbbb << endl;");
6417   verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
6418 
6419   // Handle '\n'.
6420   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
6421                "             << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
6422   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
6423                "             << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
6424   verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
6425                "             << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
6426   verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
6427 }
6428 
6429 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
6430   verifyFormat("return out << \"somepacket = {\\n\"\n"
6431                "           << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
6432                "           << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
6433                "           << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
6434                "           << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
6435                "           << \"}\";");
6436 
6437   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
6438                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
6439                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
6440   verifyFormat(
6441       "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
6442       "             << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
6443       "             << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
6444       "             << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
6445       "             << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
6446   verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
6447                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
6448   verifyFormat(
6449       "void f() {\n"
6450       "  llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
6451       "               << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
6452       "}");
6453 
6454   // Breaking before the first "<<" is generally not desirable.
6455   verifyFormat(
6456       "llvm::errs()\n"
6457       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6458       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6459       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6460       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
6461       getLLVMStyleWithColumns(70));
6462   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
6463                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6464                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
6465                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6466                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
6467                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
6468                getLLVMStyleWithColumns(70));
6469 
6470   verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
6471                "           \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
6472                "           \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
6473   verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
6474                "                  \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
6475                "                  \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
6476   verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
6477                "           (aaaa + aaaa);",
6478                getLLVMStyleWithColumns(40));
6479   verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
6480                "                  (aaaaaaa + aaaaa));",
6481                getLLVMStyleWithColumns(40));
6482   verifyFormat(
6483       "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
6484       "                  SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
6485       "                  bbbbbbbbbbbbbbbbbbbbbbb);");
6486 }
6487 
6488 TEST_F(FormatTest, UnderstandsEquals) {
6489   verifyFormat(
6490       "aaaaaaaaaaaaaaaaa =\n"
6491       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6492   verifyFormat(
6493       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6494       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
6495   verifyFormat(
6496       "if (a) {\n"
6497       "  f();\n"
6498       "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6499       "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
6500       "}");
6501 
6502   verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6503                "        100000000 + 10000000) {\n}");
6504 }
6505 
6506 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
6507   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
6508                "    .looooooooooooooooooooooooooooooooooooooongFunction();");
6509 
6510   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
6511                "    ->looooooooooooooooooooooooooooooooooooooongFunction();");
6512 
6513   verifyFormat(
6514       "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
6515       "                                                          Parameter2);");
6516 
6517   verifyFormat(
6518       "ShortObject->shortFunction(\n"
6519       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
6520       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
6521 
6522   verifyFormat("loooooooooooooongFunction(\n"
6523                "    LoooooooooooooongObject->looooooooooooooooongFunction());");
6524 
6525   verifyFormat(
6526       "function(LoooooooooooooooooooooooooooooooooooongObject\n"
6527       "             ->loooooooooooooooooooooooooooooooooooooooongFunction());");
6528 
6529   verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
6530                "    .WillRepeatedly(Return(SomeValue));");
6531   verifyFormat("void f() {\n"
6532                "  EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
6533                "      .Times(2)\n"
6534                "      .WillRepeatedly(Return(SomeValue));\n"
6535                "}");
6536   verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
6537                "    ccccccccccccccccccccccc);");
6538   verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6539                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6540                "          .aaaaa(aaaaa),\n"
6541                "      aaaaaaaaaaaaaaaaaaaaa);");
6542   verifyFormat("void f() {\n"
6543                "  aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6544                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
6545                "}");
6546   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6547                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6548                "    .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6549                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6550                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
6551   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6552                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6553                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6554                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
6555                "}");
6556 
6557   // Here, it is not necessary to wrap at "." or "->".
6558   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
6559                "    aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
6560   verifyFormat(
6561       "aaaaaaaaaaa->aaaaaaaaa(\n"
6562       "    aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6563       "    aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
6564 
6565   verifyFormat(
6566       "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6567       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
6568   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
6569                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
6570   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
6571                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
6572 
6573   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6574                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6575                "    .a();");
6576 
6577   FormatStyle NoBinPacking = getLLVMStyle();
6578   NoBinPacking.BinPackParameters = false;
6579   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
6580                "    .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
6581                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
6582                "                         aaaaaaaaaaaaaaaaaaa,\n"
6583                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6584                NoBinPacking);
6585 
6586   // If there is a subsequent call, change to hanging indentation.
6587   verifyFormat(
6588       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6589       "                         aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
6590       "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6591   verifyFormat(
6592       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6593       "    aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
6594   verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6595                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6596                "                 .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6597   verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6598                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6599                "               .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
6600 }
6601 
6602 TEST_F(FormatTest, WrapsTemplateDeclarations) {
6603   verifyFormat("template <typename T>\n"
6604                "virtual void loooooooooooongFunction(int Param1, int Param2);");
6605   verifyFormat("template <typename T>\n"
6606                "// T should be one of {A, B}.\n"
6607                "virtual void loooooooooooongFunction(int Param1, int Param2);");
6608   verifyFormat(
6609       "template <typename T>\n"
6610       "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
6611   verifyFormat("template <typename T>\n"
6612                "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
6613                "       int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
6614   verifyFormat(
6615       "template <typename T>\n"
6616       "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
6617       "                                      int Paaaaaaaaaaaaaaaaaaaaram2);");
6618   verifyFormat(
6619       "template <typename T>\n"
6620       "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
6621       "                    aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
6622       "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6623   verifyFormat("template <typename T>\n"
6624                "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6625                "    int aaaaaaaaaaaaaaaaaaaaaa);");
6626   verifyFormat(
6627       "template <typename T1, typename T2 = char, typename T3 = char,\n"
6628       "          typename T4 = char>\n"
6629       "void f();");
6630   verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
6631                "          template <typename> class cccccccccccccccccccccc,\n"
6632                "          typename ddddddddddddd>\n"
6633                "class C {};");
6634   verifyFormat(
6635       "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
6636       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6637 
6638   verifyFormat("void f() {\n"
6639                "  a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
6640                "      a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
6641                "}");
6642 
6643   verifyFormat("template <typename T> class C {};");
6644   verifyFormat("template <typename T> void f();");
6645   verifyFormat("template <typename T> void f() {}");
6646   verifyFormat(
6647       "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
6648       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6649       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
6650       "    new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
6651       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6652       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
6653       "        bbbbbbbbbbbbbbbbbbbbbbbb);",
6654       getLLVMStyleWithColumns(72));
6655   EXPECT_EQ("static_cast<A< //\n"
6656             "    B> *>(\n"
6657             "\n"
6658             ");",
6659             format("static_cast<A<//\n"
6660                    "    B>*>(\n"
6661                    "\n"
6662                    "    );"));
6663   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6664                "    const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
6665 
6666   FormatStyle AlwaysBreak = getLLVMStyle();
6667   AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
6668   verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
6669   verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
6670   verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
6671   verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6672                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
6673                "    ccccccccccccccccccccccccccccccccccccccccccccccc);");
6674   verifyFormat("template <template <typename> class Fooooooo,\n"
6675                "          template <typename> class Baaaaaaar>\n"
6676                "struct C {};",
6677                AlwaysBreak);
6678   verifyFormat("template <typename T> // T can be A, B or C.\n"
6679                "struct C {};",
6680                AlwaysBreak);
6681   verifyFormat("template <enum E> class A {\n"
6682                "public:\n"
6683                "  E *f();\n"
6684                "};");
6685 
6686   FormatStyle NeverBreak = getLLVMStyle();
6687   NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No;
6688   verifyFormat("template <typename T> class C {};", NeverBreak);
6689   verifyFormat("template <typename T> void f();", NeverBreak);
6690   verifyFormat("template <typename T> void f() {}", NeverBreak);
6691   verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa "
6692                "bbbbbbbbbbbbbbbbbbbb) {}",
6693                NeverBreak);
6694   verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6695                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
6696                "    ccccccccccccccccccccccccccccccccccccccccccccccc);",
6697                NeverBreak);
6698   verifyFormat("template <template <typename> class Fooooooo,\n"
6699                "          template <typename> class Baaaaaaar>\n"
6700                "struct C {};",
6701                NeverBreak);
6702   verifyFormat("template <typename T> // T can be A, B or C.\n"
6703                "struct C {};",
6704                NeverBreak);
6705   verifyFormat("template <enum E> class A {\n"
6706                "public:\n"
6707                "  E *f();\n"
6708                "};",
6709                NeverBreak);
6710   NeverBreak.PenaltyBreakTemplateDeclaration = 100;
6711   verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa "
6712                "bbbbbbbbbbbbbbbbbbbb) {}",
6713                NeverBreak);
6714 }
6715 
6716 TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) {
6717   FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
6718   Style.ColumnLimit = 60;
6719   EXPECT_EQ("// Baseline - no comments.\n"
6720             "template <\n"
6721             "    typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
6722             "void f() {}",
6723             format("// Baseline - no comments.\n"
6724                    "template <\n"
6725                    "    typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
6726                    "void f() {}",
6727                    Style));
6728 
6729   EXPECT_EQ("template <\n"
6730             "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  // trailing\n"
6731             "void f() {}",
6732             format("template <\n"
6733                    "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
6734                    "void f() {}",
6735                    Style));
6736 
6737   EXPECT_EQ(
6738       "template <\n"
6739       "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n"
6740       "void f() {}",
6741       format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  /* line */\n"
6742              "void f() {}",
6743              Style));
6744 
6745   EXPECT_EQ(
6746       "template <\n"
6747       "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  // trailing\n"
6748       "                                               // multiline\n"
6749       "void f() {}",
6750       format("template <\n"
6751              "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
6752              "                                              // multiline\n"
6753              "void f() {}",
6754              Style));
6755 
6756   EXPECT_EQ(
6757       "template <typename aaaaaaaaaa<\n"
6758       "    bbbbbbbbbbbb>::value>  // trailing loooong\n"
6759       "void f() {}",
6760       format(
6761           "template <\n"
6762           "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n"
6763           "void f() {}",
6764           Style));
6765 }
6766 
6767 TEST_F(FormatTest, WrapsTemplateParameters) {
6768   FormatStyle Style = getLLVMStyle();
6769   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
6770   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
6771   verifyFormat(
6772       "template <typename... a> struct q {};\n"
6773       "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
6774       "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
6775       "    y;",
6776       Style);
6777   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
6778   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
6779   verifyFormat(
6780       "template <typename... a> struct r {};\n"
6781       "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
6782       "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
6783       "    y;",
6784       Style);
6785   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
6786   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
6787   verifyFormat("template <typename... a> struct s {};\n"
6788                "extern s<\n"
6789                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
6790                "aaaaaaaaaaaaaaaaaaaaaa,\n"
6791                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
6792                "aaaaaaaaaaaaaaaaaaaaaa>\n"
6793                "    y;",
6794                Style);
6795   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
6796   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
6797   verifyFormat("template <typename... a> struct t {};\n"
6798                "extern t<\n"
6799                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
6800                "aaaaaaaaaaaaaaaaaaaaaa,\n"
6801                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
6802                "aaaaaaaaaaaaaaaaaaaaaa>\n"
6803                "    y;",
6804                Style);
6805 }
6806 
6807 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
6808   verifyFormat(
6809       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6810       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6811   verifyFormat(
6812       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6813       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6814       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
6815 
6816   // FIXME: Should we have the extra indent after the second break?
6817   verifyFormat(
6818       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6819       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6820       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6821 
6822   verifyFormat(
6823       "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
6824       "                    cccccccccccccccccccccccccccccccccccccccccccccc());");
6825 
6826   // Breaking at nested name specifiers is generally not desirable.
6827   verifyFormat(
6828       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6829       "    aaaaaaaaaaaaaaaaaaaaaaa);");
6830 
6831   verifyFormat("aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
6832                "                   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6833                "                       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6834                "                   aaaaaaaaaaaaaaaaaaaaa);",
6835                getLLVMStyleWithColumns(74));
6836 
6837   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6838                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6839                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6840 }
6841 
6842 TEST_F(FormatTest, UnderstandsTemplateParameters) {
6843   verifyFormat("A<int> a;");
6844   verifyFormat("A<A<A<int>>> a;");
6845   verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
6846   verifyFormat("bool x = a < 1 || 2 > a;");
6847   verifyFormat("bool x = 5 < f<int>();");
6848   verifyFormat("bool x = f<int>() > 5;");
6849   verifyFormat("bool x = 5 < a<int>::x;");
6850   verifyFormat("bool x = a < 4 ? a > 2 : false;");
6851   verifyFormat("bool x = f() ? a < 2 : a > 2;");
6852 
6853   verifyGoogleFormat("A<A<int>> a;");
6854   verifyGoogleFormat("A<A<A<int>>> a;");
6855   verifyGoogleFormat("A<A<A<A<int>>>> a;");
6856   verifyGoogleFormat("A<A<int> > a;");
6857   verifyGoogleFormat("A<A<A<int> > > a;");
6858   verifyGoogleFormat("A<A<A<A<int> > > > a;");
6859   verifyGoogleFormat("A<::A<int>> a;");
6860   verifyGoogleFormat("A<::A> a;");
6861   verifyGoogleFormat("A< ::A> a;");
6862   verifyGoogleFormat("A< ::A<int> > a;");
6863   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
6864   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
6865   EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
6866   EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
6867   EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
6868             format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
6869 
6870   verifyFormat("A<A<int>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
6871 
6872   // template closer followed by a token that starts with > or =
6873   verifyFormat("bool b = a<1> > 1;");
6874   verifyFormat("bool b = a<1> >= 1;");
6875   verifyFormat("int i = a<1> >> 1;");
6876   FormatStyle Style = getLLVMStyle();
6877   Style.SpaceBeforeAssignmentOperators = false;
6878   verifyFormat("bool b= a<1> == 1;", Style);
6879   verifyFormat("a<int> = 1;", Style);
6880   verifyFormat("a<int> >>= 1;", Style);
6881 
6882   verifyFormat("test >> a >> b;");
6883   verifyFormat("test << a >> b;");
6884 
6885   verifyFormat("f<int>();");
6886   verifyFormat("template <typename T> void f() {}");
6887   verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
6888   verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
6889                "sizeof(char)>::type>;");
6890   verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
6891   verifyFormat("f(a.operator()<A>());");
6892   verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6893                "      .template operator()<A>());",
6894                getLLVMStyleWithColumns(35));
6895 
6896   // Not template parameters.
6897   verifyFormat("return a < b && c > d;");
6898   verifyFormat("void f() {\n"
6899                "  while (a < b && c > d) {\n"
6900                "  }\n"
6901                "}");
6902   verifyFormat("template <typename... Types>\n"
6903                "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
6904 
6905   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6906                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
6907                getLLVMStyleWithColumns(60));
6908   verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
6909   verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
6910   verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
6911 }
6912 
6913 TEST_F(FormatTest, BitshiftOperatorWidth) {
6914   EXPECT_EQ("int a = 1 << 2; /* foo\n"
6915             "                   bar */",
6916             format("int    a=1<<2;  /* foo\n"
6917                    "                   bar */"));
6918 
6919   EXPECT_EQ("int b = 256 >> 1; /* foo\n"
6920             "                     bar */",
6921             format("int  b  =256>>1 ;  /* foo\n"
6922                    "                      bar */"));
6923 }
6924 
6925 TEST_F(FormatTest, UnderstandsBinaryOperators) {
6926   verifyFormat("COMPARE(a, ==, b);");
6927   verifyFormat("auto s = sizeof...(Ts) - 1;");
6928 }
6929 
6930 TEST_F(FormatTest, UnderstandsPointersToMembers) {
6931   verifyFormat("int A::*x;");
6932   verifyFormat("int (S::*func)(void *);");
6933   verifyFormat("void f() { int (S::*func)(void *); }");
6934   verifyFormat("typedef bool *(Class::*Member)() const;");
6935   verifyFormat("void f() {\n"
6936                "  (a->*f)();\n"
6937                "  a->*x;\n"
6938                "  (a.*f)();\n"
6939                "  ((*a).*f)();\n"
6940                "  a.*x;\n"
6941                "}");
6942   verifyFormat("void f() {\n"
6943                "  (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
6944                "      aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
6945                "}");
6946   verifyFormat(
6947       "(aaaaaaaaaa->*bbbbbbb)(\n"
6948       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
6949   FormatStyle Style = getLLVMStyle();
6950   Style.PointerAlignment = FormatStyle::PAS_Left;
6951   verifyFormat("typedef bool* (Class::*Member)() const;", Style);
6952 }
6953 
6954 TEST_F(FormatTest, UnderstandsUnaryOperators) {
6955   verifyFormat("int a = -2;");
6956   verifyFormat("f(-1, -2, -3);");
6957   verifyFormat("a[-1] = 5;");
6958   verifyFormat("int a = 5 + -2;");
6959   verifyFormat("if (i == -1) {\n}");
6960   verifyFormat("if (i != -1) {\n}");
6961   verifyFormat("if (i > -1) {\n}");
6962   verifyFormat("if (i < -1) {\n}");
6963   verifyFormat("++(a->f());");
6964   verifyFormat("--(a->f());");
6965   verifyFormat("(a->f())++;");
6966   verifyFormat("a[42]++;");
6967   verifyFormat("if (!(a->f())) {\n}");
6968   verifyFormat("if (!+i) {\n}");
6969   verifyFormat("~&a;");
6970 
6971   verifyFormat("a-- > b;");
6972   verifyFormat("b ? -a : c;");
6973   verifyFormat("n * sizeof char16;");
6974   verifyFormat("n * alignof char16;", getGoogleStyle());
6975   verifyFormat("sizeof(char);");
6976   verifyFormat("alignof(char);", getGoogleStyle());
6977 
6978   verifyFormat("return -1;");
6979   verifyFormat("throw -1;");
6980   verifyFormat("switch (a) {\n"
6981                "case -1:\n"
6982                "  break;\n"
6983                "}");
6984   verifyFormat("#define X -1");
6985   verifyFormat("#define X -kConstant");
6986 
6987   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
6988   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
6989 
6990   verifyFormat("int a = /* confusing comment */ -1;");
6991   // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
6992   verifyFormat("int a = i /* confusing comment */++;");
6993 
6994   verifyFormat("co_yield -1;");
6995   verifyFormat("co_return -1;");
6996 }
6997 
6998 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
6999   verifyFormat("if (!aaaaaaaaaa( // break\n"
7000                "        aaaaa)) {\n"
7001                "}");
7002   verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
7003                "    aaaaa));");
7004   verifyFormat("*aaa = aaaaaaa( // break\n"
7005                "    bbbbbb);");
7006 }
7007 
7008 TEST_F(FormatTest, UnderstandsOverloadedOperators) {
7009   verifyFormat("bool operator<();");
7010   verifyFormat("bool operator>();");
7011   verifyFormat("bool operator=();");
7012   verifyFormat("bool operator==();");
7013   verifyFormat("bool operator!=();");
7014   verifyFormat("int operator+();");
7015   verifyFormat("int operator++();");
7016   verifyFormat("int operator++(int) volatile noexcept;");
7017   verifyFormat("bool operator,();");
7018   verifyFormat("bool operator();");
7019   verifyFormat("bool operator()();");
7020   verifyFormat("bool operator[]();");
7021   verifyFormat("operator bool();");
7022   verifyFormat("operator int();");
7023   verifyFormat("operator void *();");
7024   verifyFormat("operator SomeType<int>();");
7025   verifyFormat("operator SomeType<int, int>();");
7026   verifyFormat("operator SomeType<SomeType<int>>();");
7027   verifyFormat("void *operator new(std::size_t size);");
7028   verifyFormat("void *operator new[](std::size_t size);");
7029   verifyFormat("void operator delete(void *ptr);");
7030   verifyFormat("void operator delete[](void *ptr);");
7031   verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
7032                "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
7033   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
7034                "    aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
7035 
7036   verifyFormat(
7037       "ostream &operator<<(ostream &OutputStream,\n"
7038       "                    SomeReallyLongType WithSomeReallyLongValue);");
7039   verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
7040                "               const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
7041                "  return left.group < right.group;\n"
7042                "}");
7043   verifyFormat("SomeType &operator=(const SomeType &S);");
7044   verifyFormat("f.template operator()<int>();");
7045 
7046   verifyGoogleFormat("operator void*();");
7047   verifyGoogleFormat("operator SomeType<SomeType<int>>();");
7048   verifyGoogleFormat("operator ::A();");
7049 
7050   verifyFormat("using A::operator+;");
7051   verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
7052                "int i;");
7053 }
7054 
7055 TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
7056   verifyFormat("Deleted &operator=(const Deleted &) & = default;");
7057   verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
7058   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
7059   verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
7060   verifyFormat("Deleted &operator=(const Deleted &) &;");
7061   verifyFormat("Deleted &operator=(const Deleted &) &&;");
7062   verifyFormat("SomeType MemberFunction(const Deleted &) &;");
7063   verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
7064   verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
7065   verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
7066   verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
7067   verifyFormat("void Fn(T const &) const &;");
7068   verifyFormat("void Fn(T const volatile &&) const volatile &&;");
7069   verifyFormat("template <typename T>\n"
7070                "void F(T) && = delete;",
7071                getGoogleStyle());
7072 
7073   FormatStyle AlignLeft = getLLVMStyle();
7074   AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
7075   verifyFormat("void A::b() && {}", AlignLeft);
7076   verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
7077   verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
7078                AlignLeft);
7079   verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
7080   verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
7081   verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
7082   verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
7083   verifyFormat("auto Function(T) & -> void {}", AlignLeft);
7084   verifyFormat("auto Function(T) & -> void;", AlignLeft);
7085   verifyFormat("void Fn(T const&) const&;", AlignLeft);
7086   verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
7087 
7088   FormatStyle Spaces = getLLVMStyle();
7089   Spaces.SpacesInCStyleCastParentheses = true;
7090   verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
7091   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
7092   verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
7093   verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
7094 
7095   Spaces.SpacesInCStyleCastParentheses = false;
7096   Spaces.SpacesInParentheses = true;
7097   verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
7098   verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;",
7099                Spaces);
7100   verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
7101   verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
7102 
7103   FormatStyle BreakTemplate = getLLVMStyle();
7104   BreakTemplate.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
7105 
7106   verifyFormat("struct f {\n"
7107                "  template <class T>\n"
7108                "  int &foo(const std::string &str) &noexcept {}\n"
7109                "};",
7110                BreakTemplate);
7111 
7112   verifyFormat("struct f {\n"
7113                "  template <class T>\n"
7114                "  int &foo(const std::string &str) &&noexcept {}\n"
7115                "};",
7116                BreakTemplate);
7117 
7118   verifyFormat("struct f {\n"
7119                "  template <class T>\n"
7120                "  int &foo(const std::string &str) const &noexcept {}\n"
7121                "};",
7122                BreakTemplate);
7123 
7124   verifyFormat("struct f {\n"
7125                "  template <class T>\n"
7126                "  int &foo(const std::string &str) const &noexcept {}\n"
7127                "};",
7128                BreakTemplate);
7129 
7130   verifyFormat("struct f {\n"
7131                "  template <class T>\n"
7132                "  auto foo(const std::string &str) &&noexcept -> int & {}\n"
7133                "};",
7134                BreakTemplate);
7135 
7136   FormatStyle AlignLeftBreakTemplate = getLLVMStyle();
7137   AlignLeftBreakTemplate.AlwaysBreakTemplateDeclarations =
7138       FormatStyle::BTDS_Yes;
7139   AlignLeftBreakTemplate.PointerAlignment = FormatStyle::PAS_Left;
7140 
7141   verifyFormat("struct f {\n"
7142                "  template <class T>\n"
7143                "  int& foo(const std::string& str) & noexcept {}\n"
7144                "};",
7145                AlignLeftBreakTemplate);
7146 
7147   verifyFormat("struct f {\n"
7148                "  template <class T>\n"
7149                "  int& foo(const std::string& str) && noexcept {}\n"
7150                "};",
7151                AlignLeftBreakTemplate);
7152 
7153   verifyFormat("struct f {\n"
7154                "  template <class T>\n"
7155                "  int& foo(const std::string& str) const& noexcept {}\n"
7156                "};",
7157                AlignLeftBreakTemplate);
7158 
7159   verifyFormat("struct f {\n"
7160                "  template <class T>\n"
7161                "  int& foo(const std::string& str) const&& noexcept {}\n"
7162                "};",
7163                AlignLeftBreakTemplate);
7164 
7165   verifyFormat("struct f {\n"
7166                "  template <class T>\n"
7167                "  auto foo(const std::string& str) && noexcept -> int& {}\n"
7168                "};",
7169                AlignLeftBreakTemplate);
7170 
7171   // The `&` in `Type&` should not be confused with a trailing `&` of
7172   // DEPRECATED(reason) member function.
7173   verifyFormat("struct f {\n"
7174                "  template <class T>\n"
7175                "  DEPRECATED(reason)\n"
7176                "  Type &foo(arguments) {}\n"
7177                "};",
7178                BreakTemplate);
7179 
7180   verifyFormat("struct f {\n"
7181                "  template <class T>\n"
7182                "  DEPRECATED(reason)\n"
7183                "  Type& foo(arguments) {}\n"
7184                "};",
7185                AlignLeftBreakTemplate);
7186 
7187   verifyFormat("void (*foopt)(int) = &func;");
7188 }
7189 
7190 TEST_F(FormatTest, UnderstandsNewAndDelete) {
7191   verifyFormat("void f() {\n"
7192                "  A *a = new A;\n"
7193                "  A *a = new (placement) A;\n"
7194                "  delete a;\n"
7195                "  delete (A *)a;\n"
7196                "}");
7197   verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
7198                "    typename aaaaaaaaaaaaaaaaaaaaaaaa();");
7199   verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7200                "    new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
7201                "        typename aaaaaaaaaaaaaaaaaaaaaaaa();");
7202   verifyFormat("delete[] h->p;");
7203 }
7204 
7205 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
7206   verifyFormat("int *f(int *a) {}");
7207   verifyFormat("int main(int argc, char **argv) {}");
7208   verifyFormat("Test::Test(int b) : a(b * b) {}");
7209   verifyIndependentOfContext("f(a, *a);");
7210   verifyFormat("void g() { f(*a); }");
7211   verifyIndependentOfContext("int a = b * 10;");
7212   verifyIndependentOfContext("int a = 10 * b;");
7213   verifyIndependentOfContext("int a = b * c;");
7214   verifyIndependentOfContext("int a += b * c;");
7215   verifyIndependentOfContext("int a -= b * c;");
7216   verifyIndependentOfContext("int a *= b * c;");
7217   verifyIndependentOfContext("int a /= b * c;");
7218   verifyIndependentOfContext("int a = *b;");
7219   verifyIndependentOfContext("int a = *b * c;");
7220   verifyIndependentOfContext("int a = b * *c;");
7221   verifyIndependentOfContext("int a = b * (10);");
7222   verifyIndependentOfContext("S << b * (10);");
7223   verifyIndependentOfContext("return 10 * b;");
7224   verifyIndependentOfContext("return *b * *c;");
7225   verifyIndependentOfContext("return a & ~b;");
7226   verifyIndependentOfContext("f(b ? *c : *d);");
7227   verifyIndependentOfContext("int a = b ? *c : *d;");
7228   verifyIndependentOfContext("*b = a;");
7229   verifyIndependentOfContext("a * ~b;");
7230   verifyIndependentOfContext("a * !b;");
7231   verifyIndependentOfContext("a * +b;");
7232   verifyIndependentOfContext("a * -b;");
7233   verifyIndependentOfContext("a * ++b;");
7234   verifyIndependentOfContext("a * --b;");
7235   verifyIndependentOfContext("a[4] * b;");
7236   verifyIndependentOfContext("a[a * a] = 1;");
7237   verifyIndependentOfContext("f() * b;");
7238   verifyIndependentOfContext("a * [self dostuff];");
7239   verifyIndependentOfContext("int x = a * (a + b);");
7240   verifyIndependentOfContext("(a *)(a + b);");
7241   verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
7242   verifyIndependentOfContext("int *pa = (int *)&a;");
7243   verifyIndependentOfContext("return sizeof(int **);");
7244   verifyIndependentOfContext("return sizeof(int ******);");
7245   verifyIndependentOfContext("return (int **&)a;");
7246   verifyIndependentOfContext("f((*PointerToArray)[10]);");
7247   verifyFormat("void f(Type (*parameter)[10]) {}");
7248   verifyFormat("void f(Type (&parameter)[10]) {}");
7249   verifyGoogleFormat("return sizeof(int**);");
7250   verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
7251   verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
7252   verifyFormat("auto a = [](int **&, int ***) {};");
7253   verifyFormat("auto PointerBinding = [](const char *S) {};");
7254   verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
7255   verifyFormat("[](const decltype(*a) &value) {}");
7256   verifyFormat("decltype(a * b) F();");
7257   verifyFormat("#define MACRO() [](A *a) { return 1; }");
7258   verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
7259   verifyIndependentOfContext("typedef void (*f)(int *a);");
7260   verifyIndependentOfContext("int i{a * b};");
7261   verifyIndependentOfContext("aaa && aaa->f();");
7262   verifyIndependentOfContext("int x = ~*p;");
7263   verifyFormat("Constructor() : a(a), area(width * height) {}");
7264   verifyFormat("Constructor() : a(a), area(a, width * height) {}");
7265   verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
7266   verifyFormat("void f() { f(a, c * d); }");
7267   verifyFormat("void f() { f(new a(), c * d); }");
7268   verifyFormat("void f(const MyOverride &override);");
7269   verifyFormat("void f(const MyFinal &final);");
7270   verifyIndependentOfContext("bool a = f() && override.f();");
7271   verifyIndependentOfContext("bool a = f() && final.f();");
7272 
7273   verifyIndependentOfContext("InvalidRegions[*R] = 0;");
7274 
7275   verifyIndependentOfContext("A<int *> a;");
7276   verifyIndependentOfContext("A<int **> a;");
7277   verifyIndependentOfContext("A<int *, int *> a;");
7278   verifyIndependentOfContext("A<int *[]> a;");
7279   verifyIndependentOfContext(
7280       "const char *const p = reinterpret_cast<const char *const>(q);");
7281   verifyIndependentOfContext("A<int **, int **> a;");
7282   verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
7283   verifyFormat("for (char **a = b; *a; ++a) {\n}");
7284   verifyFormat("for (; a && b;) {\n}");
7285   verifyFormat("bool foo = true && [] { return false; }();");
7286 
7287   verifyFormat(
7288       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7289       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7290 
7291   verifyGoogleFormat("int const* a = &b;");
7292   verifyGoogleFormat("**outparam = 1;");
7293   verifyGoogleFormat("*outparam = a * b;");
7294   verifyGoogleFormat("int main(int argc, char** argv) {}");
7295   verifyGoogleFormat("A<int*> a;");
7296   verifyGoogleFormat("A<int**> a;");
7297   verifyGoogleFormat("A<int*, int*> a;");
7298   verifyGoogleFormat("A<int**, int**> a;");
7299   verifyGoogleFormat("f(b ? *c : *d);");
7300   verifyGoogleFormat("int a = b ? *c : *d;");
7301   verifyGoogleFormat("Type* t = **x;");
7302   verifyGoogleFormat("Type* t = *++*x;");
7303   verifyGoogleFormat("*++*x;");
7304   verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
7305   verifyGoogleFormat("Type* t = x++ * y;");
7306   verifyGoogleFormat(
7307       "const char* const p = reinterpret_cast<const char* const>(q);");
7308   verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
7309   verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
7310   verifyGoogleFormat("template <typename T>\n"
7311                      "void f(int i = 0, SomeType** temps = NULL);");
7312 
7313   FormatStyle Left = getLLVMStyle();
7314   Left.PointerAlignment = FormatStyle::PAS_Left;
7315   verifyFormat("x = *a(x) = *a(y);", Left);
7316   verifyFormat("for (;; *a = b) {\n}", Left);
7317   verifyFormat("return *this += 1;", Left);
7318   verifyFormat("throw *x;", Left);
7319   verifyFormat("delete *x;", Left);
7320   verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
7321   verifyFormat("[](const decltype(*a)* ptr) {}", Left);
7322   verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
7323 
7324   verifyIndependentOfContext("a = *(x + y);");
7325   verifyIndependentOfContext("a = &(x + y);");
7326   verifyIndependentOfContext("*(x + y).call();");
7327   verifyIndependentOfContext("&(x + y)->call();");
7328   verifyFormat("void f() { &(*I).first; }");
7329 
7330   verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
7331   verifyFormat(
7332       "int *MyValues = {\n"
7333       "    *A, // Operator detection might be confused by the '{'\n"
7334       "    *BB // Operator detection might be confused by previous comment\n"
7335       "};");
7336 
7337   verifyIndependentOfContext("if (int *a = &b)");
7338   verifyIndependentOfContext("if (int &a = *b)");
7339   verifyIndependentOfContext("if (a & b[i])");
7340   verifyIndependentOfContext("if constexpr (a & b[i])");
7341   verifyIndependentOfContext("if CONSTEXPR (a & b[i])");
7342   verifyIndependentOfContext("if (a * (b * c))");
7343   verifyIndependentOfContext("if constexpr (a * (b * c))");
7344   verifyIndependentOfContext("if CONSTEXPR (a * (b * c))");
7345   verifyIndependentOfContext("if (a::b::c::d & b[i])");
7346   verifyIndependentOfContext("if (*b[i])");
7347   verifyIndependentOfContext("if (int *a = (&b))");
7348   verifyIndependentOfContext("while (int *a = &b)");
7349   verifyIndependentOfContext("while (a * (b * c))");
7350   verifyIndependentOfContext("size = sizeof *a;");
7351   verifyIndependentOfContext("if (a && (b = c))");
7352   verifyFormat("void f() {\n"
7353                "  for (const int &v : Values) {\n"
7354                "  }\n"
7355                "}");
7356   verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
7357   verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
7358   verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
7359 
7360   verifyFormat("#define A (!a * b)");
7361   verifyFormat("#define MACRO     \\\n"
7362                "  int *i = a * b; \\\n"
7363                "  void f(a *b);",
7364                getLLVMStyleWithColumns(19));
7365 
7366   verifyIndependentOfContext("A = new SomeType *[Length];");
7367   verifyIndependentOfContext("A = new SomeType *[Length]();");
7368   verifyIndependentOfContext("T **t = new T *;");
7369   verifyIndependentOfContext("T **t = new T *();");
7370   verifyGoogleFormat("A = new SomeType*[Length]();");
7371   verifyGoogleFormat("A = new SomeType*[Length];");
7372   verifyGoogleFormat("T** t = new T*;");
7373   verifyGoogleFormat("T** t = new T*();");
7374 
7375   verifyFormat("STATIC_ASSERT((a & b) == 0);");
7376   verifyFormat("STATIC_ASSERT(0 == (a & b));");
7377   verifyFormat("template <bool a, bool b> "
7378                "typename t::if<x && y>::type f() {}");
7379   verifyFormat("template <int *y> f() {}");
7380   verifyFormat("vector<int *> v;");
7381   verifyFormat("vector<int *const> v;");
7382   verifyFormat("vector<int *const **const *> v;");
7383   verifyFormat("vector<int *volatile> v;");
7384   verifyFormat("vector<a * b> v;");
7385   verifyFormat("foo<b && false>();");
7386   verifyFormat("foo<b & 1>();");
7387   verifyFormat("decltype(*::std::declval<const T &>()) void F();");
7388   verifyFormat(
7389       "template <class T, class = typename std::enable_if<\n"
7390       "                       std::is_integral<T>::value &&\n"
7391       "                       (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
7392       "void F();",
7393       getLLVMStyleWithColumns(70));
7394   verifyFormat("template <class T,\n"
7395                "          class = typename std::enable_if<\n"
7396                "              std::is_integral<T>::value &&\n"
7397                "              (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
7398                "          class U>\n"
7399                "void F();",
7400                getLLVMStyleWithColumns(70));
7401   verifyFormat(
7402       "template <class T,\n"
7403       "          class = typename ::std::enable_if<\n"
7404       "              ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
7405       "void F();",
7406       getGoogleStyleWithColumns(68));
7407 
7408   verifyIndependentOfContext("MACRO(int *i);");
7409   verifyIndependentOfContext("MACRO(auto *a);");
7410   verifyIndependentOfContext("MACRO(const A *a);");
7411   verifyIndependentOfContext("MACRO(A *const a);");
7412   verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
7413   verifyFormat("void f() { f(float{1}, a * a); }");
7414   // FIXME: Is there a way to make this work?
7415   // verifyIndependentOfContext("MACRO(A *a);");
7416 
7417   verifyFormat("DatumHandle const *operator->() const { return input_; }");
7418   verifyFormat("return options != nullptr && operator==(*options);");
7419 
7420   EXPECT_EQ("#define OP(x)                                    \\\n"
7421             "  ostream &operator<<(ostream &s, const A &a) {  \\\n"
7422             "    return s << a.DebugString();                 \\\n"
7423             "  }",
7424             format("#define OP(x) \\\n"
7425                    "  ostream &operator<<(ostream &s, const A &a) { \\\n"
7426                    "    return s << a.DebugString(); \\\n"
7427                    "  }",
7428                    getLLVMStyleWithColumns(50)));
7429 
7430   // FIXME: We cannot handle this case yet; we might be able to figure out that
7431   // foo<x> d > v; doesn't make sense.
7432   verifyFormat("foo<a<b && c> d> v;");
7433 
7434   FormatStyle PointerMiddle = getLLVMStyle();
7435   PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
7436   verifyFormat("delete *x;", PointerMiddle);
7437   verifyFormat("int * x;", PointerMiddle);
7438   verifyFormat("int *[] x;", PointerMiddle);
7439   verifyFormat("template <int * y> f() {}", PointerMiddle);
7440   verifyFormat("int * f(int * a) {}", PointerMiddle);
7441   verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
7442   verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
7443   verifyFormat("A<int *> a;", PointerMiddle);
7444   verifyFormat("A<int **> a;", PointerMiddle);
7445   verifyFormat("A<int *, int *> a;", PointerMiddle);
7446   verifyFormat("A<int *[]> a;", PointerMiddle);
7447   verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
7448   verifyFormat("A = new SomeType *[Length];", PointerMiddle);
7449   verifyFormat("T ** t = new T *;", PointerMiddle);
7450 
7451   // Member function reference qualifiers aren't binary operators.
7452   verifyFormat("string // break\n"
7453                "operator()() & {}");
7454   verifyFormat("string // break\n"
7455                "operator()() && {}");
7456   verifyGoogleFormat("template <typename T>\n"
7457                      "auto x() & -> int {}");
7458 }
7459 
7460 TEST_F(FormatTest, UnderstandsAttributes) {
7461   verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
7462   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
7463                "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
7464   FormatStyle AfterType = getLLVMStyle();
7465   AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
7466   verifyFormat("__attribute__((nodebug)) void\n"
7467                "foo() {}\n",
7468                AfterType);
7469 }
7470 
7471 TEST_F(FormatTest, UnderstandsSquareAttributes) {
7472   verifyFormat("SomeType s [[unused]] (InitValue);");
7473   verifyFormat("SomeType s [[gnu::unused]] (InitValue);");
7474   verifyFormat("SomeType s [[using gnu: unused]] (InitValue);");
7475   verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}");
7476   verifyFormat("void f() [[deprecated(\"so sorry\")]];");
7477   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7478                "    [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);");
7479 
7480   // Make sure we do not mistake attributes for array subscripts.
7481   verifyFormat("int a() {}\n"
7482                "[[unused]] int b() {}\n");
7483   verifyFormat("NSArray *arr;\n"
7484                "arr[[Foo() bar]];");
7485 
7486   // On the other hand, we still need to correctly find array subscripts.
7487   verifyFormat("int a = std::vector<int>{1, 2, 3}[0];");
7488 
7489   // Make sure that we do not mistake Objective-C method inside array literals
7490   // as attributes, even if those method names are also keywords.
7491   verifyFormat("@[ [foo bar] ];");
7492   verifyFormat("@[ [NSArray class] ];");
7493   verifyFormat("@[ [foo enum] ];");
7494 
7495   // Make sure we do not parse attributes as lambda introducers.
7496   FormatStyle MultiLineFunctions = getLLVMStyle();
7497   MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
7498   verifyFormat("[[unused]] int b() {\n"
7499                "  return 42;\n"
7500                "}\n",
7501                MultiLineFunctions);
7502 }
7503 
7504 TEST_F(FormatTest, UnderstandsEllipsis) {
7505   verifyFormat("int printf(const char *fmt, ...);");
7506   verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
7507   verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
7508 
7509   FormatStyle PointersLeft = getLLVMStyle();
7510   PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
7511   verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
7512 }
7513 
7514 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
7515   EXPECT_EQ("int *a;\n"
7516             "int *a;\n"
7517             "int *a;",
7518             format("int *a;\n"
7519                    "int* a;\n"
7520                    "int *a;",
7521                    getGoogleStyle()));
7522   EXPECT_EQ("int* a;\n"
7523             "int* a;\n"
7524             "int* a;",
7525             format("int* a;\n"
7526                    "int* a;\n"
7527                    "int *a;",
7528                    getGoogleStyle()));
7529   EXPECT_EQ("int *a;\n"
7530             "int *a;\n"
7531             "int *a;",
7532             format("int *a;\n"
7533                    "int * a;\n"
7534                    "int *  a;",
7535                    getGoogleStyle()));
7536   EXPECT_EQ("auto x = [] {\n"
7537             "  int *a;\n"
7538             "  int *a;\n"
7539             "  int *a;\n"
7540             "};",
7541             format("auto x=[]{int *a;\n"
7542                    "int * a;\n"
7543                    "int *  a;};",
7544                    getGoogleStyle()));
7545 }
7546 
7547 TEST_F(FormatTest, UnderstandsRvalueReferences) {
7548   verifyFormat("int f(int &&a) {}");
7549   verifyFormat("int f(int a, char &&b) {}");
7550   verifyFormat("void f() { int &&a = b; }");
7551   verifyGoogleFormat("int f(int a, char&& b) {}");
7552   verifyGoogleFormat("void f() { int&& a = b; }");
7553 
7554   verifyIndependentOfContext("A<int &&> a;");
7555   verifyIndependentOfContext("A<int &&, int &&> a;");
7556   verifyGoogleFormat("A<int&&> a;");
7557   verifyGoogleFormat("A<int&&, int&&> a;");
7558 
7559   // Not rvalue references:
7560   verifyFormat("template <bool B, bool C> class A {\n"
7561                "  static_assert(B && C, \"Something is wrong\");\n"
7562                "};");
7563   verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
7564   verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
7565   verifyFormat("#define A(a, b) (a && b)");
7566 }
7567 
7568 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
7569   verifyFormat("void f() {\n"
7570                "  x[aaaaaaaaa -\n"
7571                "    b] = 23;\n"
7572                "}",
7573                getLLVMStyleWithColumns(15));
7574 }
7575 
7576 TEST_F(FormatTest, FormatsCasts) {
7577   verifyFormat("Type *A = static_cast<Type *>(P);");
7578   verifyFormat("Type *A = (Type *)P;");
7579   verifyFormat("Type *A = (vector<Type *, int *>)P;");
7580   verifyFormat("int a = (int)(2.0f);");
7581   verifyFormat("int a = (int)2.0f;");
7582   verifyFormat("x[(int32)y];");
7583   verifyFormat("x = (int32)y;");
7584   verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
7585   verifyFormat("int a = (int)*b;");
7586   verifyFormat("int a = (int)2.0f;");
7587   verifyFormat("int a = (int)~0;");
7588   verifyFormat("int a = (int)++a;");
7589   verifyFormat("int a = (int)sizeof(int);");
7590   verifyFormat("int a = (int)+2;");
7591   verifyFormat("my_int a = (my_int)2.0f;");
7592   verifyFormat("my_int a = (my_int)sizeof(int);");
7593   verifyFormat("return (my_int)aaa;");
7594   verifyFormat("#define x ((int)-1)");
7595   verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
7596   verifyFormat("#define p(q) ((int *)&q)");
7597   verifyFormat("fn(a)(b) + 1;");
7598 
7599   verifyFormat("void f() { my_int a = (my_int)*b; }");
7600   verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
7601   verifyFormat("my_int a = (my_int)~0;");
7602   verifyFormat("my_int a = (my_int)++a;");
7603   verifyFormat("my_int a = (my_int)-2;");
7604   verifyFormat("my_int a = (my_int)1;");
7605   verifyFormat("my_int a = (my_int *)1;");
7606   verifyFormat("my_int a = (const my_int)-1;");
7607   verifyFormat("my_int a = (const my_int *)-1;");
7608   verifyFormat("my_int a = (my_int)(my_int)-1;");
7609   verifyFormat("my_int a = (ns::my_int)-2;");
7610   verifyFormat("case (my_int)ONE:");
7611   verifyFormat("auto x = (X)this;");
7612   // Casts in Obj-C style calls used to not be recognized as such.
7613   verifyFormat("int a = [(type*)[((type*)val) arg] arg];", getGoogleStyle());
7614 
7615   // FIXME: single value wrapped with paren will be treated as cast.
7616   verifyFormat("void f(int i = (kValue)*kMask) {}");
7617 
7618   verifyFormat("{ (void)F; }");
7619 
7620   // Don't break after a cast's
7621   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7622                "    (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
7623                "                                   bbbbbbbbbbbbbbbbbbbbbb);");
7624 
7625   // These are not casts.
7626   verifyFormat("void f(int *) {}");
7627   verifyFormat("f(foo)->b;");
7628   verifyFormat("f(foo).b;");
7629   verifyFormat("f(foo)(b);");
7630   verifyFormat("f(foo)[b];");
7631   verifyFormat("[](foo) { return 4; }(bar);");
7632   verifyFormat("(*funptr)(foo)[4];");
7633   verifyFormat("funptrs[4](foo)[4];");
7634   verifyFormat("void f(int *);");
7635   verifyFormat("void f(int *) = 0;");
7636   verifyFormat("void f(SmallVector<int>) {}");
7637   verifyFormat("void f(SmallVector<int>);");
7638   verifyFormat("void f(SmallVector<int>) = 0;");
7639   verifyFormat("void f(int i = (kA * kB) & kMask) {}");
7640   verifyFormat("int a = sizeof(int) * b;");
7641   verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
7642   verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
7643   verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
7644   verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
7645 
7646   // These are not casts, but at some point were confused with casts.
7647   verifyFormat("virtual void foo(int *) override;");
7648   verifyFormat("virtual void foo(char &) const;");
7649   verifyFormat("virtual void foo(int *a, char *) const;");
7650   verifyFormat("int a = sizeof(int *) + b;");
7651   verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
7652   verifyFormat("bool b = f(g<int>) && c;");
7653   verifyFormat("typedef void (*f)(int i) func;");
7654   verifyFormat("void operator++(int) noexcept;");
7655   verifyFormat("void operator++(int &) noexcept;");
7656   verifyFormat("void operator delete(void *, std::size_t, const std::nothrow_t "
7657                "&) noexcept;");
7658   verifyFormat(
7659       "void operator delete(std::size_t, const std::nothrow_t &) noexcept;");
7660   verifyFormat("void operator delete(const std::nothrow_t &) noexcept;");
7661   verifyFormat("void operator delete(std::nothrow_t &) noexcept;");
7662   verifyFormat("void operator delete(nothrow_t &) noexcept;");
7663   verifyFormat("void operator delete(foo &) noexcept;");
7664   verifyFormat("void operator delete(foo) noexcept;");
7665   verifyFormat("void operator delete(int) noexcept;");
7666   verifyFormat("void operator delete(int &) noexcept;");
7667   verifyFormat("void operator delete(int &) volatile noexcept;");
7668   verifyFormat("void operator delete(int &) const");
7669   verifyFormat("void operator delete(int &) = default");
7670   verifyFormat("void operator delete(int &) = delete");
7671   verifyFormat("void operator delete(int &) [[noreturn]]");
7672   verifyFormat("void operator delete(int &) throw();");
7673   verifyFormat("void operator delete(int &) throw(int);");
7674   verifyFormat("auto operator delete(int &) -> int;");
7675   verifyFormat("auto operator delete(int &) override");
7676   verifyFormat("auto operator delete(int &) final");
7677 
7678   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
7679                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
7680   // FIXME: The indentation here is not ideal.
7681   verifyFormat(
7682       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7683       "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
7684       "        [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
7685 }
7686 
7687 TEST_F(FormatTest, FormatsFunctionTypes) {
7688   verifyFormat("A<bool()> a;");
7689   verifyFormat("A<SomeType()> a;");
7690   verifyFormat("A<void (*)(int, std::string)> a;");
7691   verifyFormat("A<void *(int)>;");
7692   verifyFormat("void *(*a)(int *, SomeType *);");
7693   verifyFormat("int (*func)(void *);");
7694   verifyFormat("void f() { int (*func)(void *); }");
7695   verifyFormat("template <class CallbackClass>\n"
7696                "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
7697 
7698   verifyGoogleFormat("A<void*(int*, SomeType*)>;");
7699   verifyGoogleFormat("void* (*a)(int);");
7700   verifyGoogleFormat(
7701       "template <class CallbackClass>\n"
7702       "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
7703 
7704   // Other constructs can look somewhat like function types:
7705   verifyFormat("A<sizeof(*x)> a;");
7706   verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
7707   verifyFormat("some_var = function(*some_pointer_var)[0];");
7708   verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
7709   verifyFormat("int x = f(&h)();");
7710   verifyFormat("returnsFunction(&param1, &param2)(param);");
7711   verifyFormat("std::function<\n"
7712                "    LooooooooooongTemplatedType<\n"
7713                "        SomeType>*(\n"
7714                "        LooooooooooooooooongType type)>\n"
7715                "    function;",
7716                getGoogleStyleWithColumns(40));
7717 }
7718 
7719 TEST_F(FormatTest, FormatsPointersToArrayTypes) {
7720   verifyFormat("A (*foo_)[6];");
7721   verifyFormat("vector<int> (*foo_)[6];");
7722 }
7723 
7724 TEST_F(FormatTest, BreaksLongVariableDeclarations) {
7725   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7726                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
7727   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
7728                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
7729   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7730                "    *LoooooooooooooooooooooooooooooooooooooooongVariable;");
7731 
7732   // Different ways of ()-initializiation.
7733   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7734                "    LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
7735   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7736                "    LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
7737   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7738                "    LoooooooooooooooooooooooooooooooooooooooongVariable({});");
7739   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7740                "    LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
7741 
7742   // Lambdas should not confuse the variable declaration heuristic.
7743   verifyFormat("LooooooooooooooooongType\n"
7744                "    variable(nullptr, [](A *a) {});",
7745                getLLVMStyleWithColumns(40));
7746 }
7747 
7748 TEST_F(FormatTest, BreaksLongDeclarations) {
7749   verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
7750                "    AnotherNameForTheLongType;");
7751   verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
7752                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7753   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7754                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
7755   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
7756                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
7757   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7758                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7759   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
7760                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7761   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
7762                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7763   verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
7764                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7765   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7766                "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
7767   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7768                "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
7769   FormatStyle Indented = getLLVMStyle();
7770   Indented.IndentWrappedFunctionNames = true;
7771   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7772                "    LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
7773                Indented);
7774   verifyFormat(
7775       "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7776       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
7777       Indented);
7778   verifyFormat(
7779       "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
7780       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
7781       Indented);
7782   verifyFormat(
7783       "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
7784       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
7785       Indented);
7786 
7787   // FIXME: Without the comment, this breaks after "(".
7788   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType  // break\n"
7789                "    (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
7790                getGoogleStyle());
7791 
7792   verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
7793                "                  int LoooooooooooooooooooongParam2) {}");
7794   verifyFormat(
7795       "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
7796       "                                   SourceLocation L, IdentifierIn *II,\n"
7797       "                                   Type *T) {}");
7798   verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
7799                "ReallyReaaallyLongFunctionName(\n"
7800                "    const std::string &SomeParameter,\n"
7801                "    const SomeType<string, SomeOtherTemplateParameter>\n"
7802                "        &ReallyReallyLongParameterName,\n"
7803                "    const SomeType<string, SomeOtherTemplateParameter>\n"
7804                "        &AnotherLongParameterName) {}");
7805   verifyFormat("template <typename A>\n"
7806                "SomeLoooooooooooooooooooooongType<\n"
7807                "    typename some_namespace::SomeOtherType<A>::Type>\n"
7808                "Function() {}");
7809 
7810   verifyGoogleFormat(
7811       "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
7812       "    aaaaaaaaaaaaaaaaaaaaaaa;");
7813   verifyGoogleFormat(
7814       "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
7815       "                                   SourceLocation L) {}");
7816   verifyGoogleFormat(
7817       "some_namespace::LongReturnType\n"
7818       "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
7819       "    int first_long_parameter, int second_parameter) {}");
7820 
7821   verifyGoogleFormat("template <typename T>\n"
7822                      "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
7823                      "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
7824   verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7825                      "                   int aaaaaaaaaaaaaaaaaaaaaaa);");
7826 
7827   verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
7828                "    const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7829                "        *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7830   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7831                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
7832                "        aaaaaaaaaaaaaaaaaaaaaaaa);");
7833   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7834                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
7835                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
7836                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7837 
7838   verifyFormat("template <typename T> // Templates on own line.\n"
7839                "static int            // Some comment.\n"
7840                "MyFunction(int a);",
7841                getLLVMStyle());
7842 }
7843 
7844 TEST_F(FormatTest, FormatsArrays) {
7845   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
7846                "                         [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
7847   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
7848                "                         [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
7849   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
7850                "    aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
7851   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7852                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
7853   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7854                "    [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
7855   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7856                "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
7857                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
7858   verifyFormat(
7859       "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
7860       "             << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
7861       "                                  [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
7862   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
7863                "    .aaaaaaaaaaaaaaaaaaaaaa();");
7864 
7865   verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
7866                      "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
7867   verifyFormat(
7868       "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
7869       "                                  .aaaaaaa[0]\n"
7870       "                                  .aaaaaaaaaaaaaaaaaaaaaa();");
7871   verifyFormat("a[::b::c];");
7872 
7873   verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
7874 
7875   FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
7876   verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
7877 }
7878 
7879 TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
7880   verifyFormat("(a)->b();");
7881   verifyFormat("--a;");
7882 }
7883 
7884 TEST_F(FormatTest, HandlesIncludeDirectives) {
7885   verifyFormat("#include <string>\n"
7886                "#include <a/b/c.h>\n"
7887                "#include \"a/b/string\"\n"
7888                "#include \"string.h\"\n"
7889                "#include \"string.h\"\n"
7890                "#include <a-a>\n"
7891                "#include < path with space >\n"
7892                "#include_next <test.h>"
7893                "#include \"abc.h\" // this is included for ABC\n"
7894                "#include \"some long include\" // with a comment\n"
7895                "#include \"some very long include path\"\n"
7896                "#include <some/very/long/include/path>\n",
7897                getLLVMStyleWithColumns(35));
7898   EXPECT_EQ("#include \"a.h\"", format("#include  \"a.h\""));
7899   EXPECT_EQ("#include <a>", format("#include<a>"));
7900 
7901   verifyFormat("#import <string>");
7902   verifyFormat("#import <a/b/c.h>");
7903   verifyFormat("#import \"a/b/string\"");
7904   verifyFormat("#import \"string.h\"");
7905   verifyFormat("#import \"string.h\"");
7906   verifyFormat("#if __has_include(<strstream>)\n"
7907                "#include <strstream>\n"
7908                "#endif");
7909 
7910   verifyFormat("#define MY_IMPORT <a/b>");
7911 
7912   verifyFormat("#if __has_include(<a/b>)");
7913   verifyFormat("#if __has_include_next(<a/b>)");
7914   verifyFormat("#define F __has_include(<a/b>)");
7915   verifyFormat("#define F __has_include_next(<a/b>)");
7916 
7917   // Protocol buffer definition or missing "#".
7918   verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
7919                getLLVMStyleWithColumns(30));
7920 
7921   FormatStyle Style = getLLVMStyle();
7922   Style.AlwaysBreakBeforeMultilineStrings = true;
7923   Style.ColumnLimit = 0;
7924   verifyFormat("#import \"abc.h\"", Style);
7925 
7926   // But 'import' might also be a regular C++ namespace.
7927   verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7928                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7929 }
7930 
7931 //===----------------------------------------------------------------------===//
7932 // Error recovery tests.
7933 //===----------------------------------------------------------------------===//
7934 
7935 TEST_F(FormatTest, IncompleteParameterLists) {
7936   FormatStyle NoBinPacking = getLLVMStyle();
7937   NoBinPacking.BinPackParameters = false;
7938   verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
7939                "                        double *min_x,\n"
7940                "                        double *max_x,\n"
7941                "                        double *min_y,\n"
7942                "                        double *max_y,\n"
7943                "                        double *min_z,\n"
7944                "                        double *max_z, ) {}",
7945                NoBinPacking);
7946 }
7947 
7948 TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
7949   verifyFormat("void f() { return; }\n42");
7950   verifyFormat("void f() {\n"
7951                "  if (0)\n"
7952                "    return;\n"
7953                "}\n"
7954                "42");
7955   verifyFormat("void f() { return }\n42");
7956   verifyFormat("void f() {\n"
7957                "  if (0)\n"
7958                "    return\n"
7959                "}\n"
7960                "42");
7961 }
7962 
7963 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
7964   EXPECT_EQ("void f() { return }", format("void  f ( )  {  return  }"));
7965   EXPECT_EQ("void f() {\n"
7966             "  if (a)\n"
7967             "    return\n"
7968             "}",
7969             format("void  f  (  )  {  if  ( a )  return  }"));
7970   EXPECT_EQ("namespace N {\n"
7971             "void f()\n"
7972             "}",
7973             format("namespace  N  {  void f()  }"));
7974   EXPECT_EQ("namespace N {\n"
7975             "void f() {}\n"
7976             "void g()\n"
7977             "} // namespace N",
7978             format("namespace N  { void f( ) { } void g( ) }"));
7979 }
7980 
7981 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
7982   verifyFormat("int aaaaaaaa =\n"
7983                "    // Overlylongcomment\n"
7984                "    b;",
7985                getLLVMStyleWithColumns(20));
7986   verifyFormat("function(\n"
7987                "    ShortArgument,\n"
7988                "    LoooooooooooongArgument);\n",
7989                getLLVMStyleWithColumns(20));
7990 }
7991 
7992 TEST_F(FormatTest, IncorrectAccessSpecifier) {
7993   verifyFormat("public:");
7994   verifyFormat("class A {\n"
7995                "public\n"
7996                "  void f() {}\n"
7997                "};");
7998   verifyFormat("public\n"
7999                "int qwerty;");
8000   verifyFormat("public\n"
8001                "B {}");
8002   verifyFormat("public\n"
8003                "{}");
8004   verifyFormat("public\n"
8005                "B { int x; }");
8006 }
8007 
8008 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
8009   verifyFormat("{");
8010   verifyFormat("#})");
8011   verifyNoCrash("(/**/[:!] ?[).");
8012 }
8013 
8014 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) {
8015   // Found by oss-fuzz:
8016   // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212
8017   FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
8018   Style.ColumnLimit = 60;
8019   verifyNoCrash(
8020       "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20"
8021       "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20"
8022       "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a",
8023       Style);
8024 }
8025 
8026 TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
8027   verifyFormat("do {\n}");
8028   verifyFormat("do {\n}\n"
8029                "f();");
8030   verifyFormat("do {\n}\n"
8031                "wheeee(fun);");
8032   verifyFormat("do {\n"
8033                "  f();\n"
8034                "}");
8035 }
8036 
8037 TEST_F(FormatTest, IncorrectCodeMissingParens) {
8038   verifyFormat("if {\n  foo;\n  foo();\n}");
8039   verifyFormat("switch {\n  foo;\n  foo();\n}");
8040   verifyIncompleteFormat("for {\n  foo;\n  foo();\n}");
8041   verifyFormat("while {\n  foo;\n  foo();\n}");
8042   verifyFormat("do {\n  foo;\n  foo();\n} while;");
8043 }
8044 
8045 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
8046   verifyIncompleteFormat("namespace {\n"
8047                          "class Foo { Foo (\n"
8048                          "};\n"
8049                          "} // namespace");
8050 }
8051 
8052 TEST_F(FormatTest, IncorrectCodeErrorDetection) {
8053   EXPECT_EQ("{\n  {}\n", format("{\n{\n}\n"));
8054   EXPECT_EQ("{\n  {}\n", format("{\n  {\n}\n"));
8055   EXPECT_EQ("{\n  {}\n", format("{\n  {\n  }\n"));
8056   EXPECT_EQ("{\n  {}\n}\n}\n", format("{\n  {\n    }\n  }\n}\n"));
8057 
8058   EXPECT_EQ("{\n"
8059             "  {\n"
8060             "    breakme(\n"
8061             "        qwe);\n"
8062             "  }\n",
8063             format("{\n"
8064                    "    {\n"
8065                    " breakme(qwe);\n"
8066                    "}\n",
8067                    getLLVMStyleWithColumns(10)));
8068 }
8069 
8070 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
8071   verifyFormat("int x = {\n"
8072                "    avariable,\n"
8073                "    b(alongervariable)};",
8074                getLLVMStyleWithColumns(25));
8075 }
8076 
8077 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
8078   verifyFormat("return (a)(b){1, 2, 3};");
8079 }
8080 
8081 TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
8082   verifyFormat("vector<int> x{1, 2, 3, 4};");
8083   verifyFormat("vector<int> x{\n"
8084                "    1,\n"
8085                "    2,\n"
8086                "    3,\n"
8087                "    4,\n"
8088                "};");
8089   verifyFormat("vector<T> x{{}, {}, {}, {}};");
8090   verifyFormat("f({1, 2});");
8091   verifyFormat("auto v = Foo{-1};");
8092   verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
8093   verifyFormat("Class::Class : member{1, 2, 3} {}");
8094   verifyFormat("new vector<int>{1, 2, 3};");
8095   verifyFormat("new int[3]{1, 2, 3};");
8096   verifyFormat("new int{1};");
8097   verifyFormat("return {arg1, arg2};");
8098   verifyFormat("return {arg1, SomeType{parameter}};");
8099   verifyFormat("int count = set<int>{f(), g(), h()}.size();");
8100   verifyFormat("new T{arg1, arg2};");
8101   verifyFormat("f(MyMap[{composite, key}]);");
8102   verifyFormat("class Class {\n"
8103                "  T member = {arg1, arg2};\n"
8104                "};");
8105   verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
8106   verifyFormat("const struct A a = {.a = 1, .b = 2};");
8107   verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
8108   verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
8109   verifyFormat("int a = std::is_integral<int>{} + 0;");
8110 
8111   verifyFormat("int foo(int i) { return fo1{}(i); }");
8112   verifyFormat("int foo(int i) { return fo1{}(i); }");
8113   verifyFormat("auto i = decltype(x){};");
8114   verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
8115   verifyFormat("Node n{1, Node{1000}, //\n"
8116                "       2};");
8117   verifyFormat("Aaaa aaaaaaa{\n"
8118                "    {\n"
8119                "        aaaa,\n"
8120                "    },\n"
8121                "};");
8122   verifyFormat("class C : public D {\n"
8123                "  SomeClass SC{2};\n"
8124                "};");
8125   verifyFormat("class C : public A {\n"
8126                "  class D : public B {\n"
8127                "    void f() { int i{2}; }\n"
8128                "  };\n"
8129                "};");
8130   verifyFormat("#define A {a, a},");
8131 
8132   // Avoid breaking between equal sign and opening brace
8133   FormatStyle AvoidBreakingFirstArgument = getLLVMStyle();
8134   AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200;
8135   verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n"
8136                "    {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n"
8137                "     {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n"
8138                "     {\"ccccccccccccccccccccc\", 2}};",
8139                AvoidBreakingFirstArgument);
8140 
8141   // Binpacking only if there is no trailing comma
8142   verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
8143                "                      cccccccccc, dddddddddd};",
8144                getLLVMStyleWithColumns(50));
8145   verifyFormat("const Aaaaaa aaaaa = {\n"
8146                "    aaaaaaaaaaa,\n"
8147                "    bbbbbbbbbbb,\n"
8148                "    ccccccccccc,\n"
8149                "    ddddddddddd,\n"
8150                "};",
8151                getLLVMStyleWithColumns(50));
8152 
8153   // Cases where distinguising braced lists and blocks is hard.
8154   verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
8155   verifyFormat("void f() {\n"
8156                "  return; // comment\n"
8157                "}\n"
8158                "SomeType t;");
8159   verifyFormat("void f() {\n"
8160                "  if (a) {\n"
8161                "    f();\n"
8162                "  }\n"
8163                "}\n"
8164                "SomeType t;");
8165 
8166   // In combination with BinPackArguments = false.
8167   FormatStyle NoBinPacking = getLLVMStyle();
8168   NoBinPacking.BinPackArguments = false;
8169   verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
8170                "                      bbbbb,\n"
8171                "                      ccccc,\n"
8172                "                      ddddd,\n"
8173                "                      eeeee,\n"
8174                "                      ffffff,\n"
8175                "                      ggggg,\n"
8176                "                      hhhhhh,\n"
8177                "                      iiiiii,\n"
8178                "                      jjjjjj,\n"
8179                "                      kkkkkk};",
8180                NoBinPacking);
8181   verifyFormat("const Aaaaaa aaaaa = {\n"
8182                "    aaaaa,\n"
8183                "    bbbbb,\n"
8184                "    ccccc,\n"
8185                "    ddddd,\n"
8186                "    eeeee,\n"
8187                "    ffffff,\n"
8188                "    ggggg,\n"
8189                "    hhhhhh,\n"
8190                "    iiiiii,\n"
8191                "    jjjjjj,\n"
8192                "    kkkkkk,\n"
8193                "};",
8194                NoBinPacking);
8195   verifyFormat(
8196       "const Aaaaaa aaaaa = {\n"
8197       "    aaaaa,  bbbbb,  ccccc,  ddddd,  eeeee,  ffffff, ggggg, hhhhhh,\n"
8198       "    iiiiii, jjjjjj, kkkkkk, aaaaa,  bbbbb,  ccccc,  ddddd, eeeee,\n"
8199       "    ffffff, ggggg,  hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
8200       "};",
8201       NoBinPacking);
8202 
8203   NoBinPacking.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8204   EXPECT_EQ("static uint8 CddDp83848Reg[] = {\n"
8205             "    CDDDP83848_BMCR_REGISTER,\n"
8206             "    CDDDP83848_BMSR_REGISTER,\n"
8207             "    CDDDP83848_RBR_REGISTER};",
8208             format("static uint8 CddDp83848Reg[] = {CDDDP83848_BMCR_REGISTER,\n"
8209                    "                                CDDDP83848_BMSR_REGISTER,\n"
8210                    "                                CDDDP83848_RBR_REGISTER};",
8211                    NoBinPacking));
8212 
8213   // FIXME: The alignment of these trailing comments might be bad. Then again,
8214   // this might be utterly useless in real code.
8215   verifyFormat("Constructor::Constructor()\n"
8216                "    : some_value{         //\n"
8217                "                 aaaaaaa, //\n"
8218                "                 bbbbbbb} {}");
8219 
8220   // In braced lists, the first comment is always assumed to belong to the
8221   // first element. Thus, it can be moved to the next or previous line as
8222   // appropriate.
8223   EXPECT_EQ("function({// First element:\n"
8224             "          1,\n"
8225             "          // Second element:\n"
8226             "          2});",
8227             format("function({\n"
8228                    "    // First element:\n"
8229                    "    1,\n"
8230                    "    // Second element:\n"
8231                    "    2});"));
8232   EXPECT_EQ("std::vector<int> MyNumbers{\n"
8233             "    // First element:\n"
8234             "    1,\n"
8235             "    // Second element:\n"
8236             "    2};",
8237             format("std::vector<int> MyNumbers{// First element:\n"
8238                    "                           1,\n"
8239                    "                           // Second element:\n"
8240                    "                           2};",
8241                    getLLVMStyleWithColumns(30)));
8242   // A trailing comma should still lead to an enforced line break and no
8243   // binpacking.
8244   EXPECT_EQ("vector<int> SomeVector = {\n"
8245             "    // aaa\n"
8246             "    1,\n"
8247             "    2,\n"
8248             "};",
8249             format("vector<int> SomeVector = { // aaa\n"
8250                    "    1, 2, };"));
8251 
8252   FormatStyle ExtraSpaces = getLLVMStyle();
8253   ExtraSpaces.Cpp11BracedListStyle = false;
8254   ExtraSpaces.ColumnLimit = 75;
8255   verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
8256   verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
8257   verifyFormat("f({ 1, 2 });", ExtraSpaces);
8258   verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
8259   verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
8260   verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
8261   verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
8262   verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
8263   verifyFormat("return { arg1, arg2 };", ExtraSpaces);
8264   verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
8265   verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
8266   verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
8267   verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
8268   verifyFormat("class Class {\n"
8269                "  T member = { arg1, arg2 };\n"
8270                "};",
8271                ExtraSpaces);
8272   verifyFormat(
8273       "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8274       "                                 aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
8275       "                  : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
8276       "                                 bbbbbbbbbbbbbbbbbbbb, bbbbb };",
8277       ExtraSpaces);
8278   verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
8279   verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
8280                ExtraSpaces);
8281   verifyFormat(
8282       "someFunction(OtherParam,\n"
8283       "             BracedList{ // comment 1 (Forcing interesting break)\n"
8284       "                         param1, param2,\n"
8285       "                         // comment 2\n"
8286       "                         param3, param4 });",
8287       ExtraSpaces);
8288   verifyFormat(
8289       "std::this_thread::sleep_for(\n"
8290       "    std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
8291       ExtraSpaces);
8292   verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
8293                "    aaaaaaa,\n"
8294                "    aaaaaaaaaa,\n"
8295                "    aaaaa,\n"
8296                "    aaaaaaaaaaaaaaa,\n"
8297                "    aaa,\n"
8298                "    aaaaaaaaaa,\n"
8299                "    a,\n"
8300                "    aaaaaaaaaaaaaaaaaaaaa,\n"
8301                "    aaaaaaaaaaaa,\n"
8302                "    aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
8303                "    aaaaaaa,\n"
8304                "    a};");
8305   verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
8306   verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
8307   verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
8308 
8309   // Avoid breaking between initializer/equal sign and opening brace
8310   ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200;
8311   verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n"
8312                "  { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
8313                "  { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
8314                "  { \"ccccccccccccccccccccc\", 2 }\n"
8315                "};",
8316                ExtraSpaces);
8317   verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n"
8318                "  { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
8319                "  { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
8320                "  { \"ccccccccccccccccccccc\", 2 }\n"
8321                "};",
8322                ExtraSpaces);
8323 
8324   FormatStyle SpaceBeforeBrace = getLLVMStyle();
8325   SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true;
8326   verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace);
8327   verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace);
8328 
8329   FormatStyle SpaceBetweenBraces = getLLVMStyle();
8330   SpaceBetweenBraces.SpacesInAngles = true;
8331   SpaceBetweenBraces.SpacesInParentheses = true;
8332   SpaceBetweenBraces.SpacesInSquareBrackets = true;
8333   verifyFormat("vector< int > x{ 1, 2, 3, 4 };", SpaceBetweenBraces);
8334   verifyFormat("f( {}, { {}, {} }, MyMap[ { k, v } ] );", SpaceBetweenBraces);
8335   verifyFormat("vector< int > x{ // comment 1\n"
8336                "                 1, 2, 3, 4 };",
8337                SpaceBetweenBraces);
8338   SpaceBetweenBraces.ColumnLimit = 20;
8339   EXPECT_EQ("vector< int > x{\n"
8340             "    1, 2, 3, 4 };",
8341             format("vector<int>x{1,2,3,4};", SpaceBetweenBraces));
8342   SpaceBetweenBraces.ColumnLimit = 24;
8343   EXPECT_EQ("vector< int > x{ 1, 2,\n"
8344             "                 3, 4 };",
8345             format("vector<int>x{1,2,3,4};", SpaceBetweenBraces));
8346   EXPECT_EQ("vector< int > x{\n"
8347             "    1,\n"
8348             "    2,\n"
8349             "    3,\n"
8350             "    4,\n"
8351             "};",
8352             format("vector<int>x{1,2,3,4,};", SpaceBetweenBraces));
8353   verifyFormat("vector< int > x{};", SpaceBetweenBraces);
8354   SpaceBetweenBraces.SpaceInEmptyParentheses = true;
8355   verifyFormat("vector< int > x{ };", SpaceBetweenBraces);
8356 }
8357 
8358 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
8359   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8360                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8361                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8362                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8363                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8364                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
8365   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
8366                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8367                "                 1, 22, 333, 4444, 55555, //\n"
8368                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8369                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
8370   verifyFormat(
8371       "vector<int> x = {1,       22, 333, 4444, 55555, 666666, 7777777,\n"
8372       "                 1,       22, 333, 4444, 55555, 666666, 7777777,\n"
8373       "                 1,       22, 333, 4444, 55555, 666666, // comment\n"
8374       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
8375       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
8376       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
8377       "                 7777777};");
8378   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
8379                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
8380                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
8381   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
8382                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
8383                "    // Separating comment.\n"
8384                "    X86::R8, X86::R9, X86::R10, X86::R11, 0};");
8385   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
8386                "    // Leading comment\n"
8387                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
8388                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
8389   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
8390                "                 1, 1, 1, 1};",
8391                getLLVMStyleWithColumns(39));
8392   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
8393                "                 1, 1, 1, 1};",
8394                getLLVMStyleWithColumns(38));
8395   verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
8396                "    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
8397                getLLVMStyleWithColumns(43));
8398   verifyFormat(
8399       "static unsigned SomeValues[10][3] = {\n"
8400       "    {1, 4, 0},  {4, 9, 0},  {4, 5, 9},  {8, 5, 4}, {1, 8, 4},\n"
8401       "    {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
8402   verifyFormat("static auto fields = new vector<string>{\n"
8403                "    \"aaaaaaaaaaaaa\",\n"
8404                "    \"aaaaaaaaaaaaa\",\n"
8405                "    \"aaaaaaaaaaaa\",\n"
8406                "    \"aaaaaaaaaaaaaa\",\n"
8407                "    \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
8408                "    \"aaaaaaaaaaaa\",\n"
8409                "    \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
8410                "};");
8411   verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
8412   verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
8413                "                 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
8414                "                 3, cccccccccccccccccccccc};",
8415                getLLVMStyleWithColumns(60));
8416 
8417   // Trailing commas.
8418   verifyFormat("vector<int> x = {\n"
8419                "    1, 1, 1, 1, 1, 1, 1, 1,\n"
8420                "};",
8421                getLLVMStyleWithColumns(39));
8422   verifyFormat("vector<int> x = {\n"
8423                "    1, 1, 1, 1, 1, 1, 1, 1, //\n"
8424                "};",
8425                getLLVMStyleWithColumns(39));
8426   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
8427                "                 1, 1, 1, 1,\n"
8428                "                 /**/ /**/};",
8429                getLLVMStyleWithColumns(39));
8430 
8431   // Trailing comment in the first line.
8432   verifyFormat("vector<int> iiiiiiiiiiiiiii = {                      //\n"
8433                "    1111111111, 2222222222, 33333333333, 4444444444, //\n"
8434                "    111111111,  222222222,  3333333333,  444444444,  //\n"
8435                "    11111111,   22222222,   333333333,   44444444};");
8436   // Trailing comment in the last line.
8437   verifyFormat("int aaaaa[] = {\n"
8438                "    1, 2, 3, // comment\n"
8439                "    4, 5, 6  // comment\n"
8440                "};");
8441 
8442   // With nested lists, we should either format one item per line or all nested
8443   // lists one on line.
8444   // FIXME: For some nested lists, we can do better.
8445   verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
8446                "        {aaaaaaaaaaaaaaaaaaa},\n"
8447                "        {aaaaaaaaaaaaaaaaaaaaa},\n"
8448                "        {aaaaaaaaaaaaaaaaa}};",
8449                getLLVMStyleWithColumns(60));
8450   verifyFormat(
8451       "SomeStruct my_struct_array = {\n"
8452       "    {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
8453       "     aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
8454       "    {aaa, aaa},\n"
8455       "    {aaa, aaa},\n"
8456       "    {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
8457       "    {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
8458       "     aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
8459 
8460   // No column layout should be used here.
8461   verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
8462                "                   bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
8463 
8464   verifyNoCrash("a<,");
8465 
8466   // No braced initializer here.
8467   verifyFormat("void f() {\n"
8468                "  struct Dummy {};\n"
8469                "  f(v);\n"
8470                "}");
8471 
8472   // Long lists should be formatted in columns even if they are nested.
8473   verifyFormat(
8474       "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8475       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8476       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8477       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8478       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8479       "                          1, 22, 333, 4444, 55555, 666666, 7777777});");
8480 
8481   // Allow "single-column" layout even if that violates the column limit. There
8482   // isn't going to be a better way.
8483   verifyFormat("std::vector<int> a = {\n"
8484                "    aaaaaaaa,\n"
8485                "    aaaaaaaa,\n"
8486                "    aaaaaaaa,\n"
8487                "    aaaaaaaa,\n"
8488                "    aaaaaaaaaa,\n"
8489                "    aaaaaaaa,\n"
8490                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
8491                getLLVMStyleWithColumns(30));
8492   verifyFormat("vector<int> aaaa = {\n"
8493                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8494                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8495                "    aaaaaa.aaaaaaa,\n"
8496                "    aaaaaa.aaaaaaa,\n"
8497                "    aaaaaa.aaaaaaa,\n"
8498                "    aaaaaa.aaaaaaa,\n"
8499                "};");
8500 
8501   // Don't create hanging lists.
8502   verifyFormat("someFunction(Param, {List1, List2,\n"
8503                "                     List3});",
8504                getLLVMStyleWithColumns(35));
8505   verifyFormat("someFunction(Param, Param,\n"
8506                "             {List1, List2,\n"
8507                "              List3});",
8508                getLLVMStyleWithColumns(35));
8509   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
8510                "                               aaaaaaaaaaaaaaaaaaaaaaa);");
8511 }
8512 
8513 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
8514   FormatStyle DoNotMerge = getLLVMStyle();
8515   DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
8516 
8517   verifyFormat("void f() { return 42; }");
8518   verifyFormat("void f() {\n"
8519                "  return 42;\n"
8520                "}",
8521                DoNotMerge);
8522   verifyFormat("void f() {\n"
8523                "  // Comment\n"
8524                "}");
8525   verifyFormat("{\n"
8526                "#error {\n"
8527                "  int a;\n"
8528                "}");
8529   verifyFormat("{\n"
8530                "  int a;\n"
8531                "#error {\n"
8532                "}");
8533   verifyFormat("void f() {} // comment");
8534   verifyFormat("void f() { int a; } // comment");
8535   verifyFormat("void f() {\n"
8536                "} // comment",
8537                DoNotMerge);
8538   verifyFormat("void f() {\n"
8539                "  int a;\n"
8540                "} // comment",
8541                DoNotMerge);
8542   verifyFormat("void f() {\n"
8543                "} // comment",
8544                getLLVMStyleWithColumns(15));
8545 
8546   verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
8547   verifyFormat("void f() {\n  return 42;\n}", getLLVMStyleWithColumns(22));
8548 
8549   verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
8550   verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
8551   verifyFormat("class C {\n"
8552                "  C()\n"
8553                "      : iiiiiiii(nullptr),\n"
8554                "        kkkkkkk(nullptr),\n"
8555                "        mmmmmmm(nullptr),\n"
8556                "        nnnnnnn(nullptr) {}\n"
8557                "};",
8558                getGoogleStyle());
8559 
8560   FormatStyle NoColumnLimit = getLLVMStyle();
8561   NoColumnLimit.ColumnLimit = 0;
8562   EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
8563   EXPECT_EQ("class C {\n"
8564             "  A() : b(0) {}\n"
8565             "};",
8566             format("class C{A():b(0){}};", NoColumnLimit));
8567   EXPECT_EQ("A()\n"
8568             "    : b(0) {\n"
8569             "}",
8570             format("A()\n:b(0)\n{\n}", NoColumnLimit));
8571 
8572   FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
8573   DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
8574       FormatStyle::SFS_None;
8575   EXPECT_EQ("A()\n"
8576             "    : b(0) {\n"
8577             "}",
8578             format("A():b(0){}", DoNotMergeNoColumnLimit));
8579   EXPECT_EQ("A()\n"
8580             "    : b(0) {\n"
8581             "}",
8582             format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
8583 
8584   verifyFormat("#define A          \\\n"
8585                "  void f() {       \\\n"
8586                "    int i;         \\\n"
8587                "  }",
8588                getLLVMStyleWithColumns(20));
8589   verifyFormat("#define A           \\\n"
8590                "  void f() { int i; }",
8591                getLLVMStyleWithColumns(21));
8592   verifyFormat("#define A            \\\n"
8593                "  void f() {         \\\n"
8594                "    int i;           \\\n"
8595                "  }                  \\\n"
8596                "  int j;",
8597                getLLVMStyleWithColumns(22));
8598   verifyFormat("#define A             \\\n"
8599                "  void f() { int i; } \\\n"
8600                "  int j;",
8601                getLLVMStyleWithColumns(23));
8602 }
8603 
8604 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
8605   FormatStyle MergeEmptyOnly = getLLVMStyle();
8606   MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
8607   verifyFormat("class C {\n"
8608                "  int f() {}\n"
8609                "};",
8610                MergeEmptyOnly);
8611   verifyFormat("class C {\n"
8612                "  int f() {\n"
8613                "    return 42;\n"
8614                "  }\n"
8615                "};",
8616                MergeEmptyOnly);
8617   verifyFormat("int f() {}", MergeEmptyOnly);
8618   verifyFormat("int f() {\n"
8619                "  return 42;\n"
8620                "}",
8621                MergeEmptyOnly);
8622 
8623   // Also verify behavior when BraceWrapping.AfterFunction = true
8624   MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
8625   MergeEmptyOnly.BraceWrapping.AfterFunction = true;
8626   verifyFormat("int f() {}", MergeEmptyOnly);
8627   verifyFormat("class C {\n"
8628                "  int f() {}\n"
8629                "};",
8630                MergeEmptyOnly);
8631 }
8632 
8633 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
8634   FormatStyle MergeInlineOnly = getLLVMStyle();
8635   MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
8636   verifyFormat("class C {\n"
8637                "  int f() { return 42; }\n"
8638                "};",
8639                MergeInlineOnly);
8640   verifyFormat("int f() {\n"
8641                "  return 42;\n"
8642                "}",
8643                MergeInlineOnly);
8644 
8645   // SFS_Inline implies SFS_Empty
8646   verifyFormat("class C {\n"
8647                "  int f() {}\n"
8648                "};",
8649                MergeInlineOnly);
8650   verifyFormat("int f() {}", MergeInlineOnly);
8651 
8652   // Also verify behavior when BraceWrapping.AfterFunction = true
8653   MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
8654   MergeInlineOnly.BraceWrapping.AfterFunction = true;
8655   verifyFormat("class C {\n"
8656                "  int f() { return 42; }\n"
8657                "};",
8658                MergeInlineOnly);
8659   verifyFormat("int f()\n"
8660                "{\n"
8661                "  return 42;\n"
8662                "}",
8663                MergeInlineOnly);
8664 
8665   // SFS_Inline implies SFS_Empty
8666   verifyFormat("int f() {}", MergeInlineOnly);
8667   verifyFormat("class C {\n"
8668                "  int f() {}\n"
8669                "};",
8670                MergeInlineOnly);
8671 }
8672 
8673 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
8674   FormatStyle MergeInlineOnly = getLLVMStyle();
8675   MergeInlineOnly.AllowShortFunctionsOnASingleLine =
8676       FormatStyle::SFS_InlineOnly;
8677   verifyFormat("class C {\n"
8678                "  int f() { return 42; }\n"
8679                "};",
8680                MergeInlineOnly);
8681   verifyFormat("int f() {\n"
8682                "  return 42;\n"
8683                "}",
8684                MergeInlineOnly);
8685 
8686   // SFS_InlineOnly does not imply SFS_Empty
8687   verifyFormat("class C {\n"
8688                "  int f() {}\n"
8689                "};",
8690                MergeInlineOnly);
8691   verifyFormat("int f() {\n"
8692                "}",
8693                MergeInlineOnly);
8694 
8695   // Also verify behavior when BraceWrapping.AfterFunction = true
8696   MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
8697   MergeInlineOnly.BraceWrapping.AfterFunction = true;
8698   verifyFormat("class C {\n"
8699                "  int f() { return 42; }\n"
8700                "};",
8701                MergeInlineOnly);
8702   verifyFormat("int f()\n"
8703                "{\n"
8704                "  return 42;\n"
8705                "}",
8706                MergeInlineOnly);
8707 
8708   // SFS_InlineOnly does not imply SFS_Empty
8709   verifyFormat("int f()\n"
8710                "{\n"
8711                "}",
8712                MergeInlineOnly);
8713   verifyFormat("class C {\n"
8714                "  int f() {}\n"
8715                "};",
8716                MergeInlineOnly);
8717 }
8718 
8719 TEST_F(FormatTest, SplitEmptyFunction) {
8720   FormatStyle Style = getLLVMStyle();
8721   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
8722   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8723   Style.BraceWrapping.AfterFunction = true;
8724   Style.BraceWrapping.SplitEmptyFunction = false;
8725   Style.ColumnLimit = 40;
8726 
8727   verifyFormat("int f()\n"
8728                "{}",
8729                Style);
8730   verifyFormat("int f()\n"
8731                "{\n"
8732                "  return 42;\n"
8733                "}",
8734                Style);
8735   verifyFormat("int f()\n"
8736                "{\n"
8737                "  // some comment\n"
8738                "}",
8739                Style);
8740 
8741   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
8742   verifyFormat("int f() {}", Style);
8743   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8744                "{}",
8745                Style);
8746   verifyFormat("int f()\n"
8747                "{\n"
8748                "  return 0;\n"
8749                "}",
8750                Style);
8751 
8752   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
8753   verifyFormat("class Foo {\n"
8754                "  int f() {}\n"
8755                "};\n",
8756                Style);
8757   verifyFormat("class Foo {\n"
8758                "  int f() { return 0; }\n"
8759                "};\n",
8760                Style);
8761   verifyFormat("class Foo {\n"
8762                "  int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8763                "  {}\n"
8764                "};\n",
8765                Style);
8766   verifyFormat("class Foo {\n"
8767                "  int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8768                "  {\n"
8769                "    return 0;\n"
8770                "  }\n"
8771                "};\n",
8772                Style);
8773 
8774   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
8775   verifyFormat("int f() {}", Style);
8776   verifyFormat("int f() { return 0; }", Style);
8777   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8778                "{}",
8779                Style);
8780   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8781                "{\n"
8782                "  return 0;\n"
8783                "}",
8784                Style);
8785 }
8786 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
8787   FormatStyle Style = getLLVMStyle();
8788   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
8789   verifyFormat("#ifdef A\n"
8790                "int f() {}\n"
8791                "#else\n"
8792                "int g() {}\n"
8793                "#endif",
8794                Style);
8795 }
8796 
8797 TEST_F(FormatTest, SplitEmptyClass) {
8798   FormatStyle Style = getLLVMStyle();
8799   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8800   Style.BraceWrapping.AfterClass = true;
8801   Style.BraceWrapping.SplitEmptyRecord = false;
8802 
8803   verifyFormat("class Foo\n"
8804                "{};",
8805                Style);
8806   verifyFormat("/* something */ class Foo\n"
8807                "{};",
8808                Style);
8809   verifyFormat("template <typename X> class Foo\n"
8810                "{};",
8811                Style);
8812   verifyFormat("class Foo\n"
8813                "{\n"
8814                "  Foo();\n"
8815                "};",
8816                Style);
8817   verifyFormat("typedef class Foo\n"
8818                "{\n"
8819                "} Foo_t;",
8820                Style);
8821 }
8822 
8823 TEST_F(FormatTest, SplitEmptyStruct) {
8824   FormatStyle Style = getLLVMStyle();
8825   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8826   Style.BraceWrapping.AfterStruct = true;
8827   Style.BraceWrapping.SplitEmptyRecord = false;
8828 
8829   verifyFormat("struct Foo\n"
8830                "{};",
8831                Style);
8832   verifyFormat("/* something */ struct Foo\n"
8833                "{};",
8834                Style);
8835   verifyFormat("template <typename X> struct Foo\n"
8836                "{};",
8837                Style);
8838   verifyFormat("struct Foo\n"
8839                "{\n"
8840                "  Foo();\n"
8841                "};",
8842                Style);
8843   verifyFormat("typedef struct Foo\n"
8844                "{\n"
8845                "} Foo_t;",
8846                Style);
8847   // typedef struct Bar {} Bar_t;
8848 }
8849 
8850 TEST_F(FormatTest, SplitEmptyUnion) {
8851   FormatStyle Style = getLLVMStyle();
8852   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8853   Style.BraceWrapping.AfterUnion = true;
8854   Style.BraceWrapping.SplitEmptyRecord = false;
8855 
8856   verifyFormat("union Foo\n"
8857                "{};",
8858                Style);
8859   verifyFormat("/* something */ union Foo\n"
8860                "{};",
8861                Style);
8862   verifyFormat("union Foo\n"
8863                "{\n"
8864                "  A,\n"
8865                "};",
8866                Style);
8867   verifyFormat("typedef union Foo\n"
8868                "{\n"
8869                "} Foo_t;",
8870                Style);
8871 }
8872 
8873 TEST_F(FormatTest, SplitEmptyNamespace) {
8874   FormatStyle Style = getLLVMStyle();
8875   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8876   Style.BraceWrapping.AfterNamespace = true;
8877   Style.BraceWrapping.SplitEmptyNamespace = false;
8878 
8879   verifyFormat("namespace Foo\n"
8880                "{};",
8881                Style);
8882   verifyFormat("/* something */ namespace Foo\n"
8883                "{};",
8884                Style);
8885   verifyFormat("inline namespace Foo\n"
8886                "{};",
8887                Style);
8888   verifyFormat("/* something */ inline namespace Foo\n"
8889                "{};",
8890                Style);
8891   verifyFormat("export namespace Foo\n"
8892                "{};",
8893                Style);
8894   verifyFormat("namespace Foo\n"
8895                "{\n"
8896                "void Bar();\n"
8897                "};",
8898                Style);
8899 }
8900 
8901 TEST_F(FormatTest, NeverMergeShortRecords) {
8902   FormatStyle Style = getLLVMStyle();
8903 
8904   verifyFormat("class Foo {\n"
8905                "  Foo();\n"
8906                "};",
8907                Style);
8908   verifyFormat("typedef class Foo {\n"
8909                "  Foo();\n"
8910                "} Foo_t;",
8911                Style);
8912   verifyFormat("struct Foo {\n"
8913                "  Foo();\n"
8914                "};",
8915                Style);
8916   verifyFormat("typedef struct Foo {\n"
8917                "  Foo();\n"
8918                "} Foo_t;",
8919                Style);
8920   verifyFormat("union Foo {\n"
8921                "  A,\n"
8922                "};",
8923                Style);
8924   verifyFormat("typedef union Foo {\n"
8925                "  A,\n"
8926                "} Foo_t;",
8927                Style);
8928   verifyFormat("namespace Foo {\n"
8929                "void Bar();\n"
8930                "};",
8931                Style);
8932 
8933   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8934   Style.BraceWrapping.AfterClass = true;
8935   Style.BraceWrapping.AfterStruct = true;
8936   Style.BraceWrapping.AfterUnion = true;
8937   Style.BraceWrapping.AfterNamespace = true;
8938   verifyFormat("class Foo\n"
8939                "{\n"
8940                "  Foo();\n"
8941                "};",
8942                Style);
8943   verifyFormat("typedef class Foo\n"
8944                "{\n"
8945                "  Foo();\n"
8946                "} Foo_t;",
8947                Style);
8948   verifyFormat("struct Foo\n"
8949                "{\n"
8950                "  Foo();\n"
8951                "};",
8952                Style);
8953   verifyFormat("typedef struct Foo\n"
8954                "{\n"
8955                "  Foo();\n"
8956                "} Foo_t;",
8957                Style);
8958   verifyFormat("union Foo\n"
8959                "{\n"
8960                "  A,\n"
8961                "};",
8962                Style);
8963   verifyFormat("typedef union Foo\n"
8964                "{\n"
8965                "  A,\n"
8966                "} Foo_t;",
8967                Style);
8968   verifyFormat("namespace Foo\n"
8969                "{\n"
8970                "void Bar();\n"
8971                "};",
8972                Style);
8973 }
8974 
8975 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
8976   // Elaborate type variable declarations.
8977   verifyFormat("struct foo a = {bar};\nint n;");
8978   verifyFormat("class foo a = {bar};\nint n;");
8979   verifyFormat("union foo a = {bar};\nint n;");
8980 
8981   // Elaborate types inside function definitions.
8982   verifyFormat("struct foo f() {}\nint n;");
8983   verifyFormat("class foo f() {}\nint n;");
8984   verifyFormat("union foo f() {}\nint n;");
8985 
8986   // Templates.
8987   verifyFormat("template <class X> void f() {}\nint n;");
8988   verifyFormat("template <struct X> void f() {}\nint n;");
8989   verifyFormat("template <union X> void f() {}\nint n;");
8990 
8991   // Actual definitions...
8992   verifyFormat("struct {\n} n;");
8993   verifyFormat(
8994       "template <template <class T, class Y>, class Z> class X {\n} n;");
8995   verifyFormat("union Z {\n  int n;\n} x;");
8996   verifyFormat("class MACRO Z {\n} n;");
8997   verifyFormat("class MACRO(X) Z {\n} n;");
8998   verifyFormat("class __attribute__(X) Z {\n} n;");
8999   verifyFormat("class __declspec(X) Z {\n} n;");
9000   verifyFormat("class A##B##C {\n} n;");
9001   verifyFormat("class alignas(16) Z {\n} n;");
9002   verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
9003   verifyFormat("class MACROA MACRO(X) Z {\n} n;");
9004 
9005   // Redefinition from nested context:
9006   verifyFormat("class A::B::C {\n} n;");
9007 
9008   // Template definitions.
9009   verifyFormat(
9010       "template <typename F>\n"
9011       "Matcher(const Matcher<F> &Other,\n"
9012       "        typename enable_if_c<is_base_of<F, T>::value &&\n"
9013       "                             !is_same<F, T>::value>::type * = 0)\n"
9014       "    : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
9015 
9016   // FIXME: This is still incorrectly handled at the formatter side.
9017   verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
9018   verifyFormat("int i = SomeFunction(a<b, a> b);");
9019 
9020   // FIXME:
9021   // This now gets parsed incorrectly as class definition.
9022   // verifyFormat("class A<int> f() {\n}\nint n;");
9023 
9024   // Elaborate types where incorrectly parsing the structural element would
9025   // break the indent.
9026   verifyFormat("if (true)\n"
9027                "  class X x;\n"
9028                "else\n"
9029                "  f();\n");
9030 
9031   // This is simply incomplete. Formatting is not important, but must not crash.
9032   verifyFormat("class A:");
9033 }
9034 
9035 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
9036   EXPECT_EQ("#error Leave     all         white!!!!! space* alone!\n",
9037             format("#error Leave     all         white!!!!! space* alone!\n"));
9038   EXPECT_EQ(
9039       "#warning Leave     all         white!!!!! space* alone!\n",
9040       format("#warning Leave     all         white!!!!! space* alone!\n"));
9041   EXPECT_EQ("#error 1", format("  #  error   1"));
9042   EXPECT_EQ("#warning 1", format("  #  warning 1"));
9043 }
9044 
9045 TEST_F(FormatTest, FormatHashIfExpressions) {
9046   verifyFormat("#if AAAA && BBBB");
9047   verifyFormat("#if (AAAA && BBBB)");
9048   verifyFormat("#elif (AAAA && BBBB)");
9049   // FIXME: Come up with a better indentation for #elif.
9050   verifyFormat(
9051       "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) &&  \\\n"
9052       "    defined(BBBBBBBB)\n"
9053       "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) &&  \\\n"
9054       "    defined(BBBBBBBB)\n"
9055       "#endif",
9056       getLLVMStyleWithColumns(65));
9057 }
9058 
9059 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
9060   FormatStyle AllowsMergedIf = getGoogleStyle();
9061   AllowsMergedIf.AllowShortIfStatementsOnASingleLine =
9062       FormatStyle::SIS_WithoutElse;
9063   verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
9064   verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
9065   verifyFormat("if (true)\n#error E\n  return 42;", AllowsMergedIf);
9066   EXPECT_EQ("if (true) return 42;",
9067             format("if (true)\nreturn 42;", AllowsMergedIf));
9068   FormatStyle ShortMergedIf = AllowsMergedIf;
9069   ShortMergedIf.ColumnLimit = 25;
9070   verifyFormat("#define A \\\n"
9071                "  if (true) return 42;",
9072                ShortMergedIf);
9073   verifyFormat("#define A \\\n"
9074                "  f();    \\\n"
9075                "  if (true)\n"
9076                "#define B",
9077                ShortMergedIf);
9078   verifyFormat("#define A \\\n"
9079                "  f();    \\\n"
9080                "  if (true)\n"
9081                "g();",
9082                ShortMergedIf);
9083   verifyFormat("{\n"
9084                "#ifdef A\n"
9085                "  // Comment\n"
9086                "  if (true) continue;\n"
9087                "#endif\n"
9088                "  // Comment\n"
9089                "  if (true) continue;\n"
9090                "}",
9091                ShortMergedIf);
9092   ShortMergedIf.ColumnLimit = 33;
9093   verifyFormat("#define A \\\n"
9094                "  if constexpr (true) return 42;",
9095                ShortMergedIf);
9096   verifyFormat("#define A \\\n"
9097                "  if CONSTEXPR (true) return 42;",
9098                ShortMergedIf);
9099   ShortMergedIf.ColumnLimit = 29;
9100   verifyFormat("#define A                   \\\n"
9101                "  if (aaaaaaaaaa) return 1; \\\n"
9102                "  return 2;",
9103                ShortMergedIf);
9104   ShortMergedIf.ColumnLimit = 28;
9105   verifyFormat("#define A         \\\n"
9106                "  if (aaaaaaaaaa) \\\n"
9107                "    return 1;     \\\n"
9108                "  return 2;",
9109                ShortMergedIf);
9110   verifyFormat("#define A                \\\n"
9111                "  if constexpr (aaaaaaa) \\\n"
9112                "    return 1;            \\\n"
9113                "  return 2;",
9114                ShortMergedIf);
9115   verifyFormat("#define A                \\\n"
9116                "  if CONSTEXPR (aaaaaaa) \\\n"
9117                "    return 1;            \\\n"
9118                "  return 2;",
9119                ShortMergedIf);
9120 }
9121 
9122 TEST_F(FormatTest, FormatStarDependingOnContext) {
9123   verifyFormat("void f(int *a);");
9124   verifyFormat("void f() { f(fint * b); }");
9125   verifyFormat("class A {\n  void f(int *a);\n};");
9126   verifyFormat("class A {\n  int *a;\n};");
9127   verifyFormat("namespace a {\n"
9128                "namespace b {\n"
9129                "class A {\n"
9130                "  void f() {}\n"
9131                "  int *a;\n"
9132                "};\n"
9133                "} // namespace b\n"
9134                "} // namespace a");
9135 }
9136 
9137 TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
9138   verifyFormat("while");
9139   verifyFormat("operator");
9140 }
9141 
9142 TEST_F(FormatTest, SkipsDeeplyNestedLines) {
9143   // This code would be painfully slow to format if we didn't skip it.
9144   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
9145                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
9146                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
9147                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
9148                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
9149                    "A(1, 1)\n"
9150                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
9151                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9152                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9153                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9154                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9155                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9156                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9157                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9158                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9159                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
9160   // Deeply nested part is untouched, rest is formatted.
9161   EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
9162             format(std::string("int    i;\n") + Code + "int    j;\n",
9163                    getLLVMStyle(), SC_ExpectIncomplete));
9164 }
9165 
9166 //===----------------------------------------------------------------------===//
9167 // Objective-C tests.
9168 //===----------------------------------------------------------------------===//
9169 
9170 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
9171   verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
9172   EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
9173             format("-(NSUInteger)indexOfObject:(id)anObject;"));
9174   EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
9175   EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
9176   EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
9177             format("-(NSInteger)Method3:(id)anObject;"));
9178   EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
9179             format("-(NSInteger)Method4:(id)anObject;"));
9180   EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
9181             format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
9182   EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
9183             format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
9184   EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
9185             "forAllCells:(BOOL)flag;",
9186             format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
9187                    "forAllCells:(BOOL)flag;"));
9188 
9189   // Very long objectiveC method declaration.
9190   verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
9191                "    (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
9192   verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
9193                "                    inRange:(NSRange)range\n"
9194                "                   outRange:(NSRange)out_range\n"
9195                "                  outRange1:(NSRange)out_range1\n"
9196                "                  outRange2:(NSRange)out_range2\n"
9197                "                  outRange3:(NSRange)out_range3\n"
9198                "                  outRange4:(NSRange)out_range4\n"
9199                "                  outRange5:(NSRange)out_range5\n"
9200                "                  outRange6:(NSRange)out_range6\n"
9201                "                  outRange7:(NSRange)out_range7\n"
9202                "                  outRange8:(NSRange)out_range8\n"
9203                "                  outRange9:(NSRange)out_range9;");
9204 
9205   // When the function name has to be wrapped.
9206   FormatStyle Style = getLLVMStyle();
9207   // ObjC ignores IndentWrappedFunctionNames when wrapping methods
9208   // and always indents instead.
9209   Style.IndentWrappedFunctionNames = false;
9210   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
9211                "    veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
9212                "               anotherName:(NSString)bbbbbbbbbbbbbb {\n"
9213                "}",
9214                Style);
9215   Style.IndentWrappedFunctionNames = true;
9216   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
9217                "    veryLooooooooooongName:(NSString)cccccccccccccc\n"
9218                "               anotherName:(NSString)dddddddddddddd {\n"
9219                "}",
9220                Style);
9221 
9222   verifyFormat("- (int)sum:(vector<int>)numbers;");
9223   verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
9224   // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
9225   // protocol lists (but not for template classes):
9226   // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
9227 
9228   verifyFormat("- (int (*)())foo:(int (*)())f;");
9229   verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
9230 
9231   // If there's no return type (very rare in practice!), LLVM and Google style
9232   // agree.
9233   verifyFormat("- foo;");
9234   verifyFormat("- foo:(int)f;");
9235   verifyGoogleFormat("- foo:(int)foo;");
9236 }
9237 
9238 TEST_F(FormatTest, BreaksStringLiterals) {
9239   EXPECT_EQ("\"some text \"\n"
9240             "\"other\";",
9241             format("\"some text other\";", getLLVMStyleWithColumns(12)));
9242   EXPECT_EQ("\"some text \"\n"
9243             "\"other\";",
9244             format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
9245   EXPECT_EQ(
9246       "#define A  \\\n"
9247       "  \"some \"  \\\n"
9248       "  \"text \"  \\\n"
9249       "  \"other\";",
9250       format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
9251   EXPECT_EQ(
9252       "#define A  \\\n"
9253       "  \"so \"    \\\n"
9254       "  \"text \"  \\\n"
9255       "  \"other\";",
9256       format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
9257 
9258   EXPECT_EQ("\"some text\"",
9259             format("\"some text\"", getLLVMStyleWithColumns(1)));
9260   EXPECT_EQ("\"some text\"",
9261             format("\"some text\"", getLLVMStyleWithColumns(11)));
9262   EXPECT_EQ("\"some \"\n"
9263             "\"text\"",
9264             format("\"some text\"", getLLVMStyleWithColumns(10)));
9265   EXPECT_EQ("\"some \"\n"
9266             "\"text\"",
9267             format("\"some text\"", getLLVMStyleWithColumns(7)));
9268   EXPECT_EQ("\"some\"\n"
9269             "\" tex\"\n"
9270             "\"t\"",
9271             format("\"some text\"", getLLVMStyleWithColumns(6)));
9272   EXPECT_EQ("\"some\"\n"
9273             "\" tex\"\n"
9274             "\" and\"",
9275             format("\"some tex and\"", getLLVMStyleWithColumns(6)));
9276   EXPECT_EQ("\"some\"\n"
9277             "\"/tex\"\n"
9278             "\"/and\"",
9279             format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
9280 
9281   EXPECT_EQ("variable =\n"
9282             "    \"long string \"\n"
9283             "    \"literal\";",
9284             format("variable = \"long string literal\";",
9285                    getLLVMStyleWithColumns(20)));
9286 
9287   EXPECT_EQ("variable = f(\n"
9288             "    \"long string \"\n"
9289             "    \"literal\",\n"
9290             "    short,\n"
9291             "    loooooooooooooooooooong);",
9292             format("variable = f(\"long string literal\", short, "
9293                    "loooooooooooooooooooong);",
9294                    getLLVMStyleWithColumns(20)));
9295 
9296   EXPECT_EQ(
9297       "f(g(\"long string \"\n"
9298       "    \"literal\"),\n"
9299       "  b);",
9300       format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
9301   EXPECT_EQ("f(g(\"long string \"\n"
9302             "    \"literal\",\n"
9303             "    a),\n"
9304             "  b);",
9305             format("f(g(\"long string literal\", a), b);",
9306                    getLLVMStyleWithColumns(20)));
9307   EXPECT_EQ(
9308       "f(\"one two\".split(\n"
9309       "    variable));",
9310       format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
9311   EXPECT_EQ("f(\"one two three four five six \"\n"
9312             "  \"seven\".split(\n"
9313             "      really_looooong_variable));",
9314             format("f(\"one two three four five six seven\"."
9315                    "split(really_looooong_variable));",
9316                    getLLVMStyleWithColumns(33)));
9317 
9318   EXPECT_EQ("f(\"some \"\n"
9319             "  \"text\",\n"
9320             "  other);",
9321             format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
9322 
9323   // Only break as a last resort.
9324   verifyFormat(
9325       "aaaaaaaaaaaaaaaaaaaa(\n"
9326       "    aaaaaaaaaaaaaaaaaaaa,\n"
9327       "    aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
9328 
9329   EXPECT_EQ("\"splitmea\"\n"
9330             "\"trandomp\"\n"
9331             "\"oint\"",
9332             format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
9333 
9334   EXPECT_EQ("\"split/\"\n"
9335             "\"pathat/\"\n"
9336             "\"slashes\"",
9337             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
9338 
9339   EXPECT_EQ("\"split/\"\n"
9340             "\"pathat/\"\n"
9341             "\"slashes\"",
9342             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
9343   EXPECT_EQ("\"split at \"\n"
9344             "\"spaces/at/\"\n"
9345             "\"slashes.at.any$\"\n"
9346             "\"non-alphanumeric%\"\n"
9347             "\"1111111111characte\"\n"
9348             "\"rs\"",
9349             format("\"split at "
9350                    "spaces/at/"
9351                    "slashes.at."
9352                    "any$non-"
9353                    "alphanumeric%"
9354                    "1111111111characte"
9355                    "rs\"",
9356                    getLLVMStyleWithColumns(20)));
9357 
9358   // Verify that splitting the strings understands
9359   // Style::AlwaysBreakBeforeMultilineStrings.
9360   EXPECT_EQ("aaaaaaaaaaaa(\n"
9361             "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
9362             "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
9363             format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
9364                    "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
9365                    "aaaaaaaaaaaaaaaaaaaaaa\");",
9366                    getGoogleStyle()));
9367   EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
9368             "       \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
9369             format("return \"aaaaaaaaaaaaaaaaaaaaaa "
9370                    "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
9371                    "aaaaaaaaaaaaaaaaaaaaaa\";",
9372                    getGoogleStyle()));
9373   EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
9374             "                \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
9375             format("llvm::outs() << "
9376                    "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
9377                    "aaaaaaaaaaaaaaaaaaa\";"));
9378   EXPECT_EQ("ffff(\n"
9379             "    {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
9380             "     \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
9381             format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
9382                    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
9383                    getGoogleStyle()));
9384 
9385   FormatStyle Style = getLLVMStyleWithColumns(12);
9386   Style.BreakStringLiterals = false;
9387   EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
9388 
9389   FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
9390   AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
9391   EXPECT_EQ("#define A \\\n"
9392             "  \"some \" \\\n"
9393             "  \"text \" \\\n"
9394             "  \"other\";",
9395             format("#define A \"some text other\";", AlignLeft));
9396 }
9397 
9398 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) {
9399   EXPECT_EQ("C a = \"some more \"\n"
9400             "      \"text\";",
9401             format("C a = \"some more text\";", getLLVMStyleWithColumns(18)));
9402 }
9403 
9404 TEST_F(FormatTest, FullyRemoveEmptyLines) {
9405   FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
9406   NoEmptyLines.MaxEmptyLinesToKeep = 0;
9407   EXPECT_EQ("int i = a(b());",
9408             format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
9409 }
9410 
9411 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
9412   EXPECT_EQ(
9413       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9414       "(\n"
9415       "    \"x\t\");",
9416       format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9417              "aaaaaaa("
9418              "\"x\t\");"));
9419 }
9420 
9421 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
9422   EXPECT_EQ(
9423       "u8\"utf8 string \"\n"
9424       "u8\"literal\";",
9425       format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
9426   EXPECT_EQ(
9427       "u\"utf16 string \"\n"
9428       "u\"literal\";",
9429       format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
9430   EXPECT_EQ(
9431       "U\"utf32 string \"\n"
9432       "U\"literal\";",
9433       format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
9434   EXPECT_EQ("L\"wide string \"\n"
9435             "L\"literal\";",
9436             format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
9437   EXPECT_EQ("@\"NSString \"\n"
9438             "@\"literal\";",
9439             format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
9440   verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
9441 
9442   // This input makes clang-format try to split the incomplete unicode escape
9443   // sequence, which used to lead to a crasher.
9444   verifyNoCrash(
9445       "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
9446       getLLVMStyleWithColumns(60));
9447 }
9448 
9449 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
9450   FormatStyle Style = getGoogleStyleWithColumns(15);
9451   EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
9452   EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
9453   EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
9454   EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
9455   EXPECT_EQ("u8R\"x(raw literal)x\";",
9456             format("u8R\"x(raw literal)x\";", Style));
9457 }
9458 
9459 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
9460   FormatStyle Style = getLLVMStyleWithColumns(20);
9461   EXPECT_EQ(
9462       "_T(\"aaaaaaaaaaaaaa\")\n"
9463       "_T(\"aaaaaaaaaaaaaa\")\n"
9464       "_T(\"aaaaaaaaaaaa\")",
9465       format("  _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
9466   EXPECT_EQ("f(x,\n"
9467             "  _T(\"aaaaaaaaaaaa\")\n"
9468             "  _T(\"aaa\"),\n"
9469             "  z);",
9470             format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
9471 
9472   // FIXME: Handle embedded spaces in one iteration.
9473   //  EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
9474   //            "_T(\"aaaaaaaaaaaaa\")\n"
9475   //            "_T(\"aaaaaaaaaaaaa\")\n"
9476   //            "_T(\"a\")",
9477   //            format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
9478   //                   getLLVMStyleWithColumns(20)));
9479   EXPECT_EQ(
9480       "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
9481       format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
9482   EXPECT_EQ("f(\n"
9483             "#if !TEST\n"
9484             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
9485             "#endif\n"
9486             ");",
9487             format("f(\n"
9488                    "#if !TEST\n"
9489                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
9490                    "#endif\n"
9491                    ");"));
9492   EXPECT_EQ("f(\n"
9493             "\n"
9494             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
9495             format("f(\n"
9496                    "\n"
9497                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
9498 }
9499 
9500 TEST_F(FormatTest, BreaksStringLiteralOperands) {
9501   // In a function call with two operands, the second can be broken with no line
9502   // break before it.
9503   EXPECT_EQ(
9504       "func(a, \"long long \"\n"
9505       "        \"long long\");",
9506       format("func(a, \"long long long long\");", getLLVMStyleWithColumns(24)));
9507   // In a function call with three operands, the second must be broken with a
9508   // line break before it.
9509   EXPECT_EQ("func(a,\n"
9510             "     \"long long long \"\n"
9511             "     \"long\",\n"
9512             "     c);",
9513             format("func(a, \"long long long long\", c);",
9514                    getLLVMStyleWithColumns(24)));
9515   // In a function call with three operands, the third must be broken with a
9516   // line break before it.
9517   EXPECT_EQ("func(a, b,\n"
9518             "     \"long long long \"\n"
9519             "     \"long\");",
9520             format("func(a, b, \"long long long long\");",
9521                    getLLVMStyleWithColumns(24)));
9522   // In a function call with three operands, both the second and the third must
9523   // be broken with a line break before them.
9524   EXPECT_EQ("func(a,\n"
9525             "     \"long long long \"\n"
9526             "     \"long\",\n"
9527             "     \"long long long \"\n"
9528             "     \"long\");",
9529             format("func(a, \"long long long long\", \"long long long long\");",
9530                    getLLVMStyleWithColumns(24)));
9531   // In a chain of << with two operands, the second can be broken with no line
9532   // break before it.
9533   EXPECT_EQ("a << \"line line \"\n"
9534             "     \"line\";",
9535             format("a << \"line line line\";", getLLVMStyleWithColumns(20)));
9536   // In a chain of << with three operands, the second can be broken with no line
9537   // break before it.
9538   EXPECT_EQ(
9539       "abcde << \"line \"\n"
9540       "         \"line line\"\n"
9541       "      << c;",
9542       format("abcde << \"line line line\" << c;", getLLVMStyleWithColumns(20)));
9543   // In a chain of << with three operands, the third must be broken with a line
9544   // break before it.
9545   EXPECT_EQ(
9546       "a << b\n"
9547       "  << \"line line \"\n"
9548       "     \"line\";",
9549       format("a << b << \"line line line\";", getLLVMStyleWithColumns(20)));
9550   // In a chain of << with three operands, the second can be broken with no line
9551   // break before it and the third must be broken with a line break before it.
9552   EXPECT_EQ("abcd << \"line line \"\n"
9553             "        \"line\"\n"
9554             "     << \"line line \"\n"
9555             "        \"line\";",
9556             format("abcd << \"line line line\" << \"line line line\";",
9557                    getLLVMStyleWithColumns(20)));
9558   // In a chain of binary operators with two operands, the second can be broken
9559   // with no line break before it.
9560   EXPECT_EQ(
9561       "abcd + \"line line \"\n"
9562       "       \"line line\";",
9563       format("abcd + \"line line line line\";", getLLVMStyleWithColumns(20)));
9564   // In a chain of binary operators with three operands, the second must be
9565   // broken with a line break before it.
9566   EXPECT_EQ("abcd +\n"
9567             "    \"line line \"\n"
9568             "    \"line line\" +\n"
9569             "    e;",
9570             format("abcd + \"line line line line\" + e;",
9571                    getLLVMStyleWithColumns(20)));
9572   // In a function call with two operands, with AlignAfterOpenBracket enabled,
9573   // the first must be broken with a line break before it.
9574   FormatStyle Style = getLLVMStyleWithColumns(25);
9575   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
9576   EXPECT_EQ("someFunction(\n"
9577             "    \"long long long \"\n"
9578             "    \"long\",\n"
9579             "    a);",
9580             format("someFunction(\"long long long long\", a);", Style));
9581 }
9582 
9583 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
9584   EXPECT_EQ(
9585       "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
9586       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
9587       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
9588       format("aaaaaaaaaaa  =  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
9589              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
9590              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
9591 }
9592 
9593 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
9594   EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
9595             format("f(g(R\"x(raw literal)x\",   a), b);", getGoogleStyle()));
9596   EXPECT_EQ("fffffffffff(g(R\"x(\n"
9597             "multiline raw string literal xxxxxxxxxxxxxx\n"
9598             ")x\",\n"
9599             "              a),\n"
9600             "            b);",
9601             format("fffffffffff(g(R\"x(\n"
9602                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9603                    ")x\", a), b);",
9604                    getGoogleStyleWithColumns(20)));
9605   EXPECT_EQ("fffffffffff(\n"
9606             "    g(R\"x(qqq\n"
9607             "multiline raw string literal xxxxxxxxxxxxxx\n"
9608             ")x\",\n"
9609             "      a),\n"
9610             "    b);",
9611             format("fffffffffff(g(R\"x(qqq\n"
9612                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9613                    ")x\", a), b);",
9614                    getGoogleStyleWithColumns(20)));
9615 
9616   EXPECT_EQ("fffffffffff(R\"x(\n"
9617             "multiline raw string literal xxxxxxxxxxxxxx\n"
9618             ")x\");",
9619             format("fffffffffff(R\"x(\n"
9620                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9621                    ")x\");",
9622                    getGoogleStyleWithColumns(20)));
9623   EXPECT_EQ("fffffffffff(R\"x(\n"
9624             "multiline raw string literal xxxxxxxxxxxxxx\n"
9625             ")x\" + bbbbbb);",
9626             format("fffffffffff(R\"x(\n"
9627                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9628                    ")x\" +   bbbbbb);",
9629                    getGoogleStyleWithColumns(20)));
9630   EXPECT_EQ("fffffffffff(\n"
9631             "    R\"x(\n"
9632             "multiline raw string literal xxxxxxxxxxxxxx\n"
9633             ")x\" +\n"
9634             "    bbbbbb);",
9635             format("fffffffffff(\n"
9636                    " R\"x(\n"
9637                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9638                    ")x\" + bbbbbb);",
9639                    getGoogleStyleWithColumns(20)));
9640   EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);",
9641             format("fffffffffff(\n"
9642                    " R\"(single line raw string)\" + bbbbbb);"));
9643 }
9644 
9645 TEST_F(FormatTest, SkipsUnknownStringLiterals) {
9646   verifyFormat("string a = \"unterminated;");
9647   EXPECT_EQ("function(\"unterminated,\n"
9648             "         OtherParameter);",
9649             format("function(  \"unterminated,\n"
9650                    "    OtherParameter);"));
9651 }
9652 
9653 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
9654   FormatStyle Style = getLLVMStyle();
9655   Style.Standard = FormatStyle::LS_Cpp03;
9656   EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
9657             format("#define x(_a) printf(\"foo\"_a);", Style));
9658 }
9659 
9660 TEST_F(FormatTest, CppLexVersion) {
9661   FormatStyle Style = getLLVMStyle();
9662   // Formatting of x * y differs if x is a type.
9663   verifyFormat("void foo() { MACRO(a * b); }", Style);
9664   verifyFormat("void foo() { MACRO(int *b); }", Style);
9665 
9666   // LLVM style uses latest lexer.
9667   verifyFormat("void foo() { MACRO(char8_t *b); }", Style);
9668   Style.Standard = FormatStyle::LS_Cpp17;
9669   // But in c++17, char8_t isn't a keyword.
9670   verifyFormat("void foo() { MACRO(char8_t * b); }", Style);
9671 }
9672 
9673 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
9674 
9675 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
9676   EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
9677             "             \"ddeeefff\");",
9678             format("someFunction(\"aaabbbcccdddeeefff\");",
9679                    getLLVMStyleWithColumns(25)));
9680   EXPECT_EQ("someFunction1234567890(\n"
9681             "    \"aaabbbcccdddeeefff\");",
9682             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
9683                    getLLVMStyleWithColumns(26)));
9684   EXPECT_EQ("someFunction1234567890(\n"
9685             "    \"aaabbbcccdddeeeff\"\n"
9686             "    \"f\");",
9687             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
9688                    getLLVMStyleWithColumns(25)));
9689   EXPECT_EQ("someFunction1234567890(\n"
9690             "    \"aaabbbcccdddeeeff\"\n"
9691             "    \"f\");",
9692             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
9693                    getLLVMStyleWithColumns(24)));
9694   EXPECT_EQ("someFunction(\n"
9695             "    \"aaabbbcc ddde \"\n"
9696             "    \"efff\");",
9697             format("someFunction(\"aaabbbcc ddde efff\");",
9698                    getLLVMStyleWithColumns(25)));
9699   EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
9700             "             \"ddeeefff\");",
9701             format("someFunction(\"aaabbbccc ddeeefff\");",
9702                    getLLVMStyleWithColumns(25)));
9703   EXPECT_EQ("someFunction1234567890(\n"
9704             "    \"aaabb \"\n"
9705             "    \"cccdddeeefff\");",
9706             format("someFunction1234567890(\"aaabb cccdddeeefff\");",
9707                    getLLVMStyleWithColumns(25)));
9708   EXPECT_EQ("#define A          \\\n"
9709             "  string s =       \\\n"
9710             "      \"123456789\"  \\\n"
9711             "      \"0\";         \\\n"
9712             "  int i;",
9713             format("#define A string s = \"1234567890\"; int i;",
9714                    getLLVMStyleWithColumns(20)));
9715   EXPECT_EQ("someFunction(\n"
9716             "    \"aaabbbcc \"\n"
9717             "    \"dddeeefff\");",
9718             format("someFunction(\"aaabbbcc dddeeefff\");",
9719                    getLLVMStyleWithColumns(25)));
9720 }
9721 
9722 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
9723   EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
9724   EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
9725   EXPECT_EQ("\"test\"\n"
9726             "\"\\n\"",
9727             format("\"test\\n\"", getLLVMStyleWithColumns(7)));
9728   EXPECT_EQ("\"tes\\\\\"\n"
9729             "\"n\"",
9730             format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
9731   EXPECT_EQ("\"\\\\\\\\\"\n"
9732             "\"\\n\"",
9733             format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
9734   EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
9735   EXPECT_EQ("\"\\uff01\"\n"
9736             "\"test\"",
9737             format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
9738   EXPECT_EQ("\"\\Uff01ff02\"",
9739             format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
9740   EXPECT_EQ("\"\\x000000000001\"\n"
9741             "\"next\"",
9742             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
9743   EXPECT_EQ("\"\\x000000000001next\"",
9744             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
9745   EXPECT_EQ("\"\\x000000000001\"",
9746             format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
9747   EXPECT_EQ("\"test\"\n"
9748             "\"\\000000\"\n"
9749             "\"000001\"",
9750             format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
9751   EXPECT_EQ("\"test\\000\"\n"
9752             "\"00000000\"\n"
9753             "\"1\"",
9754             format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
9755 }
9756 
9757 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
9758   verifyFormat("void f() {\n"
9759                "  return g() {}\n"
9760                "  void h() {}");
9761   verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
9762                "g();\n"
9763                "}");
9764 }
9765 
9766 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
9767   verifyFormat(
9768       "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
9769 }
9770 
9771 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
9772   verifyFormat("class X {\n"
9773                "  void f() {\n"
9774                "  }\n"
9775                "};",
9776                getLLVMStyleWithColumns(12));
9777 }
9778 
9779 TEST_F(FormatTest, ConfigurableIndentWidth) {
9780   FormatStyle EightIndent = getLLVMStyleWithColumns(18);
9781   EightIndent.IndentWidth = 8;
9782   EightIndent.ContinuationIndentWidth = 8;
9783   verifyFormat("void f() {\n"
9784                "        someFunction();\n"
9785                "        if (true) {\n"
9786                "                f();\n"
9787                "        }\n"
9788                "}",
9789                EightIndent);
9790   verifyFormat("class X {\n"
9791                "        void f() {\n"
9792                "        }\n"
9793                "};",
9794                EightIndent);
9795   verifyFormat("int x[] = {\n"
9796                "        call(),\n"
9797                "        call()};",
9798                EightIndent);
9799 }
9800 
9801 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
9802   verifyFormat("double\n"
9803                "f();",
9804                getLLVMStyleWithColumns(8));
9805 }
9806 
9807 TEST_F(FormatTest, ConfigurableUseOfTab) {
9808   FormatStyle Tab = getLLVMStyleWithColumns(42);
9809   Tab.IndentWidth = 8;
9810   Tab.UseTab = FormatStyle::UT_Always;
9811   Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
9812 
9813   EXPECT_EQ("if (aaaaaaaa && // q\n"
9814             "    bb)\t\t// w\n"
9815             "\t;",
9816             format("if (aaaaaaaa &&// q\n"
9817                    "bb)// w\n"
9818                    ";",
9819                    Tab));
9820   EXPECT_EQ("if (aaa && bbb) // w\n"
9821             "\t;",
9822             format("if(aaa&&bbb)// w\n"
9823                    ";",
9824                    Tab));
9825 
9826   verifyFormat("class X {\n"
9827                "\tvoid f() {\n"
9828                "\t\tsomeFunction(parameter1,\n"
9829                "\t\t\t     parameter2);\n"
9830                "\t}\n"
9831                "};",
9832                Tab);
9833   verifyFormat("#define A                        \\\n"
9834                "\tvoid f() {               \\\n"
9835                "\t\tsomeFunction(    \\\n"
9836                "\t\t    parameter1,  \\\n"
9837                "\t\t    parameter2); \\\n"
9838                "\t}",
9839                Tab);
9840   verifyFormat("int a;\t      // x\n"
9841                "int bbbbbbbb; // x\n",
9842                Tab);
9843 
9844   Tab.TabWidth = 4;
9845   Tab.IndentWidth = 8;
9846   verifyFormat("class TabWidth4Indent8 {\n"
9847                "\t\tvoid f() {\n"
9848                "\t\t\t\tsomeFunction(parameter1,\n"
9849                "\t\t\t\t\t\t\t parameter2);\n"
9850                "\t\t}\n"
9851                "};",
9852                Tab);
9853 
9854   Tab.TabWidth = 4;
9855   Tab.IndentWidth = 4;
9856   verifyFormat("class TabWidth4Indent4 {\n"
9857                "\tvoid f() {\n"
9858                "\t\tsomeFunction(parameter1,\n"
9859                "\t\t\t\t\t parameter2);\n"
9860                "\t}\n"
9861                "};",
9862                Tab);
9863 
9864   Tab.TabWidth = 8;
9865   Tab.IndentWidth = 4;
9866   verifyFormat("class TabWidth8Indent4 {\n"
9867                "    void f() {\n"
9868                "\tsomeFunction(parameter1,\n"
9869                "\t\t     parameter2);\n"
9870                "    }\n"
9871                "};",
9872                Tab);
9873 
9874   Tab.TabWidth = 8;
9875   Tab.IndentWidth = 8;
9876   EXPECT_EQ("/*\n"
9877             "\t      a\t\tcomment\n"
9878             "\t      in multiple lines\n"
9879             "       */",
9880             format("   /*\t \t \n"
9881                    " \t \t a\t\tcomment\t \t\n"
9882                    " \t \t in multiple lines\t\n"
9883                    " \t  */",
9884                    Tab));
9885 
9886   Tab.UseTab = FormatStyle::UT_ForIndentation;
9887   verifyFormat("{\n"
9888                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9889                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9890                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9891                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9892                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9893                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9894                "};",
9895                Tab);
9896   verifyFormat("enum AA {\n"
9897                "\ta1, // Force multiple lines\n"
9898                "\ta2,\n"
9899                "\ta3\n"
9900                "};",
9901                Tab);
9902   EXPECT_EQ("if (aaaaaaaa && // q\n"
9903             "    bb)         // w\n"
9904             "\t;",
9905             format("if (aaaaaaaa &&// q\n"
9906                    "bb)// w\n"
9907                    ";",
9908                    Tab));
9909   verifyFormat("class X {\n"
9910                "\tvoid f() {\n"
9911                "\t\tsomeFunction(parameter1,\n"
9912                "\t\t             parameter2);\n"
9913                "\t}\n"
9914                "};",
9915                Tab);
9916   verifyFormat("{\n"
9917                "\tQ(\n"
9918                "\t    {\n"
9919                "\t\t    int a;\n"
9920                "\t\t    someFunction(aaaaaaaa,\n"
9921                "\t\t                 bbbbbbb);\n"
9922                "\t    },\n"
9923                "\t    p);\n"
9924                "}",
9925                Tab);
9926   EXPECT_EQ("{\n"
9927             "\t/* aaaa\n"
9928             "\t   bbbb */\n"
9929             "}",
9930             format("{\n"
9931                    "/* aaaa\n"
9932                    "   bbbb */\n"
9933                    "}",
9934                    Tab));
9935   EXPECT_EQ("{\n"
9936             "\t/*\n"
9937             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9938             "\t  bbbbbbbbbbbbb\n"
9939             "\t*/\n"
9940             "}",
9941             format("{\n"
9942                    "/*\n"
9943                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9944                    "*/\n"
9945                    "}",
9946                    Tab));
9947   EXPECT_EQ("{\n"
9948             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9949             "\t// bbbbbbbbbbbbb\n"
9950             "}",
9951             format("{\n"
9952                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9953                    "}",
9954                    Tab));
9955   EXPECT_EQ("{\n"
9956             "\t/*\n"
9957             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9958             "\t  bbbbbbbbbbbbb\n"
9959             "\t*/\n"
9960             "}",
9961             format("{\n"
9962                    "\t/*\n"
9963                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9964                    "\t*/\n"
9965                    "}",
9966                    Tab));
9967   EXPECT_EQ("{\n"
9968             "\t/*\n"
9969             "\n"
9970             "\t*/\n"
9971             "}",
9972             format("{\n"
9973                    "\t/*\n"
9974                    "\n"
9975                    "\t*/\n"
9976                    "}",
9977                    Tab));
9978   EXPECT_EQ("{\n"
9979             "\t/*\n"
9980             " asdf\n"
9981             "\t*/\n"
9982             "}",
9983             format("{\n"
9984                    "\t/*\n"
9985                    " asdf\n"
9986                    "\t*/\n"
9987                    "}",
9988                    Tab));
9989 
9990   Tab.UseTab = FormatStyle::UT_Never;
9991   EXPECT_EQ("/*\n"
9992             "              a\t\tcomment\n"
9993             "              in multiple lines\n"
9994             "       */",
9995             format("   /*\t \t \n"
9996                    " \t \t a\t\tcomment\t \t\n"
9997                    " \t \t in multiple lines\t\n"
9998                    " \t  */",
9999                    Tab));
10000   EXPECT_EQ("/* some\n"
10001             "   comment */",
10002             format(" \t \t /* some\n"
10003                    " \t \t    comment */",
10004                    Tab));
10005   EXPECT_EQ("int a; /* some\n"
10006             "   comment */",
10007             format(" \t \t int a; /* some\n"
10008                    " \t \t    comment */",
10009                    Tab));
10010 
10011   EXPECT_EQ("int a; /* some\n"
10012             "comment */",
10013             format(" \t \t int\ta; /* some\n"
10014                    " \t \t    comment */",
10015                    Tab));
10016   EXPECT_EQ("f(\"\t\t\"); /* some\n"
10017             "    comment */",
10018             format(" \t \t f(\"\t\t\"); /* some\n"
10019                    " \t \t    comment */",
10020                    Tab));
10021   EXPECT_EQ("{\n"
10022             "  /*\n"
10023             "   * Comment\n"
10024             "   */\n"
10025             "  int i;\n"
10026             "}",
10027             format("{\n"
10028                    "\t/*\n"
10029                    "\t * Comment\n"
10030                    "\t */\n"
10031                    "\t int i;\n"
10032                    "}"));
10033 
10034   Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
10035   Tab.TabWidth = 8;
10036   Tab.IndentWidth = 8;
10037   EXPECT_EQ("if (aaaaaaaa && // q\n"
10038             "    bb)         // w\n"
10039             "\t;",
10040             format("if (aaaaaaaa &&// q\n"
10041                    "bb)// w\n"
10042                    ";",
10043                    Tab));
10044   EXPECT_EQ("if (aaa && bbb) // w\n"
10045             "\t;",
10046             format("if(aaa&&bbb)// w\n"
10047                    ";",
10048                    Tab));
10049   verifyFormat("class X {\n"
10050                "\tvoid f() {\n"
10051                "\t\tsomeFunction(parameter1,\n"
10052                "\t\t\t     parameter2);\n"
10053                "\t}\n"
10054                "};",
10055                Tab);
10056   verifyFormat("#define A                        \\\n"
10057                "\tvoid f() {               \\\n"
10058                "\t\tsomeFunction(    \\\n"
10059                "\t\t    parameter1,  \\\n"
10060                "\t\t    parameter2); \\\n"
10061                "\t}",
10062                Tab);
10063   Tab.TabWidth = 4;
10064   Tab.IndentWidth = 8;
10065   verifyFormat("class TabWidth4Indent8 {\n"
10066                "\t\tvoid f() {\n"
10067                "\t\t\t\tsomeFunction(parameter1,\n"
10068                "\t\t\t\t\t\t\t parameter2);\n"
10069                "\t\t}\n"
10070                "};",
10071                Tab);
10072   Tab.TabWidth = 4;
10073   Tab.IndentWidth = 4;
10074   verifyFormat("class TabWidth4Indent4 {\n"
10075                "\tvoid f() {\n"
10076                "\t\tsomeFunction(parameter1,\n"
10077                "\t\t\t\t\t parameter2);\n"
10078                "\t}\n"
10079                "};",
10080                Tab);
10081   Tab.TabWidth = 8;
10082   Tab.IndentWidth = 4;
10083   verifyFormat("class TabWidth8Indent4 {\n"
10084                "    void f() {\n"
10085                "\tsomeFunction(parameter1,\n"
10086                "\t\t     parameter2);\n"
10087                "    }\n"
10088                "};",
10089                Tab);
10090   Tab.TabWidth = 8;
10091   Tab.IndentWidth = 8;
10092   EXPECT_EQ("/*\n"
10093             "\t      a\t\tcomment\n"
10094             "\t      in multiple lines\n"
10095             "       */",
10096             format("   /*\t \t \n"
10097                    " \t \t a\t\tcomment\t \t\n"
10098                    " \t \t in multiple lines\t\n"
10099                    " \t  */",
10100                    Tab));
10101   verifyFormat("{\n"
10102                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10103                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10104                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10105                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10106                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10107                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10108                "};",
10109                Tab);
10110   verifyFormat("enum AA {\n"
10111                "\ta1, // Force multiple lines\n"
10112                "\ta2,\n"
10113                "\ta3\n"
10114                "};",
10115                Tab);
10116   EXPECT_EQ("if (aaaaaaaa && // q\n"
10117             "    bb)         // w\n"
10118             "\t;",
10119             format("if (aaaaaaaa &&// q\n"
10120                    "bb)// w\n"
10121                    ";",
10122                    Tab));
10123   verifyFormat("class X {\n"
10124                "\tvoid f() {\n"
10125                "\t\tsomeFunction(parameter1,\n"
10126                "\t\t\t     parameter2);\n"
10127                "\t}\n"
10128                "};",
10129                Tab);
10130   verifyFormat("{\n"
10131                "\tQ(\n"
10132                "\t    {\n"
10133                "\t\t    int a;\n"
10134                "\t\t    someFunction(aaaaaaaa,\n"
10135                "\t\t\t\t bbbbbbb);\n"
10136                "\t    },\n"
10137                "\t    p);\n"
10138                "}",
10139                Tab);
10140   EXPECT_EQ("{\n"
10141             "\t/* aaaa\n"
10142             "\t   bbbb */\n"
10143             "}",
10144             format("{\n"
10145                    "/* aaaa\n"
10146                    "   bbbb */\n"
10147                    "}",
10148                    Tab));
10149   EXPECT_EQ("{\n"
10150             "\t/*\n"
10151             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10152             "\t  bbbbbbbbbbbbb\n"
10153             "\t*/\n"
10154             "}",
10155             format("{\n"
10156                    "/*\n"
10157                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10158                    "*/\n"
10159                    "}",
10160                    Tab));
10161   EXPECT_EQ("{\n"
10162             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10163             "\t// bbbbbbbbbbbbb\n"
10164             "}",
10165             format("{\n"
10166                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10167                    "}",
10168                    Tab));
10169   EXPECT_EQ("{\n"
10170             "\t/*\n"
10171             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10172             "\t  bbbbbbbbbbbbb\n"
10173             "\t*/\n"
10174             "}",
10175             format("{\n"
10176                    "\t/*\n"
10177                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10178                    "\t*/\n"
10179                    "}",
10180                    Tab));
10181   EXPECT_EQ("{\n"
10182             "\t/*\n"
10183             "\n"
10184             "\t*/\n"
10185             "}",
10186             format("{\n"
10187                    "\t/*\n"
10188                    "\n"
10189                    "\t*/\n"
10190                    "}",
10191                    Tab));
10192   EXPECT_EQ("{\n"
10193             "\t/*\n"
10194             " asdf\n"
10195             "\t*/\n"
10196             "}",
10197             format("{\n"
10198                    "\t/*\n"
10199                    " asdf\n"
10200                    "\t*/\n"
10201                    "}",
10202                    Tab));
10203   EXPECT_EQ("/*\n"
10204             "\t      a\t\tcomment\n"
10205             "\t      in multiple lines\n"
10206             "       */",
10207             format("   /*\t \t \n"
10208                    " \t \t a\t\tcomment\t \t\n"
10209                    " \t \t in multiple lines\t\n"
10210                    " \t  */",
10211                    Tab));
10212   EXPECT_EQ("/* some\n"
10213             "   comment */",
10214             format(" \t \t /* some\n"
10215                    " \t \t    comment */",
10216                    Tab));
10217   EXPECT_EQ("int a; /* some\n"
10218             "   comment */",
10219             format(" \t \t int a; /* some\n"
10220                    " \t \t    comment */",
10221                    Tab));
10222   EXPECT_EQ("int a; /* some\n"
10223             "comment */",
10224             format(" \t \t int\ta; /* some\n"
10225                    " \t \t    comment */",
10226                    Tab));
10227   EXPECT_EQ("f(\"\t\t\"); /* some\n"
10228             "    comment */",
10229             format(" \t \t f(\"\t\t\"); /* some\n"
10230                    " \t \t    comment */",
10231                    Tab));
10232   EXPECT_EQ("{\n"
10233             "  /*\n"
10234             "   * Comment\n"
10235             "   */\n"
10236             "  int i;\n"
10237             "}",
10238             format("{\n"
10239                    "\t/*\n"
10240                    "\t * Comment\n"
10241                    "\t */\n"
10242                    "\t int i;\n"
10243                    "}"));
10244   Tab.AlignConsecutiveAssignments = true;
10245   Tab.AlignConsecutiveDeclarations = true;
10246   Tab.TabWidth = 4;
10247   Tab.IndentWidth = 4;
10248   verifyFormat("class Assign {\n"
10249                "\tvoid f() {\n"
10250                "\t\tint         x      = 123;\n"
10251                "\t\tint         random = 4;\n"
10252                "\t\tstd::string alphabet =\n"
10253                "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
10254                "\t}\n"
10255                "};",
10256                Tab);
10257 }
10258 
10259 TEST_F(FormatTest, ZeroTabWidth) {
10260   FormatStyle Tab = getLLVMStyleWithColumns(42);
10261   Tab.IndentWidth = 8;
10262   Tab.UseTab = FormatStyle::UT_Never;
10263   Tab.TabWidth = 0;
10264   EXPECT_EQ("void a(){\n"
10265             "    // line starts with '\t'\n"
10266             "};",
10267             format("void a(){\n"
10268                    "\t// line starts with '\t'\n"
10269                    "};",
10270                    Tab));
10271 
10272   EXPECT_EQ("void a(){\n"
10273             "    // line starts with '\t'\n"
10274             "};",
10275             format("void a(){\n"
10276                    "\t\t// line starts with '\t'\n"
10277                    "};",
10278                    Tab));
10279 
10280   Tab.UseTab = FormatStyle::UT_ForIndentation;
10281   EXPECT_EQ("void a(){\n"
10282             "    // line starts with '\t'\n"
10283             "};",
10284             format("void a(){\n"
10285                    "\t// line starts with '\t'\n"
10286                    "};",
10287                    Tab));
10288 
10289   EXPECT_EQ("void a(){\n"
10290             "    // line starts with '\t'\n"
10291             "};",
10292             format("void a(){\n"
10293                    "\t\t// line starts with '\t'\n"
10294                    "};",
10295                    Tab));
10296 
10297   Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
10298   EXPECT_EQ("void a(){\n"
10299             "    // line starts with '\t'\n"
10300             "};",
10301             format("void a(){\n"
10302                    "\t// line starts with '\t'\n"
10303                    "};",
10304                    Tab));
10305 
10306   EXPECT_EQ("void a(){\n"
10307             "    // line starts with '\t'\n"
10308             "};",
10309             format("void a(){\n"
10310                    "\t\t// line starts with '\t'\n"
10311                    "};",
10312                    Tab));
10313 
10314   Tab.UseTab = FormatStyle::UT_Always;
10315   EXPECT_EQ("void a(){\n"
10316             "// line starts with '\t'\n"
10317             "};",
10318             format("void a(){\n"
10319                    "\t// line starts with '\t'\n"
10320                    "};",
10321                    Tab));
10322 
10323   EXPECT_EQ("void a(){\n"
10324             "// line starts with '\t'\n"
10325             "};",
10326             format("void a(){\n"
10327                    "\t\t// line starts with '\t'\n"
10328                    "};",
10329                    Tab));
10330 }
10331 
10332 TEST_F(FormatTest, CalculatesOriginalColumn) {
10333   EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
10334             "q\"; /* some\n"
10335             "       comment */",
10336             format("  \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
10337                    "q\"; /* some\n"
10338                    "       comment */",
10339                    getLLVMStyle()));
10340   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
10341             "/* some\n"
10342             "   comment */",
10343             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
10344                    " /* some\n"
10345                    "    comment */",
10346                    getLLVMStyle()));
10347   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
10348             "qqq\n"
10349             "/* some\n"
10350             "   comment */",
10351             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
10352                    "qqq\n"
10353                    " /* some\n"
10354                    "    comment */",
10355                    getLLVMStyle()));
10356   EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
10357             "wwww; /* some\n"
10358             "         comment */",
10359             format("  inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
10360                    "wwww; /* some\n"
10361                    "         comment */",
10362                    getLLVMStyle()));
10363 }
10364 
10365 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
10366   FormatStyle NoSpace = getLLVMStyle();
10367   NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
10368 
10369   verifyFormat("while(true)\n"
10370                "  continue;",
10371                NoSpace);
10372   verifyFormat("for(;;)\n"
10373                "  continue;",
10374                NoSpace);
10375   verifyFormat("if(true)\n"
10376                "  f();\n"
10377                "else if(true)\n"
10378                "  f();",
10379                NoSpace);
10380   verifyFormat("do {\n"
10381                "  do_something();\n"
10382                "} while(something());",
10383                NoSpace);
10384   verifyFormat("switch(x) {\n"
10385                "default:\n"
10386                "  break;\n"
10387                "}",
10388                NoSpace);
10389   verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
10390   verifyFormat("size_t x = sizeof(x);", NoSpace);
10391   verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
10392   verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
10393   verifyFormat("alignas(128) char a[128];", NoSpace);
10394   verifyFormat("size_t x = alignof(MyType);", NoSpace);
10395   verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
10396   verifyFormat("int f() throw(Deprecated);", NoSpace);
10397   verifyFormat("typedef void (*cb)(int);", NoSpace);
10398   verifyFormat("T A::operator()();", NoSpace);
10399   verifyFormat("X A::operator++(T);", NoSpace);
10400   verifyFormat("auto lambda = []() { return 0; };", NoSpace);
10401 
10402   FormatStyle Space = getLLVMStyle();
10403   Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
10404 
10405   verifyFormat("int f ();", Space);
10406   verifyFormat("void f (int a, T b) {\n"
10407                "  while (true)\n"
10408                "    continue;\n"
10409                "}",
10410                Space);
10411   verifyFormat("if (true)\n"
10412                "  f ();\n"
10413                "else if (true)\n"
10414                "  f ();",
10415                Space);
10416   verifyFormat("do {\n"
10417                "  do_something ();\n"
10418                "} while (something ());",
10419                Space);
10420   verifyFormat("switch (x) {\n"
10421                "default:\n"
10422                "  break;\n"
10423                "}",
10424                Space);
10425   verifyFormat("A::A () : a (1) {}", Space);
10426   verifyFormat("void f () __attribute__ ((asdf));", Space);
10427   verifyFormat("*(&a + 1);\n"
10428                "&((&a)[1]);\n"
10429                "a[(b + c) * d];\n"
10430                "(((a + 1) * 2) + 3) * 4;",
10431                Space);
10432   verifyFormat("#define A(x) x", Space);
10433   verifyFormat("#define A (x) x", Space);
10434   verifyFormat("#if defined(x)\n"
10435                "#endif",
10436                Space);
10437   verifyFormat("auto i = std::make_unique<int> (5);", Space);
10438   verifyFormat("size_t x = sizeof (x);", Space);
10439   verifyFormat("auto f (int x) -> decltype (x);", Space);
10440   verifyFormat("int f (T x) noexcept (x.create ());", Space);
10441   verifyFormat("alignas (128) char a[128];", Space);
10442   verifyFormat("size_t x = alignof (MyType);", Space);
10443   verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
10444   verifyFormat("int f () throw (Deprecated);", Space);
10445   verifyFormat("typedef void (*cb) (int);", Space);
10446   verifyFormat("T A::operator() ();", Space);
10447   verifyFormat("X A::operator++ (T);", Space);
10448   verifyFormat("auto lambda = [] () { return 0; };", Space);
10449   verifyFormat("int x = int (y);", Space);
10450 
10451   FormatStyle SomeSpace = getLLVMStyle();
10452   SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses;
10453 
10454   verifyFormat("[]() -> float {}", SomeSpace);
10455   verifyFormat("[] (auto foo) {}", SomeSpace);
10456   verifyFormat("[foo]() -> int {}", SomeSpace);
10457   verifyFormat("int f();", SomeSpace);
10458   verifyFormat("void f (int a, T b) {\n"
10459                "  while (true)\n"
10460                "    continue;\n"
10461                "}",
10462                SomeSpace);
10463   verifyFormat("if (true)\n"
10464                "  f();\n"
10465                "else if (true)\n"
10466                "  f();",
10467                SomeSpace);
10468   verifyFormat("do {\n"
10469                "  do_something();\n"
10470                "} while (something());",
10471                SomeSpace);
10472   verifyFormat("switch (x) {\n"
10473                "default:\n"
10474                "  break;\n"
10475                "}",
10476                SomeSpace);
10477   verifyFormat("A::A() : a (1) {}", SomeSpace);
10478   verifyFormat("void f() __attribute__ ((asdf));", SomeSpace);
10479   verifyFormat("*(&a + 1);\n"
10480                "&((&a)[1]);\n"
10481                "a[(b + c) * d];\n"
10482                "(((a + 1) * 2) + 3) * 4;",
10483                SomeSpace);
10484   verifyFormat("#define A(x) x", SomeSpace);
10485   verifyFormat("#define A (x) x", SomeSpace);
10486   verifyFormat("#if defined(x)\n"
10487                "#endif",
10488                SomeSpace);
10489   verifyFormat("auto i = std::make_unique<int> (5);", SomeSpace);
10490   verifyFormat("size_t x = sizeof (x);", SomeSpace);
10491   verifyFormat("auto f (int x) -> decltype (x);", SomeSpace);
10492   verifyFormat("int f (T x) noexcept (x.create());", SomeSpace);
10493   verifyFormat("alignas (128) char a[128];", SomeSpace);
10494   verifyFormat("size_t x = alignof (MyType);", SomeSpace);
10495   verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");",
10496                SomeSpace);
10497   verifyFormat("int f() throw (Deprecated);", SomeSpace);
10498   verifyFormat("typedef void (*cb) (int);", SomeSpace);
10499   verifyFormat("T A::operator()();", SomeSpace);
10500   verifyFormat("X A::operator++ (T);", SomeSpace);
10501   verifyFormat("int x = int (y);", SomeSpace);
10502   verifyFormat("auto lambda = []() { return 0; };", SomeSpace);
10503 }
10504 
10505 TEST_F(FormatTest, SpaceAfterLogicalNot) {
10506   FormatStyle Spaces = getLLVMStyle();
10507   Spaces.SpaceAfterLogicalNot = true;
10508 
10509   verifyFormat("bool x = ! y", Spaces);
10510   verifyFormat("if (! isFailure())", Spaces);
10511   verifyFormat("if (! (a && b))", Spaces);
10512   verifyFormat("\"Error!\"", Spaces);
10513   verifyFormat("! ! x", Spaces);
10514 }
10515 
10516 TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
10517   FormatStyle Spaces = getLLVMStyle();
10518 
10519   Spaces.SpacesInParentheses = true;
10520   verifyFormat("do_something( ::globalVar );", Spaces);
10521   verifyFormat("call( x, y, z );", Spaces);
10522   verifyFormat("call();", Spaces);
10523   verifyFormat("std::function<void( int, int )> callback;", Spaces);
10524   verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
10525                Spaces);
10526   verifyFormat("while ( (bool)1 )\n"
10527                "  continue;",
10528                Spaces);
10529   verifyFormat("for ( ;; )\n"
10530                "  continue;",
10531                Spaces);
10532   verifyFormat("if ( true )\n"
10533                "  f();\n"
10534                "else if ( true )\n"
10535                "  f();",
10536                Spaces);
10537   verifyFormat("do {\n"
10538                "  do_something( (int)i );\n"
10539                "} while ( something() );",
10540                Spaces);
10541   verifyFormat("switch ( x ) {\n"
10542                "default:\n"
10543                "  break;\n"
10544                "}",
10545                Spaces);
10546 
10547   Spaces.SpacesInParentheses = false;
10548   Spaces.SpacesInCStyleCastParentheses = true;
10549   verifyFormat("Type *A = ( Type * )P;", Spaces);
10550   verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
10551   verifyFormat("x = ( int32 )y;", Spaces);
10552   verifyFormat("int a = ( int )(2.0f);", Spaces);
10553   verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
10554   verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
10555   verifyFormat("#define x (( int )-1)", Spaces);
10556 
10557   // Run the first set of tests again with:
10558   Spaces.SpacesInParentheses = false;
10559   Spaces.SpaceInEmptyParentheses = true;
10560   Spaces.SpacesInCStyleCastParentheses = true;
10561   verifyFormat("call(x, y, z);", Spaces);
10562   verifyFormat("call( );", Spaces);
10563   verifyFormat("std::function<void(int, int)> callback;", Spaces);
10564   verifyFormat("while (( bool )1)\n"
10565                "  continue;",
10566                Spaces);
10567   verifyFormat("for (;;)\n"
10568                "  continue;",
10569                Spaces);
10570   verifyFormat("if (true)\n"
10571                "  f( );\n"
10572                "else if (true)\n"
10573                "  f( );",
10574                Spaces);
10575   verifyFormat("do {\n"
10576                "  do_something(( int )i);\n"
10577                "} while (something( ));",
10578                Spaces);
10579   verifyFormat("switch (x) {\n"
10580                "default:\n"
10581                "  break;\n"
10582                "}",
10583                Spaces);
10584 
10585   // Run the first set of tests again with:
10586   Spaces.SpaceAfterCStyleCast = true;
10587   verifyFormat("call(x, y, z);", Spaces);
10588   verifyFormat("call( );", Spaces);
10589   verifyFormat("std::function<void(int, int)> callback;", Spaces);
10590   verifyFormat("while (( bool ) 1)\n"
10591                "  continue;",
10592                Spaces);
10593   verifyFormat("for (;;)\n"
10594                "  continue;",
10595                Spaces);
10596   verifyFormat("if (true)\n"
10597                "  f( );\n"
10598                "else if (true)\n"
10599                "  f( );",
10600                Spaces);
10601   verifyFormat("do {\n"
10602                "  do_something(( int ) i);\n"
10603                "} while (something( ));",
10604                Spaces);
10605   verifyFormat("switch (x) {\n"
10606                "default:\n"
10607                "  break;\n"
10608                "}",
10609                Spaces);
10610 
10611   // Run subset of tests again with:
10612   Spaces.SpacesInCStyleCastParentheses = false;
10613   Spaces.SpaceAfterCStyleCast = true;
10614   verifyFormat("while ((bool) 1)\n"
10615                "  continue;",
10616                Spaces);
10617   verifyFormat("do {\n"
10618                "  do_something((int) i);\n"
10619                "} while (something( ));",
10620                Spaces);
10621 }
10622 
10623 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
10624   verifyFormat("int a[5];");
10625   verifyFormat("a[3] += 42;");
10626 
10627   FormatStyle Spaces = getLLVMStyle();
10628   Spaces.SpacesInSquareBrackets = true;
10629   // Not lambdas.
10630   verifyFormat("int a[ 5 ];", Spaces);
10631   verifyFormat("a[ 3 ] += 42;", Spaces);
10632   verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
10633   verifyFormat("double &operator[](int i) { return 0; }\n"
10634                "int i;",
10635                Spaces);
10636   verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
10637   verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
10638   verifyFormat("int i = (*b)[ a ]->f();", Spaces);
10639   // Lambdas.
10640   verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
10641   verifyFormat("return [ i, args... ] {};", Spaces);
10642   verifyFormat("int foo = [ &bar ]() {};", Spaces);
10643   verifyFormat("int foo = [ = ]() {};", Spaces);
10644   verifyFormat("int foo = [ & ]() {};", Spaces);
10645   verifyFormat("int foo = [ =, &bar ]() {};", Spaces);
10646   verifyFormat("int foo = [ &bar, = ]() {};", Spaces);
10647 }
10648 
10649 TEST_F(FormatTest, ConfigurableSpaceBeforeBrackets) {
10650   FormatStyle NoSpaceStyle = getLLVMStyle();
10651   verifyFormat("int a[5];", NoSpaceStyle);
10652   verifyFormat("a[3] += 42;", NoSpaceStyle);
10653 
10654   verifyFormat("int a[1];", NoSpaceStyle);
10655   verifyFormat("int 1 [a];", NoSpaceStyle);
10656   verifyFormat("int a[1][2];", NoSpaceStyle);
10657   verifyFormat("a[7] = 5;", NoSpaceStyle);
10658   verifyFormat("int a = (f())[23];", NoSpaceStyle);
10659   verifyFormat("f([] {})", NoSpaceStyle);
10660 
10661   FormatStyle Space = getLLVMStyle();
10662   Space.SpaceBeforeSquareBrackets = true;
10663   verifyFormat("int c = []() -> int { return 2; }();\n", Space);
10664   verifyFormat("return [i, args...] {};", Space);
10665 
10666   verifyFormat("int a [5];", Space);
10667   verifyFormat("a [3] += 42;", Space);
10668   verifyFormat("constexpr char hello []{\"hello\"};", Space);
10669   verifyFormat("double &operator[](int i) { return 0; }\n"
10670                "int i;",
10671                Space);
10672   verifyFormat("std::unique_ptr<int []> foo() {}", Space);
10673   verifyFormat("int i = a [a][a]->f();", Space);
10674   verifyFormat("int i = (*b) [a]->f();", Space);
10675 
10676   verifyFormat("int a [1];", Space);
10677   verifyFormat("int 1 [a];", Space);
10678   verifyFormat("int a [1][2];", Space);
10679   verifyFormat("a [7] = 5;", Space);
10680   verifyFormat("int a = (f()) [23];", Space);
10681   verifyFormat("f([] {})", Space);
10682 }
10683 
10684 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
10685   verifyFormat("int a = 5;");
10686   verifyFormat("a += 42;");
10687   verifyFormat("a or_eq 8;");
10688 
10689   FormatStyle Spaces = getLLVMStyle();
10690   Spaces.SpaceBeforeAssignmentOperators = false;
10691   verifyFormat("int a= 5;", Spaces);
10692   verifyFormat("a+= 42;", Spaces);
10693   verifyFormat("a or_eq 8;", Spaces);
10694 }
10695 
10696 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
10697   verifyFormat("class Foo : public Bar {};");
10698   verifyFormat("Foo::Foo() : foo(1) {}");
10699   verifyFormat("for (auto a : b) {\n}");
10700   verifyFormat("int x = a ? b : c;");
10701   verifyFormat("{\n"
10702                "label0:\n"
10703                "  int x = 0;\n"
10704                "}");
10705   verifyFormat("switch (x) {\n"
10706                "case 1:\n"
10707                "default:\n"
10708                "}");
10709 
10710   FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30);
10711   CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false;
10712   verifyFormat("class Foo : public Bar {};", CtorInitializerStyle);
10713   verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle);
10714   verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle);
10715   verifyFormat("int x = a ? b : c;", CtorInitializerStyle);
10716   verifyFormat("{\n"
10717                "label1:\n"
10718                "  int x = 0;\n"
10719                "}",
10720                CtorInitializerStyle);
10721   verifyFormat("switch (x) {\n"
10722                "case 1:\n"
10723                "default:\n"
10724                "}",
10725                CtorInitializerStyle);
10726   CtorInitializerStyle.BreakConstructorInitializers =
10727       FormatStyle::BCIS_AfterColon;
10728   verifyFormat("Fooooooooooo::Fooooooooooo():\n"
10729                "    aaaaaaaaaaaaaaaa(1),\n"
10730                "    bbbbbbbbbbbbbbbb(2) {}",
10731                CtorInitializerStyle);
10732   CtorInitializerStyle.BreakConstructorInitializers =
10733       FormatStyle::BCIS_BeforeComma;
10734   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
10735                "    : aaaaaaaaaaaaaaaa(1)\n"
10736                "    , bbbbbbbbbbbbbbbb(2) {}",
10737                CtorInitializerStyle);
10738   CtorInitializerStyle.BreakConstructorInitializers =
10739       FormatStyle::BCIS_BeforeColon;
10740   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
10741                "    : aaaaaaaaaaaaaaaa(1),\n"
10742                "      bbbbbbbbbbbbbbbb(2) {}",
10743                CtorInitializerStyle);
10744   CtorInitializerStyle.ConstructorInitializerIndentWidth = 0;
10745   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
10746                ": aaaaaaaaaaaaaaaa(1),\n"
10747                "  bbbbbbbbbbbbbbbb(2) {}",
10748                CtorInitializerStyle);
10749 
10750   FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30);
10751   InheritanceStyle.SpaceBeforeInheritanceColon = false;
10752   verifyFormat("class Foo: public Bar {};", InheritanceStyle);
10753   verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle);
10754   verifyFormat("for (auto a : b) {\n}", InheritanceStyle);
10755   verifyFormat("int x = a ? b : c;", InheritanceStyle);
10756   verifyFormat("{\n"
10757                "label2:\n"
10758                "  int x = 0;\n"
10759                "}",
10760                InheritanceStyle);
10761   verifyFormat("switch (x) {\n"
10762                "case 1:\n"
10763                "default:\n"
10764                "}",
10765                InheritanceStyle);
10766   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon;
10767   verifyFormat("class Foooooooooooooooooooooo:\n"
10768                "    public aaaaaaaaaaaaaaaaaa,\n"
10769                "    public bbbbbbbbbbbbbbbbbb {\n"
10770                "}",
10771                InheritanceStyle);
10772   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
10773   verifyFormat("class Foooooooooooooooooooooo\n"
10774                "    : public aaaaaaaaaaaaaaaaaa\n"
10775                "    , public bbbbbbbbbbbbbbbbbb {\n"
10776                "}",
10777                InheritanceStyle);
10778   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
10779   verifyFormat("class Foooooooooooooooooooooo\n"
10780                "    : public aaaaaaaaaaaaaaaaaa,\n"
10781                "      public bbbbbbbbbbbbbbbbbb {\n"
10782                "}",
10783                InheritanceStyle);
10784   InheritanceStyle.ConstructorInitializerIndentWidth = 0;
10785   verifyFormat("class Foooooooooooooooooooooo\n"
10786                ": public aaaaaaaaaaaaaaaaaa,\n"
10787                "  public bbbbbbbbbbbbbbbbbb {}",
10788                InheritanceStyle);
10789 
10790   FormatStyle ForLoopStyle = getLLVMStyle();
10791   ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false;
10792   verifyFormat("class Foo : public Bar {};", ForLoopStyle);
10793   verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle);
10794   verifyFormat("for (auto a: b) {\n}", ForLoopStyle);
10795   verifyFormat("int x = a ? b : c;", ForLoopStyle);
10796   verifyFormat("{\n"
10797                "label2:\n"
10798                "  int x = 0;\n"
10799                "}",
10800                ForLoopStyle);
10801   verifyFormat("switch (x) {\n"
10802                "case 1:\n"
10803                "default:\n"
10804                "}",
10805                ForLoopStyle);
10806 
10807   FormatStyle NoSpaceStyle = getLLVMStyle();
10808   NoSpaceStyle.SpaceBeforeCtorInitializerColon = false;
10809   NoSpaceStyle.SpaceBeforeInheritanceColon = false;
10810   NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false;
10811   verifyFormat("class Foo: public Bar {};", NoSpaceStyle);
10812   verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle);
10813   verifyFormat("for (auto a: b) {\n}", NoSpaceStyle);
10814   verifyFormat("int x = a ? b : c;", NoSpaceStyle);
10815   verifyFormat("{\n"
10816                "label3:\n"
10817                "  int x = 0;\n"
10818                "}",
10819                NoSpaceStyle);
10820   verifyFormat("switch (x) {\n"
10821                "case 1:\n"
10822                "default:\n"
10823                "}",
10824                NoSpaceStyle);
10825 }
10826 
10827 TEST_F(FormatTest, AlignConsecutiveMacros) {
10828   FormatStyle Style = getLLVMStyle();
10829   Style.AlignConsecutiveAssignments = true;
10830   Style.AlignConsecutiveDeclarations = true;
10831   Style.AlignConsecutiveMacros = false;
10832 
10833   verifyFormat("#define a 3\n"
10834                "#define bbbb 4\n"
10835                "#define ccc (5)",
10836                Style);
10837 
10838   verifyFormat("#define f(x) (x * x)\n"
10839                "#define fff(x, y, z) (x * y + z)\n"
10840                "#define ffff(x, y) (x - y)",
10841                Style);
10842 
10843   verifyFormat("#define foo(x, y) (x + y)\n"
10844                "#define bar (5, 6)(2 + 2)",
10845                Style);
10846 
10847   verifyFormat("#define a 3\n"
10848                "#define bbbb 4\n"
10849                "#define ccc (5)\n"
10850                "#define f(x) (x * x)\n"
10851                "#define fff(x, y, z) (x * y + z)\n"
10852                "#define ffff(x, y) (x - y)",
10853                Style);
10854 
10855   Style.AlignConsecutiveMacros = true;
10856   verifyFormat("#define a    3\n"
10857                "#define bbbb 4\n"
10858                "#define ccc  (5)",
10859                Style);
10860 
10861   verifyFormat("#define f(x)         (x * x)\n"
10862                "#define fff(x, y, z) (x * y + z)\n"
10863                "#define ffff(x, y)   (x - y)",
10864                Style);
10865 
10866   verifyFormat("#define foo(x, y) (x + y)\n"
10867                "#define bar       (5, 6)(2 + 2)",
10868                Style);
10869 
10870   verifyFormat("#define a            3\n"
10871                "#define bbbb         4\n"
10872                "#define ccc          (5)\n"
10873                "#define f(x)         (x * x)\n"
10874                "#define fff(x, y, z) (x * y + z)\n"
10875                "#define ffff(x, y)   (x - y)",
10876                Style);
10877 
10878   verifyFormat("#define a         5\n"
10879                "#define foo(x, y) (x + y)\n"
10880                "#define CCC       (6)\n"
10881                "auto lambda = []() {\n"
10882                "  auto  ii = 0;\n"
10883                "  float j  = 0;\n"
10884                "  return 0;\n"
10885                "};\n"
10886                "int   i  = 0;\n"
10887                "float i2 = 0;\n"
10888                "auto  v  = type{\n"
10889                "    i = 1,   //\n"
10890                "    (i = 2), //\n"
10891                "    i = 3    //\n"
10892                "};",
10893                Style);
10894 
10895   Style.AlignConsecutiveMacros = false;
10896   Style.ColumnLimit = 20;
10897 
10898   verifyFormat("#define a          \\\n"
10899                "  \"aabbbbbbbbbbbb\"\n"
10900                "#define D          \\\n"
10901                "  \"aabbbbbbbbbbbb\" \\\n"
10902                "  \"ccddeeeeeeeee\"\n"
10903                "#define B          \\\n"
10904                "  \"QQQQQQQQQQQQQ\"  \\\n"
10905                "  \"FFFFFFFFFFFFF\"  \\\n"
10906                "  \"LLLLLLLL\"\n",
10907                Style);
10908 
10909   Style.AlignConsecutiveMacros = true;
10910   verifyFormat("#define a          \\\n"
10911                "  \"aabbbbbbbbbbbb\"\n"
10912                "#define D          \\\n"
10913                "  \"aabbbbbbbbbbbb\" \\\n"
10914                "  \"ccddeeeeeeeee\"\n"
10915                "#define B          \\\n"
10916                "  \"QQQQQQQQQQQQQ\"  \\\n"
10917                "  \"FFFFFFFFFFFFF\"  \\\n"
10918                "  \"LLLLLLLL\"\n",
10919                Style);
10920 }
10921 
10922 TEST_F(FormatTest, AlignConsecutiveAssignments) {
10923   FormatStyle Alignment = getLLVMStyle();
10924   Alignment.AlignConsecutiveMacros = true;
10925   Alignment.AlignConsecutiveAssignments = false;
10926   verifyFormat("int a = 5;\n"
10927                "int oneTwoThree = 123;",
10928                Alignment);
10929   verifyFormat("int a = 5;\n"
10930                "int oneTwoThree = 123;",
10931                Alignment);
10932 
10933   Alignment.AlignConsecutiveAssignments = true;
10934   verifyFormat("int a           = 5;\n"
10935                "int oneTwoThree = 123;",
10936                Alignment);
10937   verifyFormat("int a           = method();\n"
10938                "int oneTwoThree = 133;",
10939                Alignment);
10940   verifyFormat("a &= 5;\n"
10941                "bcd *= 5;\n"
10942                "ghtyf += 5;\n"
10943                "dvfvdb -= 5;\n"
10944                "a /= 5;\n"
10945                "vdsvsv %= 5;\n"
10946                "sfdbddfbdfbb ^= 5;\n"
10947                "dvsdsv |= 5;\n"
10948                "int dsvvdvsdvvv = 123;",
10949                Alignment);
10950   verifyFormat("int i = 1, j = 10;\n"
10951                "something = 2000;",
10952                Alignment);
10953   verifyFormat("something = 2000;\n"
10954                "int i = 1, j = 10;\n",
10955                Alignment);
10956   verifyFormat("something = 2000;\n"
10957                "another   = 911;\n"
10958                "int i = 1, j = 10;\n"
10959                "oneMore = 1;\n"
10960                "i       = 2;",
10961                Alignment);
10962   verifyFormat("int a   = 5;\n"
10963                "int one = 1;\n"
10964                "method();\n"
10965                "int oneTwoThree = 123;\n"
10966                "int oneTwo      = 12;",
10967                Alignment);
10968   verifyFormat("int oneTwoThree = 123;\n"
10969                "int oneTwo      = 12;\n"
10970                "method();\n",
10971                Alignment);
10972   verifyFormat("int oneTwoThree = 123; // comment\n"
10973                "int oneTwo      = 12;  // comment",
10974                Alignment);
10975   EXPECT_EQ("int a = 5;\n"
10976             "\n"
10977             "int oneTwoThree = 123;",
10978             format("int a       = 5;\n"
10979                    "\n"
10980                    "int oneTwoThree= 123;",
10981                    Alignment));
10982   EXPECT_EQ("int a   = 5;\n"
10983             "int one = 1;\n"
10984             "\n"
10985             "int oneTwoThree = 123;",
10986             format("int a = 5;\n"
10987                    "int one = 1;\n"
10988                    "\n"
10989                    "int oneTwoThree = 123;",
10990                    Alignment));
10991   EXPECT_EQ("int a   = 5;\n"
10992             "int one = 1;\n"
10993             "\n"
10994             "int oneTwoThree = 123;\n"
10995             "int oneTwo      = 12;",
10996             format("int a = 5;\n"
10997                    "int one = 1;\n"
10998                    "\n"
10999                    "int oneTwoThree = 123;\n"
11000                    "int oneTwo = 12;",
11001                    Alignment));
11002   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
11003   verifyFormat("#define A \\\n"
11004                "  int aaaa       = 12; \\\n"
11005                "  int b          = 23; \\\n"
11006                "  int ccc        = 234; \\\n"
11007                "  int dddddddddd = 2345;",
11008                Alignment);
11009   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
11010   verifyFormat("#define A               \\\n"
11011                "  int aaaa       = 12;  \\\n"
11012                "  int b          = 23;  \\\n"
11013                "  int ccc        = 234; \\\n"
11014                "  int dddddddddd = 2345;",
11015                Alignment);
11016   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
11017   verifyFormat("#define A                                                      "
11018                "                \\\n"
11019                "  int aaaa       = 12;                                         "
11020                "                \\\n"
11021                "  int b          = 23;                                         "
11022                "                \\\n"
11023                "  int ccc        = 234;                                        "
11024                "                \\\n"
11025                "  int dddddddddd = 2345;",
11026                Alignment);
11027   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
11028                "k = 4, int l = 5,\n"
11029                "                  int m = 6) {\n"
11030                "  int j      = 10;\n"
11031                "  otherThing = 1;\n"
11032                "}",
11033                Alignment);
11034   verifyFormat("void SomeFunction(int parameter = 0) {\n"
11035                "  int i   = 1;\n"
11036                "  int j   = 2;\n"
11037                "  int big = 10000;\n"
11038                "}",
11039                Alignment);
11040   verifyFormat("class C {\n"
11041                "public:\n"
11042                "  int i            = 1;\n"
11043                "  virtual void f() = 0;\n"
11044                "};",
11045                Alignment);
11046   verifyFormat("int i = 1;\n"
11047                "if (SomeType t = getSomething()) {\n"
11048                "}\n"
11049                "int j   = 2;\n"
11050                "int big = 10000;",
11051                Alignment);
11052   verifyFormat("int j = 7;\n"
11053                "for (int k = 0; k < N; ++k) {\n"
11054                "}\n"
11055                "int j   = 2;\n"
11056                "int big = 10000;\n"
11057                "}",
11058                Alignment);
11059   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
11060   verifyFormat("int i = 1;\n"
11061                "LooooooooooongType loooooooooooooooooooooongVariable\n"
11062                "    = someLooooooooooooooooongFunction();\n"
11063                "int j = 2;",
11064                Alignment);
11065   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
11066   verifyFormat("int i = 1;\n"
11067                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
11068                "    someLooooooooooooooooongFunction();\n"
11069                "int j = 2;",
11070                Alignment);
11071 
11072   verifyFormat("auto lambda = []() {\n"
11073                "  auto i = 0;\n"
11074                "  return 0;\n"
11075                "};\n"
11076                "int i  = 0;\n"
11077                "auto v = type{\n"
11078                "    i = 1,   //\n"
11079                "    (i = 2), //\n"
11080                "    i = 3    //\n"
11081                "};",
11082                Alignment);
11083 
11084   verifyFormat(
11085       "int i      = 1;\n"
11086       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
11087       "                          loooooooooooooooooooooongParameterB);\n"
11088       "int j      = 2;",
11089       Alignment);
11090 
11091   verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
11092                "          typename B   = very_long_type_name_1,\n"
11093                "          typename T_2 = very_long_type_name_2>\n"
11094                "auto foo() {}\n",
11095                Alignment);
11096   verifyFormat("int a, b = 1;\n"
11097                "int c  = 2;\n"
11098                "int dd = 3;\n",
11099                Alignment);
11100   verifyFormat("int aa       = ((1 > 2) ? 3 : 4);\n"
11101                "float b[1][] = {{3.f}};\n",
11102                Alignment);
11103   verifyFormat("for (int i = 0; i < 1; i++)\n"
11104                "  int x = 1;\n",
11105                Alignment);
11106   verifyFormat("for (i = 0; i < 1; i++)\n"
11107                "  x = 1;\n"
11108                "y = 1;\n",
11109                Alignment);
11110 }
11111 
11112 TEST_F(FormatTest, AlignConsecutiveDeclarations) {
11113   FormatStyle Alignment = getLLVMStyle();
11114   Alignment.AlignConsecutiveMacros = true;
11115   Alignment.AlignConsecutiveDeclarations = false;
11116   verifyFormat("float const a = 5;\n"
11117                "int oneTwoThree = 123;",
11118                Alignment);
11119   verifyFormat("int a = 5;\n"
11120                "float const oneTwoThree = 123;",
11121                Alignment);
11122 
11123   Alignment.AlignConsecutiveDeclarations = true;
11124   verifyFormat("float const a = 5;\n"
11125                "int         oneTwoThree = 123;",
11126                Alignment);
11127   verifyFormat("int         a = method();\n"
11128                "float const oneTwoThree = 133;",
11129                Alignment);
11130   verifyFormat("int i = 1, j = 10;\n"
11131                "something = 2000;",
11132                Alignment);
11133   verifyFormat("something = 2000;\n"
11134                "int i = 1, j = 10;\n",
11135                Alignment);
11136   verifyFormat("float      something = 2000;\n"
11137                "double     another = 911;\n"
11138                "int        i = 1, j = 10;\n"
11139                "const int *oneMore = 1;\n"
11140                "unsigned   i = 2;",
11141                Alignment);
11142   verifyFormat("float a = 5;\n"
11143                "int   one = 1;\n"
11144                "method();\n"
11145                "const double       oneTwoThree = 123;\n"
11146                "const unsigned int oneTwo = 12;",
11147                Alignment);
11148   verifyFormat("int      oneTwoThree{0}; // comment\n"
11149                "unsigned oneTwo;         // comment",
11150                Alignment);
11151   EXPECT_EQ("float const a = 5;\n"
11152             "\n"
11153             "int oneTwoThree = 123;",
11154             format("float const   a = 5;\n"
11155                    "\n"
11156                    "int           oneTwoThree= 123;",
11157                    Alignment));
11158   EXPECT_EQ("float a = 5;\n"
11159             "int   one = 1;\n"
11160             "\n"
11161             "unsigned oneTwoThree = 123;",
11162             format("float    a = 5;\n"
11163                    "int      one = 1;\n"
11164                    "\n"
11165                    "unsigned oneTwoThree = 123;",
11166                    Alignment));
11167   EXPECT_EQ("float a = 5;\n"
11168             "int   one = 1;\n"
11169             "\n"
11170             "unsigned oneTwoThree = 123;\n"
11171             "int      oneTwo = 12;",
11172             format("float    a = 5;\n"
11173                    "int one = 1;\n"
11174                    "\n"
11175                    "unsigned oneTwoThree = 123;\n"
11176                    "int oneTwo = 12;",
11177                    Alignment));
11178   // Function prototype alignment
11179   verifyFormat("int    a();\n"
11180                "double b();",
11181                Alignment);
11182   verifyFormat("int    a(int x);\n"
11183                "double b();",
11184                Alignment);
11185   unsigned OldColumnLimit = Alignment.ColumnLimit;
11186   // We need to set ColumnLimit to zero, in order to stress nested alignments,
11187   // otherwise the function parameters will be re-flowed onto a single line.
11188   Alignment.ColumnLimit = 0;
11189   EXPECT_EQ("int    a(int   x,\n"
11190             "         float y);\n"
11191             "double b(int    x,\n"
11192             "         double y);",
11193             format("int a(int x,\n"
11194                    " float y);\n"
11195                    "double b(int x,\n"
11196                    " double y);",
11197                    Alignment));
11198   // This ensures that function parameters of function declarations are
11199   // correctly indented when their owning functions are indented.
11200   // The failure case here is for 'double y' to not be indented enough.
11201   EXPECT_EQ("double a(int x);\n"
11202             "int    b(int    y,\n"
11203             "         double z);",
11204             format("double a(int x);\n"
11205                    "int b(int y,\n"
11206                    " double z);",
11207                    Alignment));
11208   // Set ColumnLimit low so that we induce wrapping immediately after
11209   // the function name and opening paren.
11210   Alignment.ColumnLimit = 13;
11211   verifyFormat("int function(\n"
11212                "    int  x,\n"
11213                "    bool y);",
11214                Alignment);
11215   Alignment.ColumnLimit = OldColumnLimit;
11216   // Ensure function pointers don't screw up recursive alignment
11217   verifyFormat("int    a(int x, void (*fp)(int y));\n"
11218                "double b();",
11219                Alignment);
11220   Alignment.AlignConsecutiveAssignments = true;
11221   // Ensure recursive alignment is broken by function braces, so that the
11222   // "a = 1" does not align with subsequent assignments inside the function
11223   // body.
11224   verifyFormat("int func(int a = 1) {\n"
11225                "  int b  = 2;\n"
11226                "  int cc = 3;\n"
11227                "}",
11228                Alignment);
11229   verifyFormat("float      something = 2000;\n"
11230                "double     another   = 911;\n"
11231                "int        i = 1, j = 10;\n"
11232                "const int *oneMore = 1;\n"
11233                "unsigned   i       = 2;",
11234                Alignment);
11235   verifyFormat("int      oneTwoThree = {0}; // comment\n"
11236                "unsigned oneTwo      = 0;   // comment",
11237                Alignment);
11238   // Make sure that scope is correctly tracked, in the absence of braces
11239   verifyFormat("for (int i = 0; i < n; i++)\n"
11240                "  j = i;\n"
11241                "double x = 1;\n",
11242                Alignment);
11243   verifyFormat("if (int i = 0)\n"
11244                "  j = i;\n"
11245                "double x = 1;\n",
11246                Alignment);
11247   // Ensure operator[] and operator() are comprehended
11248   verifyFormat("struct test {\n"
11249                "  long long int foo();\n"
11250                "  int           operator[](int a);\n"
11251                "  double        bar();\n"
11252                "};\n",
11253                Alignment);
11254   verifyFormat("struct test {\n"
11255                "  long long int foo();\n"
11256                "  int           operator()(int a);\n"
11257                "  double        bar();\n"
11258                "};\n",
11259                Alignment);
11260   EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
11261             "  int const i   = 1;\n"
11262             "  int *     j   = 2;\n"
11263             "  int       big = 10000;\n"
11264             "\n"
11265             "  unsigned oneTwoThree = 123;\n"
11266             "  int      oneTwo      = 12;\n"
11267             "  method();\n"
11268             "  float k  = 2;\n"
11269             "  int   ll = 10000;\n"
11270             "}",
11271             format("void SomeFunction(int parameter= 0) {\n"
11272                    " int const  i= 1;\n"
11273                    "  int *j=2;\n"
11274                    " int big  =  10000;\n"
11275                    "\n"
11276                    "unsigned oneTwoThree  =123;\n"
11277                    "int oneTwo = 12;\n"
11278                    "  method();\n"
11279                    "float k= 2;\n"
11280                    "int ll=10000;\n"
11281                    "}",
11282                    Alignment));
11283   Alignment.AlignConsecutiveAssignments = false;
11284   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
11285   verifyFormat("#define A \\\n"
11286                "  int       aaaa = 12; \\\n"
11287                "  float     b = 23; \\\n"
11288                "  const int ccc = 234; \\\n"
11289                "  unsigned  dddddddddd = 2345;",
11290                Alignment);
11291   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
11292   verifyFormat("#define A              \\\n"
11293                "  int       aaaa = 12; \\\n"
11294                "  float     b = 23;    \\\n"
11295                "  const int ccc = 234; \\\n"
11296                "  unsigned  dddddddddd = 2345;",
11297                Alignment);
11298   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
11299   Alignment.ColumnLimit = 30;
11300   verifyFormat("#define A                    \\\n"
11301                "  int       aaaa = 12;       \\\n"
11302                "  float     b = 23;          \\\n"
11303                "  const int ccc = 234;       \\\n"
11304                "  int       dddddddddd = 2345;",
11305                Alignment);
11306   Alignment.ColumnLimit = 80;
11307   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
11308                "k = 4, int l = 5,\n"
11309                "                  int m = 6) {\n"
11310                "  const int j = 10;\n"
11311                "  otherThing = 1;\n"
11312                "}",
11313                Alignment);
11314   verifyFormat("void SomeFunction(int parameter = 0) {\n"
11315                "  int const i = 1;\n"
11316                "  int *     j = 2;\n"
11317                "  int       big = 10000;\n"
11318                "}",
11319                Alignment);
11320   verifyFormat("class C {\n"
11321                "public:\n"
11322                "  int          i = 1;\n"
11323                "  virtual void f() = 0;\n"
11324                "};",
11325                Alignment);
11326   verifyFormat("float i = 1;\n"
11327                "if (SomeType t = getSomething()) {\n"
11328                "}\n"
11329                "const unsigned j = 2;\n"
11330                "int            big = 10000;",
11331                Alignment);
11332   verifyFormat("float j = 7;\n"
11333                "for (int k = 0; k < N; ++k) {\n"
11334                "}\n"
11335                "unsigned j = 2;\n"
11336                "int      big = 10000;\n"
11337                "}",
11338                Alignment);
11339   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
11340   verifyFormat("float              i = 1;\n"
11341                "LooooooooooongType loooooooooooooooooooooongVariable\n"
11342                "    = someLooooooooooooooooongFunction();\n"
11343                "int j = 2;",
11344                Alignment);
11345   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
11346   verifyFormat("int                i = 1;\n"
11347                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
11348                "    someLooooooooooooooooongFunction();\n"
11349                "int j = 2;",
11350                Alignment);
11351 
11352   Alignment.AlignConsecutiveAssignments = true;
11353   verifyFormat("auto lambda = []() {\n"
11354                "  auto  ii = 0;\n"
11355                "  float j  = 0;\n"
11356                "  return 0;\n"
11357                "};\n"
11358                "int   i  = 0;\n"
11359                "float i2 = 0;\n"
11360                "auto  v  = type{\n"
11361                "    i = 1,   //\n"
11362                "    (i = 2), //\n"
11363                "    i = 3    //\n"
11364                "};",
11365                Alignment);
11366   Alignment.AlignConsecutiveAssignments = false;
11367 
11368   verifyFormat(
11369       "int      i = 1;\n"
11370       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
11371       "                          loooooooooooooooooooooongParameterB);\n"
11372       "int      j = 2;",
11373       Alignment);
11374 
11375   // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
11376   // We expect declarations and assignments to align, as long as it doesn't
11377   // exceed the column limit, starting a new alignment sequence whenever it
11378   // happens.
11379   Alignment.AlignConsecutiveAssignments = true;
11380   Alignment.ColumnLimit = 30;
11381   verifyFormat("float    ii              = 1;\n"
11382                "unsigned j               = 2;\n"
11383                "int someVerylongVariable = 1;\n"
11384                "AnotherLongType  ll = 123456;\n"
11385                "VeryVeryLongType k  = 2;\n"
11386                "int              myvar = 1;",
11387                Alignment);
11388   Alignment.ColumnLimit = 80;
11389   Alignment.AlignConsecutiveAssignments = false;
11390 
11391   verifyFormat(
11392       "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
11393       "          typename LongType, typename B>\n"
11394       "auto foo() {}\n",
11395       Alignment);
11396   verifyFormat("float a, b = 1;\n"
11397                "int   c = 2;\n"
11398                "int   dd = 3;\n",
11399                Alignment);
11400   verifyFormat("int   aa = ((1 > 2) ? 3 : 4);\n"
11401                "float b[1][] = {{3.f}};\n",
11402                Alignment);
11403   Alignment.AlignConsecutiveAssignments = true;
11404   verifyFormat("float a, b = 1;\n"
11405                "int   c  = 2;\n"
11406                "int   dd = 3;\n",
11407                Alignment);
11408   verifyFormat("int   aa     = ((1 > 2) ? 3 : 4);\n"
11409                "float b[1][] = {{3.f}};\n",
11410                Alignment);
11411   Alignment.AlignConsecutiveAssignments = false;
11412 
11413   Alignment.ColumnLimit = 30;
11414   Alignment.BinPackParameters = false;
11415   verifyFormat("void foo(float     a,\n"
11416                "         float     b,\n"
11417                "         int       c,\n"
11418                "         uint32_t *d) {\n"
11419                "  int *  e = 0;\n"
11420                "  float  f = 0;\n"
11421                "  double g = 0;\n"
11422                "}\n"
11423                "void bar(ino_t     a,\n"
11424                "         int       b,\n"
11425                "         uint32_t *c,\n"
11426                "         bool      d) {}\n",
11427                Alignment);
11428   Alignment.BinPackParameters = true;
11429   Alignment.ColumnLimit = 80;
11430 
11431   // Bug 33507
11432   Alignment.PointerAlignment = FormatStyle::PAS_Middle;
11433   verifyFormat(
11434       "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
11435       "  static const Version verVs2017;\n"
11436       "  return true;\n"
11437       "});\n",
11438       Alignment);
11439   Alignment.PointerAlignment = FormatStyle::PAS_Right;
11440 
11441   // See llvm.org/PR35641
11442   Alignment.AlignConsecutiveDeclarations = true;
11443   verifyFormat("int func() { //\n"
11444                "  int      b;\n"
11445                "  unsigned c;\n"
11446                "}",
11447                Alignment);
11448 
11449   // See PR37175
11450   FormatStyle Style = getMozillaStyle();
11451   Style.AlignConsecutiveDeclarations = true;
11452   EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n"
11453             "foo(int a);",
11454             format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style));
11455 }
11456 
11457 TEST_F(FormatTest, LinuxBraceBreaking) {
11458   FormatStyle LinuxBraceStyle = getLLVMStyle();
11459   LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
11460   verifyFormat("namespace a\n"
11461                "{\n"
11462                "class A\n"
11463                "{\n"
11464                "  void f()\n"
11465                "  {\n"
11466                "    if (true) {\n"
11467                "      a();\n"
11468                "      b();\n"
11469                "    } else {\n"
11470                "      a();\n"
11471                "    }\n"
11472                "  }\n"
11473                "  void g() { return; }\n"
11474                "};\n"
11475                "struct B {\n"
11476                "  int x;\n"
11477                "};\n"
11478                "} // namespace a\n",
11479                LinuxBraceStyle);
11480   verifyFormat("enum X {\n"
11481                "  Y = 0,\n"
11482                "}\n",
11483                LinuxBraceStyle);
11484   verifyFormat("struct S {\n"
11485                "  int Type;\n"
11486                "  union {\n"
11487                "    int x;\n"
11488                "    double y;\n"
11489                "  } Value;\n"
11490                "  class C\n"
11491                "  {\n"
11492                "    MyFavoriteType Value;\n"
11493                "  } Class;\n"
11494                "}\n",
11495                LinuxBraceStyle);
11496 }
11497 
11498 TEST_F(FormatTest, MozillaBraceBreaking) {
11499   FormatStyle MozillaBraceStyle = getLLVMStyle();
11500   MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
11501   MozillaBraceStyle.FixNamespaceComments = false;
11502   verifyFormat("namespace a {\n"
11503                "class A\n"
11504                "{\n"
11505                "  void f()\n"
11506                "  {\n"
11507                "    if (true) {\n"
11508                "      a();\n"
11509                "      b();\n"
11510                "    }\n"
11511                "  }\n"
11512                "  void g() { return; }\n"
11513                "};\n"
11514                "enum E\n"
11515                "{\n"
11516                "  A,\n"
11517                "  // foo\n"
11518                "  B,\n"
11519                "  C\n"
11520                "};\n"
11521                "struct B\n"
11522                "{\n"
11523                "  int x;\n"
11524                "};\n"
11525                "}\n",
11526                MozillaBraceStyle);
11527   verifyFormat("struct S\n"
11528                "{\n"
11529                "  int Type;\n"
11530                "  union\n"
11531                "  {\n"
11532                "    int x;\n"
11533                "    double y;\n"
11534                "  } Value;\n"
11535                "  class C\n"
11536                "  {\n"
11537                "    MyFavoriteType Value;\n"
11538                "  } Class;\n"
11539                "}\n",
11540                MozillaBraceStyle);
11541 }
11542 
11543 TEST_F(FormatTest, StroustrupBraceBreaking) {
11544   FormatStyle StroustrupBraceStyle = getLLVMStyle();
11545   StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
11546   verifyFormat("namespace a {\n"
11547                "class A {\n"
11548                "  void f()\n"
11549                "  {\n"
11550                "    if (true) {\n"
11551                "      a();\n"
11552                "      b();\n"
11553                "    }\n"
11554                "  }\n"
11555                "  void g() { return; }\n"
11556                "};\n"
11557                "struct B {\n"
11558                "  int x;\n"
11559                "};\n"
11560                "} // namespace a\n",
11561                StroustrupBraceStyle);
11562 
11563   verifyFormat("void foo()\n"
11564                "{\n"
11565                "  if (a) {\n"
11566                "    a();\n"
11567                "  }\n"
11568                "  else {\n"
11569                "    b();\n"
11570                "  }\n"
11571                "}\n",
11572                StroustrupBraceStyle);
11573 
11574   verifyFormat("#ifdef _DEBUG\n"
11575                "int foo(int i = 0)\n"
11576                "#else\n"
11577                "int foo(int i = 5)\n"
11578                "#endif\n"
11579                "{\n"
11580                "  return i;\n"
11581                "}",
11582                StroustrupBraceStyle);
11583 
11584   verifyFormat("void foo() {}\n"
11585                "void bar()\n"
11586                "#ifdef _DEBUG\n"
11587                "{\n"
11588                "  foo();\n"
11589                "}\n"
11590                "#else\n"
11591                "{\n"
11592                "}\n"
11593                "#endif",
11594                StroustrupBraceStyle);
11595 
11596   verifyFormat("void foobar() { int i = 5; }\n"
11597                "#ifdef _DEBUG\n"
11598                "void bar() {}\n"
11599                "#else\n"
11600                "void bar() { foobar(); }\n"
11601                "#endif",
11602                StroustrupBraceStyle);
11603 }
11604 
11605 TEST_F(FormatTest, AllmanBraceBreaking) {
11606   FormatStyle AllmanBraceStyle = getLLVMStyle();
11607   AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
11608 
11609   EXPECT_EQ("namespace a\n"
11610             "{\n"
11611             "void f();\n"
11612             "void g();\n"
11613             "} // namespace a\n",
11614             format("namespace a\n"
11615                    "{\n"
11616                    "void f();\n"
11617                    "void g();\n"
11618                    "}\n",
11619                    AllmanBraceStyle));
11620 
11621   verifyFormat("namespace a\n"
11622                "{\n"
11623                "class A\n"
11624                "{\n"
11625                "  void f()\n"
11626                "  {\n"
11627                "    if (true)\n"
11628                "    {\n"
11629                "      a();\n"
11630                "      b();\n"
11631                "    }\n"
11632                "  }\n"
11633                "  void g() { return; }\n"
11634                "};\n"
11635                "struct B\n"
11636                "{\n"
11637                "  int x;\n"
11638                "};\n"
11639                "union C\n"
11640                "{\n"
11641                "};\n"
11642                "} // namespace a",
11643                AllmanBraceStyle);
11644 
11645   verifyFormat("void f()\n"
11646                "{\n"
11647                "  if (true)\n"
11648                "  {\n"
11649                "    a();\n"
11650                "  }\n"
11651                "  else if (false)\n"
11652                "  {\n"
11653                "    b();\n"
11654                "  }\n"
11655                "  else\n"
11656                "  {\n"
11657                "    c();\n"
11658                "  }\n"
11659                "}\n",
11660                AllmanBraceStyle);
11661 
11662   verifyFormat("void f()\n"
11663                "{\n"
11664                "  for (int i = 0; i < 10; ++i)\n"
11665                "  {\n"
11666                "    a();\n"
11667                "  }\n"
11668                "  while (false)\n"
11669                "  {\n"
11670                "    b();\n"
11671                "  }\n"
11672                "  do\n"
11673                "  {\n"
11674                "    c();\n"
11675                "  } while (false)\n"
11676                "}\n",
11677                AllmanBraceStyle);
11678 
11679   verifyFormat("void f(int a)\n"
11680                "{\n"
11681                "  switch (a)\n"
11682                "  {\n"
11683                "  case 0:\n"
11684                "    break;\n"
11685                "  case 1:\n"
11686                "  {\n"
11687                "    break;\n"
11688                "  }\n"
11689                "  case 2:\n"
11690                "  {\n"
11691                "  }\n"
11692                "  break;\n"
11693                "  default:\n"
11694                "    break;\n"
11695                "  }\n"
11696                "}\n",
11697                AllmanBraceStyle);
11698 
11699   verifyFormat("enum X\n"
11700                "{\n"
11701                "  Y = 0,\n"
11702                "}\n",
11703                AllmanBraceStyle);
11704   verifyFormat("enum X\n"
11705                "{\n"
11706                "  Y = 0\n"
11707                "}\n",
11708                AllmanBraceStyle);
11709 
11710   verifyFormat("@interface BSApplicationController ()\n"
11711                "{\n"
11712                "@private\n"
11713                "  id _extraIvar;\n"
11714                "}\n"
11715                "@end\n",
11716                AllmanBraceStyle);
11717 
11718   verifyFormat("#ifdef _DEBUG\n"
11719                "int foo(int i = 0)\n"
11720                "#else\n"
11721                "int foo(int i = 5)\n"
11722                "#endif\n"
11723                "{\n"
11724                "  return i;\n"
11725                "}",
11726                AllmanBraceStyle);
11727 
11728   verifyFormat("void foo() {}\n"
11729                "void bar()\n"
11730                "#ifdef _DEBUG\n"
11731                "{\n"
11732                "  foo();\n"
11733                "}\n"
11734                "#else\n"
11735                "{\n"
11736                "}\n"
11737                "#endif",
11738                AllmanBraceStyle);
11739 
11740   verifyFormat("void foobar() { int i = 5; }\n"
11741                "#ifdef _DEBUG\n"
11742                "void bar() {}\n"
11743                "#else\n"
11744                "void bar() { foobar(); }\n"
11745                "#endif",
11746                AllmanBraceStyle);
11747 
11748   // This shouldn't affect ObjC blocks..
11749   verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
11750                "  // ...\n"
11751                "  int i;\n"
11752                "}];",
11753                AllmanBraceStyle);
11754   verifyFormat("void (^block)(void) = ^{\n"
11755                "  // ...\n"
11756                "  int i;\n"
11757                "};",
11758                AllmanBraceStyle);
11759   // .. or dict literals.
11760   verifyFormat("void f()\n"
11761                "{\n"
11762                "  // ...\n"
11763                "  [object someMethod:@{@\"a\" : @\"b\"}];\n"
11764                "}",
11765                AllmanBraceStyle);
11766   verifyFormat("void f()\n"
11767                "{\n"
11768                "  // ...\n"
11769                "  [object someMethod:@{a : @\"b\"}];\n"
11770                "}",
11771                AllmanBraceStyle);
11772   verifyFormat("int f()\n"
11773                "{ // comment\n"
11774                "  return 42;\n"
11775                "}",
11776                AllmanBraceStyle);
11777 
11778   AllmanBraceStyle.ColumnLimit = 19;
11779   verifyFormat("void f() { int i; }", AllmanBraceStyle);
11780   AllmanBraceStyle.ColumnLimit = 18;
11781   verifyFormat("void f()\n"
11782                "{\n"
11783                "  int i;\n"
11784                "}",
11785                AllmanBraceStyle);
11786   AllmanBraceStyle.ColumnLimit = 80;
11787 
11788   FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
11789   BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine =
11790       FormatStyle::SIS_WithoutElse;
11791   BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
11792   verifyFormat("void f(bool b)\n"
11793                "{\n"
11794                "  if (b)\n"
11795                "  {\n"
11796                "    return;\n"
11797                "  }\n"
11798                "}\n",
11799                BreakBeforeBraceShortIfs);
11800   verifyFormat("void f(bool b)\n"
11801                "{\n"
11802                "  if constexpr (b)\n"
11803                "  {\n"
11804                "    return;\n"
11805                "  }\n"
11806                "}\n",
11807                BreakBeforeBraceShortIfs);
11808   verifyFormat("void f(bool b)\n"
11809                "{\n"
11810                "  if CONSTEXPR (b)\n"
11811                "  {\n"
11812                "    return;\n"
11813                "  }\n"
11814                "}\n",
11815                BreakBeforeBraceShortIfs);
11816   verifyFormat("void f(bool b)\n"
11817                "{\n"
11818                "  if (b) return;\n"
11819                "}\n",
11820                BreakBeforeBraceShortIfs);
11821   verifyFormat("void f(bool b)\n"
11822                "{\n"
11823                "  if constexpr (b) return;\n"
11824                "}\n",
11825                BreakBeforeBraceShortIfs);
11826   verifyFormat("void f(bool b)\n"
11827                "{\n"
11828                "  if CONSTEXPR (b) return;\n"
11829                "}\n",
11830                BreakBeforeBraceShortIfs);
11831   verifyFormat("void f(bool b)\n"
11832                "{\n"
11833                "  while (b)\n"
11834                "  {\n"
11835                "    return;\n"
11836                "  }\n"
11837                "}\n",
11838                BreakBeforeBraceShortIfs);
11839 }
11840 
11841 TEST_F(FormatTest, WhitesmithsBraceBreaking) {
11842   FormatStyle WhitesmithsBraceStyle = getLLVMStyle();
11843   WhitesmithsBraceStyle.BreakBeforeBraces = FormatStyle::BS_Whitesmiths;
11844 
11845   // Make a few changes to the style for testing purposes
11846   WhitesmithsBraceStyle.AllowShortFunctionsOnASingleLine =
11847       FormatStyle::SFS_Empty;
11848   WhitesmithsBraceStyle.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None;
11849   WhitesmithsBraceStyle.ColumnLimit = 0;
11850 
11851   // FIXME: this test case can't decide whether there should be a blank line
11852   // after the ~D() line or not. It adds one if one doesn't exist in the test
11853   // and it removes the line if one exists.
11854   /*
11855   verifyFormat("class A;\n"
11856                "namespace B\n"
11857                "  {\n"
11858                "class C;\n"
11859                "// Comment\n"
11860                "class D\n"
11861                "  {\n"
11862                "public:\n"
11863                "  D();\n"
11864                "  ~D() {}\n"
11865                "private:\n"
11866                "  enum E\n"
11867                "    {\n"
11868                "    F\n"
11869                "    }\n"
11870                "  };\n"
11871                "  } // namespace B\n",
11872                WhitesmithsBraceStyle);
11873   */
11874 
11875   verifyFormat("namespace a\n"
11876                "  {\n"
11877                "class A\n"
11878                "  {\n"
11879                "  void f()\n"
11880                "    {\n"
11881                "    if (true)\n"
11882                "      {\n"
11883                "      a();\n"
11884                "      b();\n"
11885                "      }\n"
11886                "    }\n"
11887                "  void g()\n"
11888                "    {\n"
11889                "    return;\n"
11890                "    }\n"
11891                "  };\n"
11892                "struct B\n"
11893                "  {\n"
11894                "  int x;\n"
11895                "  };\n"
11896                "  } // namespace a",
11897                WhitesmithsBraceStyle);
11898 
11899   verifyFormat("void f()\n"
11900                "  {\n"
11901                "  if (true)\n"
11902                "    {\n"
11903                "    a();\n"
11904                "    }\n"
11905                "  else if (false)\n"
11906                "    {\n"
11907                "    b();\n"
11908                "    }\n"
11909                "  else\n"
11910                "    {\n"
11911                "    c();\n"
11912                "    }\n"
11913                "  }\n",
11914                WhitesmithsBraceStyle);
11915 
11916   verifyFormat("void f()\n"
11917                "  {\n"
11918                "  for (int i = 0; i < 10; ++i)\n"
11919                "    {\n"
11920                "    a();\n"
11921                "    }\n"
11922                "  while (false)\n"
11923                "    {\n"
11924                "    b();\n"
11925                "    }\n"
11926                "  do\n"
11927                "    {\n"
11928                "    c();\n"
11929                "    } while (false)\n"
11930                "  }\n",
11931                WhitesmithsBraceStyle);
11932 
11933   // FIXME: the block and the break under case 2 in this test don't get indented
11934   // correctly
11935   /*
11936   verifyFormat("void switchTest1(int a)\n"
11937                "  {\n"
11938                "  switch (a)\n"
11939                "    {\n"
11940                "    case 2:\n"
11941                "      {\n"
11942                "      }\n"
11943                "      break;\n"
11944                "    }\n"
11945                "  }\n",
11946                WhitesmithsBraceStyle);
11947   */
11948 
11949   // FIXME: the block and the break under case 2 in this test don't get indented
11950   // correctly
11951   /*
11952   verifyFormat("void switchTest2(int a)\n"
11953                "  {\n"
11954                "  switch (a)\n"
11955                "    {\n"
11956                "  case 0:\n"
11957                "    break;\n"
11958                "  case 1:\n"
11959                "    {\n"
11960                "    break;\n"
11961                "    }\n"
11962                "  case 2:\n"
11963                "    {\n"
11964                "    }\n"
11965                "    break;\n"
11966                "  default:\n"
11967                "    break;\n"
11968                "    }\n"
11969                "  }\n",
11970                WhitesmithsBraceStyle);
11971   */
11972 
11973   verifyFormat("enum X\n"
11974                "  {\n"
11975                "  Y = 0, // testing\n"
11976                "  }\n",
11977                WhitesmithsBraceStyle);
11978 
11979   verifyFormat("enum X\n"
11980                "  {\n"
11981                "  Y = 0\n"
11982                "  }\n",
11983                WhitesmithsBraceStyle);
11984   verifyFormat("enum X\n"
11985                "  {\n"
11986                "  Y = 0,\n"
11987                "  Z = 1\n"
11988                "  };\n",
11989                WhitesmithsBraceStyle);
11990 
11991   verifyFormat("@interface BSApplicationController ()\n"
11992                "  {\n"
11993                "@private\n"
11994                "  id _extraIvar;\n"
11995                "  }\n"
11996                "@end\n",
11997                WhitesmithsBraceStyle);
11998 
11999   verifyFormat("#ifdef _DEBUG\n"
12000                "int foo(int i = 0)\n"
12001                "#else\n"
12002                "int foo(int i = 5)\n"
12003                "#endif\n"
12004                "  {\n"
12005                "  return i;\n"
12006                "  }",
12007                WhitesmithsBraceStyle);
12008 
12009   verifyFormat("void foo() {}\n"
12010                "void bar()\n"
12011                "#ifdef _DEBUG\n"
12012                "  {\n"
12013                "  foo();\n"
12014                "  }\n"
12015                "#else\n"
12016                "  {\n"
12017                "  }\n"
12018                "#endif",
12019                WhitesmithsBraceStyle);
12020 
12021   verifyFormat("void foobar()\n"
12022                "  {\n"
12023                "  int i = 5;\n"
12024                "  }\n"
12025                "#ifdef _DEBUG\n"
12026                "void bar()\n"
12027                "  {\n"
12028                "  }\n"
12029                "#else\n"
12030                "void bar()\n"
12031                "  {\n"
12032                "  foobar();\n"
12033                "  }\n"
12034                "#endif",
12035                WhitesmithsBraceStyle);
12036 
12037   // This shouldn't affect ObjC blocks..
12038   verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
12039                "  // ...\n"
12040                "  int i;\n"
12041                "}];",
12042                WhitesmithsBraceStyle);
12043   verifyFormat("void (^block)(void) = ^{\n"
12044                "  // ...\n"
12045                "  int i;\n"
12046                "};",
12047                WhitesmithsBraceStyle);
12048   // .. or dict literals.
12049   verifyFormat("void f()\n"
12050                "  {\n"
12051                "  [object someMethod:@{@\"a\" : @\"b\"}];\n"
12052                "  }",
12053                WhitesmithsBraceStyle);
12054 
12055   verifyFormat("int f()\n"
12056                "  { // comment\n"
12057                "  return 42;\n"
12058                "  }",
12059                WhitesmithsBraceStyle);
12060 
12061   FormatStyle BreakBeforeBraceShortIfs = WhitesmithsBraceStyle;
12062   BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine =
12063       FormatStyle::SIS_Always;
12064   BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
12065   verifyFormat("void f(bool b)\n"
12066                "  {\n"
12067                "  if (b)\n"
12068                "    {\n"
12069                "    return;\n"
12070                "    }\n"
12071                "  }\n",
12072                BreakBeforeBraceShortIfs);
12073   verifyFormat("void f(bool b)\n"
12074                "  {\n"
12075                "  if (b) return;\n"
12076                "  }\n",
12077                BreakBeforeBraceShortIfs);
12078   verifyFormat("void f(bool b)\n"
12079                "  {\n"
12080                "  while (b)\n"
12081                "    {\n"
12082                "    return;\n"
12083                "    }\n"
12084                "  }\n",
12085                BreakBeforeBraceShortIfs);
12086 }
12087 
12088 TEST_F(FormatTest, GNUBraceBreaking) {
12089   FormatStyle GNUBraceStyle = getLLVMStyle();
12090   GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
12091   verifyFormat("namespace a\n"
12092                "{\n"
12093                "class A\n"
12094                "{\n"
12095                "  void f()\n"
12096                "  {\n"
12097                "    int a;\n"
12098                "    {\n"
12099                "      int b;\n"
12100                "    }\n"
12101                "    if (true)\n"
12102                "      {\n"
12103                "        a();\n"
12104                "        b();\n"
12105                "      }\n"
12106                "  }\n"
12107                "  void g() { return; }\n"
12108                "}\n"
12109                "} // namespace a",
12110                GNUBraceStyle);
12111 
12112   verifyFormat("void f()\n"
12113                "{\n"
12114                "  if (true)\n"
12115                "    {\n"
12116                "      a();\n"
12117                "    }\n"
12118                "  else if (false)\n"
12119                "    {\n"
12120                "      b();\n"
12121                "    }\n"
12122                "  else\n"
12123                "    {\n"
12124                "      c();\n"
12125                "    }\n"
12126                "}\n",
12127                GNUBraceStyle);
12128 
12129   verifyFormat("void f()\n"
12130                "{\n"
12131                "  for (int i = 0; i < 10; ++i)\n"
12132                "    {\n"
12133                "      a();\n"
12134                "    }\n"
12135                "  while (false)\n"
12136                "    {\n"
12137                "      b();\n"
12138                "    }\n"
12139                "  do\n"
12140                "    {\n"
12141                "      c();\n"
12142                "    }\n"
12143                "  while (false);\n"
12144                "}\n",
12145                GNUBraceStyle);
12146 
12147   verifyFormat("void f(int a)\n"
12148                "{\n"
12149                "  switch (a)\n"
12150                "    {\n"
12151                "    case 0:\n"
12152                "      break;\n"
12153                "    case 1:\n"
12154                "      {\n"
12155                "        break;\n"
12156                "      }\n"
12157                "    case 2:\n"
12158                "      {\n"
12159                "      }\n"
12160                "      break;\n"
12161                "    default:\n"
12162                "      break;\n"
12163                "    }\n"
12164                "}\n",
12165                GNUBraceStyle);
12166 
12167   verifyFormat("enum X\n"
12168                "{\n"
12169                "  Y = 0,\n"
12170                "}\n",
12171                GNUBraceStyle);
12172 
12173   verifyFormat("@interface BSApplicationController ()\n"
12174                "{\n"
12175                "@private\n"
12176                "  id _extraIvar;\n"
12177                "}\n"
12178                "@end\n",
12179                GNUBraceStyle);
12180 
12181   verifyFormat("#ifdef _DEBUG\n"
12182                "int foo(int i = 0)\n"
12183                "#else\n"
12184                "int foo(int i = 5)\n"
12185                "#endif\n"
12186                "{\n"
12187                "  return i;\n"
12188                "}",
12189                GNUBraceStyle);
12190 
12191   verifyFormat("void foo() {}\n"
12192                "void bar()\n"
12193                "#ifdef _DEBUG\n"
12194                "{\n"
12195                "  foo();\n"
12196                "}\n"
12197                "#else\n"
12198                "{\n"
12199                "}\n"
12200                "#endif",
12201                GNUBraceStyle);
12202 
12203   verifyFormat("void foobar() { int i = 5; }\n"
12204                "#ifdef _DEBUG\n"
12205                "void bar() {}\n"
12206                "#else\n"
12207                "void bar() { foobar(); }\n"
12208                "#endif",
12209                GNUBraceStyle);
12210 }
12211 
12212 TEST_F(FormatTest, WebKitBraceBreaking) {
12213   FormatStyle WebKitBraceStyle = getLLVMStyle();
12214   WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
12215   WebKitBraceStyle.FixNamespaceComments = false;
12216   verifyFormat("namespace a {\n"
12217                "class A {\n"
12218                "  void f()\n"
12219                "  {\n"
12220                "    if (true) {\n"
12221                "      a();\n"
12222                "      b();\n"
12223                "    }\n"
12224                "  }\n"
12225                "  void g() { return; }\n"
12226                "};\n"
12227                "enum E {\n"
12228                "  A,\n"
12229                "  // foo\n"
12230                "  B,\n"
12231                "  C\n"
12232                "};\n"
12233                "struct B {\n"
12234                "  int x;\n"
12235                "};\n"
12236                "}\n",
12237                WebKitBraceStyle);
12238   verifyFormat("struct S {\n"
12239                "  int Type;\n"
12240                "  union {\n"
12241                "    int x;\n"
12242                "    double y;\n"
12243                "  } Value;\n"
12244                "  class C {\n"
12245                "    MyFavoriteType Value;\n"
12246                "  } Class;\n"
12247                "};\n",
12248                WebKitBraceStyle);
12249 }
12250 
12251 TEST_F(FormatTest, CatchExceptionReferenceBinding) {
12252   verifyFormat("void f() {\n"
12253                "  try {\n"
12254                "  } catch (const Exception &e) {\n"
12255                "  }\n"
12256                "}\n",
12257                getLLVMStyle());
12258 }
12259 
12260 TEST_F(FormatTest, UnderstandsPragmas) {
12261   verifyFormat("#pragma omp reduction(| : var)");
12262   verifyFormat("#pragma omp reduction(+ : var)");
12263 
12264   EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
12265             "(including parentheses).",
12266             format("#pragma    mark   Any non-hyphenated or hyphenated string "
12267                    "(including parentheses)."));
12268 }
12269 
12270 TEST_F(FormatTest, UnderstandPragmaOption) {
12271   verifyFormat("#pragma option -C -A");
12272 
12273   EXPECT_EQ("#pragma option -C -A", format("#pragma    option   -C   -A"));
12274 }
12275 
12276 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
12277   FormatStyle Style = getLLVMStyle();
12278   Style.ColumnLimit = 20;
12279 
12280   // See PR41213
12281   EXPECT_EQ("/*\n"
12282             " *\t9012345\n"
12283             " * /8901\n"
12284             " */",
12285             format("/*\n"
12286                    " *\t9012345 /8901\n"
12287                    " */",
12288                    Style));
12289   EXPECT_EQ("/*\n"
12290             " *345678\n"
12291             " *\t/8901\n"
12292             " */",
12293             format("/*\n"
12294                    " *345678\t/8901\n"
12295                    " */",
12296                    Style));
12297 
12298   verifyFormat("int a; // the\n"
12299                "       // comment",
12300                Style);
12301   EXPECT_EQ("int a; /* first line\n"
12302             "        * second\n"
12303             "        * line third\n"
12304             "        * line\n"
12305             "        */",
12306             format("int a; /* first line\n"
12307                    "        * second\n"
12308                    "        * line third\n"
12309                    "        * line\n"
12310                    "        */",
12311                    Style));
12312   EXPECT_EQ("int a; // first line\n"
12313             "       // second\n"
12314             "       // line third\n"
12315             "       // line",
12316             format("int a; // first line\n"
12317                    "       // second line\n"
12318                    "       // third line",
12319                    Style));
12320 
12321   Style.PenaltyExcessCharacter = 90;
12322   verifyFormat("int a; // the comment", Style);
12323   EXPECT_EQ("int a; // the comment\n"
12324             "       // aaa",
12325             format("int a; // the comment aaa", Style));
12326   EXPECT_EQ("int a; /* first line\n"
12327             "        * second line\n"
12328             "        * third line\n"
12329             "        */",
12330             format("int a; /* first line\n"
12331                    "        * second line\n"
12332                    "        * third line\n"
12333                    "        */",
12334                    Style));
12335   EXPECT_EQ("int a; // first line\n"
12336             "       // second line\n"
12337             "       // third line",
12338             format("int a; // first line\n"
12339                    "       // second line\n"
12340                    "       // third line",
12341                    Style));
12342   // FIXME: Investigate why this is not getting the same layout as the test
12343   // above.
12344   EXPECT_EQ("int a; /* first line\n"
12345             "        * second line\n"
12346             "        * third line\n"
12347             "        */",
12348             format("int a; /* first line second line third line"
12349                    "\n*/",
12350                    Style));
12351 
12352   EXPECT_EQ("// foo bar baz bazfoo\n"
12353             "// foo bar foo bar\n",
12354             format("// foo bar baz bazfoo\n"
12355                    "// foo bar foo           bar\n",
12356                    Style));
12357   EXPECT_EQ("// foo bar baz bazfoo\n"
12358             "// foo bar foo bar\n",
12359             format("// foo bar baz      bazfoo\n"
12360                    "// foo            bar foo bar\n",
12361                    Style));
12362 
12363   // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
12364   // next one.
12365   EXPECT_EQ("// foo bar baz bazfoo\n"
12366             "// bar foo bar\n",
12367             format("// foo bar baz      bazfoo bar\n"
12368                    "// foo            bar\n",
12369                    Style));
12370 
12371   EXPECT_EQ("// foo bar baz bazfoo\n"
12372             "// foo bar baz bazfoo\n"
12373             "// bar foo bar\n",
12374             format("// foo bar baz      bazfoo\n"
12375                    "// foo bar baz      bazfoo bar\n"
12376                    "// foo bar\n",
12377                    Style));
12378 
12379   EXPECT_EQ("// foo bar baz bazfoo\n"
12380             "// foo bar baz bazfoo\n"
12381             "// bar foo bar\n",
12382             format("// foo bar baz      bazfoo\n"
12383                    "// foo bar baz      bazfoo bar\n"
12384                    "// foo           bar\n",
12385                    Style));
12386 
12387   // Make sure we do not keep protruding characters if strict mode reflow is
12388   // cheaper than keeping protruding characters.
12389   Style.ColumnLimit = 21;
12390   EXPECT_EQ(
12391       "// foo foo foo foo\n"
12392       "// foo foo foo foo\n"
12393       "// foo foo foo foo\n",
12394       format("// foo foo foo foo foo foo foo foo foo foo foo foo\n", Style));
12395 
12396   EXPECT_EQ("int a = /* long block\n"
12397             "           comment */\n"
12398             "    42;",
12399             format("int a = /* long block comment */ 42;", Style));
12400 }
12401 
12402 #define EXPECT_ALL_STYLES_EQUAL(Styles)                                        \
12403   for (size_t i = 1; i < Styles.size(); ++i)                                   \
12404   EXPECT_EQ(Styles[0], Styles[i])                                              \
12405       << "Style #" << i << " of " << Styles.size() << " differs from Style #0"
12406 
12407 TEST_F(FormatTest, GetsPredefinedStyleByName) {
12408   SmallVector<FormatStyle, 3> Styles;
12409   Styles.resize(3);
12410 
12411   Styles[0] = getLLVMStyle();
12412   EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
12413   EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
12414   EXPECT_ALL_STYLES_EQUAL(Styles);
12415 
12416   Styles[0] = getGoogleStyle();
12417   EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
12418   EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
12419   EXPECT_ALL_STYLES_EQUAL(Styles);
12420 
12421   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
12422   EXPECT_TRUE(
12423       getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
12424   EXPECT_TRUE(
12425       getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
12426   EXPECT_ALL_STYLES_EQUAL(Styles);
12427 
12428   Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
12429   EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
12430   EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
12431   EXPECT_ALL_STYLES_EQUAL(Styles);
12432 
12433   Styles[0] = getMozillaStyle();
12434   EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
12435   EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
12436   EXPECT_ALL_STYLES_EQUAL(Styles);
12437 
12438   Styles[0] = getWebKitStyle();
12439   EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
12440   EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
12441   EXPECT_ALL_STYLES_EQUAL(Styles);
12442 
12443   Styles[0] = getGNUStyle();
12444   EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
12445   EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
12446   EXPECT_ALL_STYLES_EQUAL(Styles);
12447 
12448   EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
12449 }
12450 
12451 TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
12452   SmallVector<FormatStyle, 8> Styles;
12453   Styles.resize(2);
12454 
12455   Styles[0] = getGoogleStyle();
12456   Styles[1] = getLLVMStyle();
12457   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
12458   EXPECT_ALL_STYLES_EQUAL(Styles);
12459 
12460   Styles.resize(5);
12461   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
12462   Styles[1] = getLLVMStyle();
12463   Styles[1].Language = FormatStyle::LK_JavaScript;
12464   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
12465 
12466   Styles[2] = getLLVMStyle();
12467   Styles[2].Language = FormatStyle::LK_JavaScript;
12468   EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
12469                                   "BasedOnStyle: Google",
12470                                   &Styles[2])
12471                    .value());
12472 
12473   Styles[3] = getLLVMStyle();
12474   Styles[3].Language = FormatStyle::LK_JavaScript;
12475   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
12476                                   "Language: JavaScript",
12477                                   &Styles[3])
12478                    .value());
12479 
12480   Styles[4] = getLLVMStyle();
12481   Styles[4].Language = FormatStyle::LK_JavaScript;
12482   EXPECT_EQ(0, parseConfiguration("---\n"
12483                                   "BasedOnStyle: LLVM\n"
12484                                   "IndentWidth: 123\n"
12485                                   "---\n"
12486                                   "BasedOnStyle: Google\n"
12487                                   "Language: JavaScript",
12488                                   &Styles[4])
12489                    .value());
12490   EXPECT_ALL_STYLES_EQUAL(Styles);
12491 }
12492 
12493 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME)                             \
12494   Style.FIELD = false;                                                         \
12495   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value());      \
12496   EXPECT_TRUE(Style.FIELD);                                                    \
12497   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value());     \
12498   EXPECT_FALSE(Style.FIELD);
12499 
12500 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
12501 
12502 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME)              \
12503   Style.STRUCT.FIELD = false;                                                  \
12504   EXPECT_EQ(0,                                                                 \
12505             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": true", &Style)   \
12506                 .value());                                                     \
12507   EXPECT_TRUE(Style.STRUCT.FIELD);                                             \
12508   EXPECT_EQ(0,                                                                 \
12509             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": false", &Style)  \
12510                 .value());                                                     \
12511   EXPECT_FALSE(Style.STRUCT.FIELD);
12512 
12513 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD)                                 \
12514   CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
12515 
12516 #define CHECK_PARSE(TEXT, FIELD, VALUE)                                        \
12517   EXPECT_NE(VALUE, Style.FIELD);                                               \
12518   EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value());                      \
12519   EXPECT_EQ(VALUE, Style.FIELD)
12520 
12521 TEST_F(FormatTest, ParsesConfigurationBools) {
12522   FormatStyle Style = {};
12523   Style.Language = FormatStyle::LK_Cpp;
12524   CHECK_PARSE_BOOL(AlignOperands);
12525   CHECK_PARSE_BOOL(AlignTrailingComments);
12526   CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
12527   CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
12528   CHECK_PARSE_BOOL(AlignConsecutiveMacros);
12529   CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine);
12530   CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine);
12531   CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
12532   CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
12533   CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
12534   CHECK_PARSE_BOOL(BinPackArguments);
12535   CHECK_PARSE_BOOL(BinPackParameters);
12536   CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
12537   CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
12538   CHECK_PARSE_BOOL(BreakStringLiterals);
12539   CHECK_PARSE_BOOL(CompactNamespaces);
12540   CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
12541   CHECK_PARSE_BOOL(DeriveLineEnding);
12542   CHECK_PARSE_BOOL(DerivePointerAlignment);
12543   CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
12544   CHECK_PARSE_BOOL(DisableFormat);
12545   CHECK_PARSE_BOOL(IndentCaseLabels);
12546   CHECK_PARSE_BOOL(IndentGotoLabels);
12547   CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
12548   CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
12549   CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
12550   CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
12551   CHECK_PARSE_BOOL(Cpp11BracedListStyle);
12552   CHECK_PARSE_BOOL(ReflowComments);
12553   CHECK_PARSE_BOOL(SortIncludes);
12554   CHECK_PARSE_BOOL(SortUsingDeclarations);
12555   CHECK_PARSE_BOOL(SpacesInParentheses);
12556   CHECK_PARSE_BOOL(SpacesInSquareBrackets);
12557   CHECK_PARSE_BOOL(SpacesInAngles);
12558   CHECK_PARSE_BOOL(SpacesInConditionalStatement);
12559   CHECK_PARSE_BOOL(SpaceInEmptyBlock);
12560   CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
12561   CHECK_PARSE_BOOL(SpacesInContainerLiterals);
12562   CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
12563   CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
12564   CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
12565   CHECK_PARSE_BOOL(SpaceAfterLogicalNot);
12566   CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
12567   CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList);
12568   CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon);
12569   CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon);
12570   CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon);
12571   CHECK_PARSE_BOOL(SpaceBeforeSquareBrackets);
12572   CHECK_PARSE_BOOL(UseCRLF);
12573 
12574   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel);
12575   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
12576   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
12577   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
12578   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
12579   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
12580   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
12581   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
12582   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
12583   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
12584   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
12585   CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
12586   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
12587   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
12588   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
12589 }
12590 
12591 #undef CHECK_PARSE_BOOL
12592 
12593 TEST_F(FormatTest, ParsesConfiguration) {
12594   FormatStyle Style = {};
12595   Style.Language = FormatStyle::LK_Cpp;
12596   CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
12597   CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
12598               ConstructorInitializerIndentWidth, 1234u);
12599   CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
12600   CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
12601   CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
12602   CHECK_PARSE("PenaltyBreakAssignment: 1234", PenaltyBreakAssignment, 1234u);
12603   CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
12604               PenaltyBreakBeforeFirstCallParameter, 1234u);
12605   CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234",
12606               PenaltyBreakTemplateDeclaration, 1234u);
12607   CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
12608   CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
12609               PenaltyReturnTypeOnItsOwnLine, 1234u);
12610   CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
12611               SpacesBeforeTrailingComments, 1234u);
12612   CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
12613   CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
12614   CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
12615 
12616   Style.PointerAlignment = FormatStyle::PAS_Middle;
12617   CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
12618               FormatStyle::PAS_Left);
12619   CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
12620               FormatStyle::PAS_Right);
12621   CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
12622               FormatStyle::PAS_Middle);
12623   // For backward compatibility:
12624   CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
12625               FormatStyle::PAS_Left);
12626   CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
12627               FormatStyle::PAS_Right);
12628   CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
12629               FormatStyle::PAS_Middle);
12630 
12631   Style.Standard = FormatStyle::LS_Auto;
12632   CHECK_PARSE("Standard: c++03", Standard, FormatStyle::LS_Cpp03);
12633   CHECK_PARSE("Standard: c++11", Standard, FormatStyle::LS_Cpp11);
12634   CHECK_PARSE("Standard: c++14", Standard, FormatStyle::LS_Cpp14);
12635   CHECK_PARSE("Standard: c++17", Standard, FormatStyle::LS_Cpp17);
12636   CHECK_PARSE("Standard: c++20", Standard, FormatStyle::LS_Cpp20);
12637   CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
12638   CHECK_PARSE("Standard: Latest", Standard, FormatStyle::LS_Latest);
12639   // Legacy aliases:
12640   CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
12641   CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Latest);
12642   CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
12643   CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
12644 
12645   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
12646   CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
12647               BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
12648   CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
12649               FormatStyle::BOS_None);
12650   CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
12651               FormatStyle::BOS_All);
12652   // For backward compatibility:
12653   CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
12654               FormatStyle::BOS_None);
12655   CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
12656               FormatStyle::BOS_All);
12657 
12658   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
12659   CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
12660               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
12661   CHECK_PARSE("BreakConstructorInitializers: AfterColon",
12662               BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
12663   CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
12664               BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
12665   // For backward compatibility:
12666   CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
12667               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
12668 
12669   Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
12670   CHECK_PARSE("BreakInheritanceList: BeforeComma", BreakInheritanceList,
12671               FormatStyle::BILS_BeforeComma);
12672   CHECK_PARSE("BreakInheritanceList: AfterColon", BreakInheritanceList,
12673               FormatStyle::BILS_AfterColon);
12674   CHECK_PARSE("BreakInheritanceList: BeforeColon", BreakInheritanceList,
12675               FormatStyle::BILS_BeforeColon);
12676   // For backward compatibility:
12677   CHECK_PARSE("BreakBeforeInheritanceComma: true", BreakInheritanceList,
12678               FormatStyle::BILS_BeforeComma);
12679 
12680   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
12681   CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
12682               FormatStyle::BAS_Align);
12683   CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
12684               FormatStyle::BAS_DontAlign);
12685   CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
12686               FormatStyle::BAS_AlwaysBreak);
12687   // For backward compatibility:
12688   CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
12689               FormatStyle::BAS_DontAlign);
12690   CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
12691               FormatStyle::BAS_Align);
12692 
12693   Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
12694   CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
12695               FormatStyle::ENAS_DontAlign);
12696   CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
12697               FormatStyle::ENAS_Left);
12698   CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
12699               FormatStyle::ENAS_Right);
12700   // For backward compatibility:
12701   CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
12702               FormatStyle::ENAS_Left);
12703   CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
12704               FormatStyle::ENAS_Right);
12705 
12706   Style.UseTab = FormatStyle::UT_ForIndentation;
12707   CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
12708   CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
12709   CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
12710   CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
12711               FormatStyle::UT_ForContinuationAndIndentation);
12712   // For backward compatibility:
12713   CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
12714   CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
12715 
12716   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty;
12717   CHECK_PARSE("AllowShortBlocksOnASingleLine: Never",
12718               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never);
12719   CHECK_PARSE("AllowShortBlocksOnASingleLine: Empty",
12720               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Empty);
12721   CHECK_PARSE("AllowShortBlocksOnASingleLine: Always",
12722               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always);
12723   // For backward compatibility:
12724   CHECK_PARSE("AllowShortBlocksOnASingleLine: false",
12725               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never);
12726   CHECK_PARSE("AllowShortBlocksOnASingleLine: true",
12727               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always);
12728 
12729   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
12730   CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
12731               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
12732   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
12733               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
12734   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
12735               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
12736   CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
12737               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
12738   // For backward compatibility:
12739   CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
12740               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
12741   CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
12742               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
12743 
12744   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
12745   CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
12746               FormatStyle::SBPO_Never);
12747   CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
12748               FormatStyle::SBPO_Always);
12749   CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
12750               FormatStyle::SBPO_ControlStatements);
12751   CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens,
12752               FormatStyle::SBPO_NonEmptyParentheses);
12753   // For backward compatibility:
12754   CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
12755               FormatStyle::SBPO_Never);
12756   CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
12757               FormatStyle::SBPO_ControlStatements);
12758 
12759   Style.ColumnLimit = 123;
12760   FormatStyle BaseStyle = getLLVMStyle();
12761   CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
12762   CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
12763 
12764   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
12765   CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
12766               FormatStyle::BS_Attach);
12767   CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
12768               FormatStyle::BS_Linux);
12769   CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
12770               FormatStyle::BS_Mozilla);
12771   CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
12772               FormatStyle::BS_Stroustrup);
12773   CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
12774               FormatStyle::BS_Allman);
12775   CHECK_PARSE("BreakBeforeBraces: Whitesmiths", BreakBeforeBraces,
12776               FormatStyle::BS_Whitesmiths);
12777   CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
12778   CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
12779               FormatStyle::BS_WebKit);
12780   CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
12781               FormatStyle::BS_Custom);
12782 
12783   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Never;
12784   CHECK_PARSE("BraceWrapping:\n"
12785               "  AfterControlStatement: MultiLine",
12786               BraceWrapping.AfterControlStatement,
12787               FormatStyle::BWACS_MultiLine);
12788   CHECK_PARSE("BraceWrapping:\n"
12789               "  AfterControlStatement: Always",
12790               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always);
12791   CHECK_PARSE("BraceWrapping:\n"
12792               "  AfterControlStatement: Never",
12793               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never);
12794   // For backward compatibility:
12795   CHECK_PARSE("BraceWrapping:\n"
12796               "  AfterControlStatement: true",
12797               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always);
12798   CHECK_PARSE("BraceWrapping:\n"
12799               "  AfterControlStatement: false",
12800               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never);
12801 
12802   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
12803   CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
12804               FormatStyle::RTBS_None);
12805   CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
12806               FormatStyle::RTBS_All);
12807   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
12808               AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
12809   CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
12810               AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
12811   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
12812               AlwaysBreakAfterReturnType,
12813               FormatStyle::RTBS_TopLevelDefinitions);
12814 
12815   Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
12816   CHECK_PARSE("AlwaysBreakTemplateDeclarations: No",
12817               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_No);
12818   CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine",
12819               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine);
12820   CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes",
12821               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes);
12822   CHECK_PARSE("AlwaysBreakTemplateDeclarations: false",
12823               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine);
12824   CHECK_PARSE("AlwaysBreakTemplateDeclarations: true",
12825               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes);
12826 
12827   Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
12828   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
12829               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
12830   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
12831               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
12832   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
12833               AlwaysBreakAfterDefinitionReturnType,
12834               FormatStyle::DRTBS_TopLevel);
12835 
12836   Style.NamespaceIndentation = FormatStyle::NI_All;
12837   CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
12838               FormatStyle::NI_None);
12839   CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
12840               FormatStyle::NI_Inner);
12841   CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
12842               FormatStyle::NI_All);
12843 
12844   Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always;
12845   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never",
12846               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
12847   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse",
12848               AllowShortIfStatementsOnASingleLine,
12849               FormatStyle::SIS_WithoutElse);
12850   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always",
12851               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always);
12852   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false",
12853               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
12854   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true",
12855               AllowShortIfStatementsOnASingleLine,
12856               FormatStyle::SIS_WithoutElse);
12857 
12858   // FIXME: This is required because parsing a configuration simply overwrites
12859   // the first N elements of the list instead of resetting it.
12860   Style.ForEachMacros.clear();
12861   std::vector<std::string> BoostForeach;
12862   BoostForeach.push_back("BOOST_FOREACH");
12863   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
12864   std::vector<std::string> BoostAndQForeach;
12865   BoostAndQForeach.push_back("BOOST_FOREACH");
12866   BoostAndQForeach.push_back("Q_FOREACH");
12867   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
12868               BoostAndQForeach);
12869 
12870   Style.StatementMacros.clear();
12871   CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros,
12872               std::vector<std::string>{"QUNUSED"});
12873   CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros,
12874               std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"}));
12875 
12876   Style.NamespaceMacros.clear();
12877   CHECK_PARSE("NamespaceMacros: [TESTSUITE]", NamespaceMacros,
12878               std::vector<std::string>{"TESTSUITE"});
12879   CHECK_PARSE("NamespaceMacros: [TESTSUITE, SUITE]", NamespaceMacros,
12880               std::vector<std::string>({"TESTSUITE", "SUITE"}));
12881 
12882   Style.IncludeStyle.IncludeCategories.clear();
12883   std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = {
12884       {"abc/.*", 2, 0}, {".*", 1, 0}};
12885   CHECK_PARSE("IncludeCategories:\n"
12886               "  - Regex: abc/.*\n"
12887               "    Priority: 2\n"
12888               "  - Regex: .*\n"
12889               "    Priority: 1",
12890               IncludeStyle.IncludeCategories, ExpectedCategories);
12891   CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex,
12892               "abc$");
12893   CHECK_PARSE("IncludeIsMainSourceRegex: 'abc$'",
12894               IncludeStyle.IncludeIsMainSourceRegex, "abc$");
12895 
12896   Style.RawStringFormats.clear();
12897   std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
12898       {
12899           FormatStyle::LK_TextProto,
12900           {"pb", "proto"},
12901           {"PARSE_TEXT_PROTO"},
12902           /*CanonicalDelimiter=*/"",
12903           "llvm",
12904       },
12905       {
12906           FormatStyle::LK_Cpp,
12907           {"cc", "cpp"},
12908           {"C_CODEBLOCK", "CPPEVAL"},
12909           /*CanonicalDelimiter=*/"cc",
12910           /*BasedOnStyle=*/"",
12911       },
12912   };
12913 
12914   CHECK_PARSE("RawStringFormats:\n"
12915               "  - Language: TextProto\n"
12916               "    Delimiters:\n"
12917               "      - 'pb'\n"
12918               "      - 'proto'\n"
12919               "    EnclosingFunctions:\n"
12920               "      - 'PARSE_TEXT_PROTO'\n"
12921               "    BasedOnStyle: llvm\n"
12922               "  - Language: Cpp\n"
12923               "    Delimiters:\n"
12924               "      - 'cc'\n"
12925               "      - 'cpp'\n"
12926               "    EnclosingFunctions:\n"
12927               "      - 'C_CODEBLOCK'\n"
12928               "      - 'CPPEVAL'\n"
12929               "    CanonicalDelimiter: 'cc'",
12930               RawStringFormats, ExpectedRawStringFormats);
12931 }
12932 
12933 TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
12934   FormatStyle Style = {};
12935   Style.Language = FormatStyle::LK_Cpp;
12936   CHECK_PARSE("Language: Cpp\n"
12937               "IndentWidth: 12",
12938               IndentWidth, 12u);
12939   EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
12940                                "IndentWidth: 34",
12941                                &Style),
12942             ParseError::Unsuitable);
12943   EXPECT_EQ(12u, Style.IndentWidth);
12944   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
12945   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
12946 
12947   Style.Language = FormatStyle::LK_JavaScript;
12948   CHECK_PARSE("Language: JavaScript\n"
12949               "IndentWidth: 12",
12950               IndentWidth, 12u);
12951   CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
12952   EXPECT_EQ(parseConfiguration("Language: Cpp\n"
12953                                "IndentWidth: 34",
12954                                &Style),
12955             ParseError::Unsuitable);
12956   EXPECT_EQ(23u, Style.IndentWidth);
12957   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
12958   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
12959 
12960   CHECK_PARSE("BasedOnStyle: LLVM\n"
12961               "IndentWidth: 67",
12962               IndentWidth, 67u);
12963 
12964   CHECK_PARSE("---\n"
12965               "Language: JavaScript\n"
12966               "IndentWidth: 12\n"
12967               "---\n"
12968               "Language: Cpp\n"
12969               "IndentWidth: 34\n"
12970               "...\n",
12971               IndentWidth, 12u);
12972 
12973   Style.Language = FormatStyle::LK_Cpp;
12974   CHECK_PARSE("---\n"
12975               "Language: JavaScript\n"
12976               "IndentWidth: 12\n"
12977               "---\n"
12978               "Language: Cpp\n"
12979               "IndentWidth: 34\n"
12980               "...\n",
12981               IndentWidth, 34u);
12982   CHECK_PARSE("---\n"
12983               "IndentWidth: 78\n"
12984               "---\n"
12985               "Language: JavaScript\n"
12986               "IndentWidth: 56\n"
12987               "...\n",
12988               IndentWidth, 78u);
12989 
12990   Style.ColumnLimit = 123;
12991   Style.IndentWidth = 234;
12992   Style.BreakBeforeBraces = FormatStyle::BS_Linux;
12993   Style.TabWidth = 345;
12994   EXPECT_FALSE(parseConfiguration("---\n"
12995                                   "IndentWidth: 456\n"
12996                                   "BreakBeforeBraces: Allman\n"
12997                                   "---\n"
12998                                   "Language: JavaScript\n"
12999                                   "IndentWidth: 111\n"
13000                                   "TabWidth: 111\n"
13001                                   "---\n"
13002                                   "Language: Cpp\n"
13003                                   "BreakBeforeBraces: Stroustrup\n"
13004                                   "TabWidth: 789\n"
13005                                   "...\n",
13006                                   &Style));
13007   EXPECT_EQ(123u, Style.ColumnLimit);
13008   EXPECT_EQ(456u, Style.IndentWidth);
13009   EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
13010   EXPECT_EQ(789u, Style.TabWidth);
13011 
13012   EXPECT_EQ(parseConfiguration("---\n"
13013                                "Language: JavaScript\n"
13014                                "IndentWidth: 56\n"
13015                                "---\n"
13016                                "IndentWidth: 78\n"
13017                                "...\n",
13018                                &Style),
13019             ParseError::Error);
13020   EXPECT_EQ(parseConfiguration("---\n"
13021                                "Language: JavaScript\n"
13022                                "IndentWidth: 56\n"
13023                                "---\n"
13024                                "Language: JavaScript\n"
13025                                "IndentWidth: 78\n"
13026                                "...\n",
13027                                &Style),
13028             ParseError::Error);
13029 
13030   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
13031 }
13032 
13033 #undef CHECK_PARSE
13034 
13035 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
13036   FormatStyle Style = {};
13037   Style.Language = FormatStyle::LK_JavaScript;
13038   Style.BreakBeforeTernaryOperators = true;
13039   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
13040   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
13041 
13042   Style.BreakBeforeTernaryOperators = true;
13043   EXPECT_EQ(0, parseConfiguration("---\n"
13044                                   "BasedOnStyle: Google\n"
13045                                   "---\n"
13046                                   "Language: JavaScript\n"
13047                                   "IndentWidth: 76\n"
13048                                   "...\n",
13049                                   &Style)
13050                    .value());
13051   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
13052   EXPECT_EQ(76u, Style.IndentWidth);
13053   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
13054 }
13055 
13056 TEST_F(FormatTest, ConfigurationRoundTripTest) {
13057   FormatStyle Style = getLLVMStyle();
13058   std::string YAML = configurationAsText(Style);
13059   FormatStyle ParsedStyle = {};
13060   ParsedStyle.Language = FormatStyle::LK_Cpp;
13061   EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
13062   EXPECT_EQ(Style, ParsedStyle);
13063 }
13064 
13065 TEST_F(FormatTest, WorksFor8bitEncodings) {
13066   EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
13067             "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
13068             "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
13069             "\"\xef\xee\xf0\xf3...\"",
13070             format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
13071                    "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
13072                    "\xef\xee\xf0\xf3...\"",
13073                    getLLVMStyleWithColumns(12)));
13074 }
13075 
13076 TEST_F(FormatTest, HandlesUTF8BOM) {
13077   EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
13078   EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
13079             format("\xef\xbb\xbf#include <iostream>"));
13080   EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
13081             format("\xef\xbb\xbf\n#include <iostream>"));
13082 }
13083 
13084 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
13085 #if !defined(_MSC_VER)
13086 
13087 TEST_F(FormatTest, CountsUTF8CharactersProperly) {
13088   verifyFormat("\"Однажды в студёную зимнюю пору...\"",
13089                getLLVMStyleWithColumns(35));
13090   verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
13091                getLLVMStyleWithColumns(31));
13092   verifyFormat("// Однажды в студёную зимнюю пору...",
13093                getLLVMStyleWithColumns(36));
13094   verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
13095   verifyFormat("/* Однажды в студёную зимнюю пору... */",
13096                getLLVMStyleWithColumns(39));
13097   verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
13098                getLLVMStyleWithColumns(35));
13099 }
13100 
13101 TEST_F(FormatTest, SplitsUTF8Strings) {
13102   // Non-printable characters' width is currently considered to be the length in
13103   // bytes in UTF8. The characters can be displayed in very different manner
13104   // (zero-width, single width with a substitution glyph, expanded to their code
13105   // (e.g. "<8d>"), so there's no single correct way to handle them.
13106   EXPECT_EQ("\"aaaaÄ\"\n"
13107             "\"\xc2\x8d\";",
13108             format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
13109   EXPECT_EQ("\"aaaaaaaÄ\"\n"
13110             "\"\xc2\x8d\";",
13111             format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
13112   EXPECT_EQ("\"Однажды, в \"\n"
13113             "\"студёную \"\n"
13114             "\"зимнюю \"\n"
13115             "\"пору,\"",
13116             format("\"Однажды, в студёную зимнюю пору,\"",
13117                    getLLVMStyleWithColumns(13)));
13118   EXPECT_EQ(
13119       "\"一 二 三 \"\n"
13120       "\"四 五六 \"\n"
13121       "\"七 八 九 \"\n"
13122       "\"十\"",
13123       format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
13124   EXPECT_EQ("\"一\t\"\n"
13125             "\"二 \t\"\n"
13126             "\"三 四 \"\n"
13127             "\"五\t\"\n"
13128             "\"六 \t\"\n"
13129             "\"七 \"\n"
13130             "\"八九十\tqq\"",
13131             format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
13132                    getLLVMStyleWithColumns(11)));
13133 
13134   // UTF8 character in an escape sequence.
13135   EXPECT_EQ("\"aaaaaa\"\n"
13136             "\"\\\xC2\x8D\"",
13137             format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
13138 }
13139 
13140 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
13141   EXPECT_EQ("const char *sssss =\n"
13142             "    \"一二三四五六七八\\\n"
13143             " 九 十\";",
13144             format("const char *sssss = \"一二三四五六七八\\\n"
13145                    " 九 十\";",
13146                    getLLVMStyleWithColumns(30)));
13147 }
13148 
13149 TEST_F(FormatTest, SplitsUTF8LineComments) {
13150   EXPECT_EQ("// aaaaÄ\xc2\x8d",
13151             format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
13152   EXPECT_EQ("// Я из лесу\n"
13153             "// вышел; был\n"
13154             "// сильный\n"
13155             "// мороз.",
13156             format("// Я из лесу вышел; был сильный мороз.",
13157                    getLLVMStyleWithColumns(13)));
13158   EXPECT_EQ("// 一二三\n"
13159             "// 四五六七\n"
13160             "// 八  九\n"
13161             "// 十",
13162             format("// 一二三 四五六七 八  九 十", getLLVMStyleWithColumns(9)));
13163 }
13164 
13165 TEST_F(FormatTest, SplitsUTF8BlockComments) {
13166   EXPECT_EQ("/* Гляжу,\n"
13167             " * поднимается\n"
13168             " * медленно в\n"
13169             " * гору\n"
13170             " * Лошадка,\n"
13171             " * везущая\n"
13172             " * хворосту\n"
13173             " * воз. */",
13174             format("/* Гляжу, поднимается медленно в гору\n"
13175                    " * Лошадка, везущая хворосту воз. */",
13176                    getLLVMStyleWithColumns(13)));
13177   EXPECT_EQ(
13178       "/* 一二三\n"
13179       " * 四五六七\n"
13180       " * 八  九\n"
13181       " * 十  */",
13182       format("/* 一二三 四五六七 八  九 十  */", getLLVMStyleWithColumns(9)));
13183   EXPECT_EQ("/* �������� ��������\n"
13184             " * ��������\n"
13185             " * ������-�� */",
13186             format("/* �������� �������� �������� ������-�� */", getLLVMStyleWithColumns(12)));
13187 }
13188 
13189 #endif // _MSC_VER
13190 
13191 TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
13192   FormatStyle Style = getLLVMStyle();
13193 
13194   Style.ConstructorInitializerIndentWidth = 4;
13195   verifyFormat(
13196       "SomeClass::Constructor()\n"
13197       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
13198       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
13199       Style);
13200 
13201   Style.ConstructorInitializerIndentWidth = 2;
13202   verifyFormat(
13203       "SomeClass::Constructor()\n"
13204       "  : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
13205       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
13206       Style);
13207 
13208   Style.ConstructorInitializerIndentWidth = 0;
13209   verifyFormat(
13210       "SomeClass::Constructor()\n"
13211       ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
13212       "  aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
13213       Style);
13214   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
13215   verifyFormat(
13216       "SomeLongTemplateVariableName<\n"
13217       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
13218       Style);
13219   verifyFormat("bool smaller = 1 < "
13220                "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
13221                "                       "
13222                "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
13223                Style);
13224 
13225   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
13226   verifyFormat("SomeClass::Constructor() :\n"
13227                "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n"
13228                "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}",
13229                Style);
13230 }
13231 
13232 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
13233   FormatStyle Style = getLLVMStyle();
13234   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
13235   Style.ConstructorInitializerIndentWidth = 4;
13236   verifyFormat("SomeClass::Constructor()\n"
13237                "    : a(a)\n"
13238                "    , b(b)\n"
13239                "    , c(c) {}",
13240                Style);
13241   verifyFormat("SomeClass::Constructor()\n"
13242                "    : a(a) {}",
13243                Style);
13244 
13245   Style.ColumnLimit = 0;
13246   verifyFormat("SomeClass::Constructor()\n"
13247                "    : a(a) {}",
13248                Style);
13249   verifyFormat("SomeClass::Constructor() noexcept\n"
13250                "    : a(a) {}",
13251                Style);
13252   verifyFormat("SomeClass::Constructor()\n"
13253                "    : a(a)\n"
13254                "    , b(b)\n"
13255                "    , c(c) {}",
13256                Style);
13257   verifyFormat("SomeClass::Constructor()\n"
13258                "    : a(a) {\n"
13259                "  foo();\n"
13260                "  bar();\n"
13261                "}",
13262                Style);
13263 
13264   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
13265   verifyFormat("SomeClass::Constructor()\n"
13266                "    : a(a)\n"
13267                "    , b(b)\n"
13268                "    , c(c) {\n}",
13269                Style);
13270   verifyFormat("SomeClass::Constructor()\n"
13271                "    : a(a) {\n}",
13272                Style);
13273 
13274   Style.ColumnLimit = 80;
13275   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
13276   Style.ConstructorInitializerIndentWidth = 2;
13277   verifyFormat("SomeClass::Constructor()\n"
13278                "  : a(a)\n"
13279                "  , b(b)\n"
13280                "  , c(c) {}",
13281                Style);
13282 
13283   Style.ConstructorInitializerIndentWidth = 0;
13284   verifyFormat("SomeClass::Constructor()\n"
13285                ": a(a)\n"
13286                ", b(b)\n"
13287                ", c(c) {}",
13288                Style);
13289 
13290   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
13291   Style.ConstructorInitializerIndentWidth = 4;
13292   verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
13293   verifyFormat(
13294       "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
13295       Style);
13296   verifyFormat(
13297       "SomeClass::Constructor()\n"
13298       "    : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
13299       Style);
13300   Style.ConstructorInitializerIndentWidth = 4;
13301   Style.ColumnLimit = 60;
13302   verifyFormat("SomeClass::Constructor()\n"
13303                "    : aaaaaaaa(aaaaaaaa)\n"
13304                "    , aaaaaaaa(aaaaaaaa)\n"
13305                "    , aaaaaaaa(aaaaaaaa) {}",
13306                Style);
13307 }
13308 
13309 TEST_F(FormatTest, Destructors) {
13310   verifyFormat("void F(int &i) { i.~int(); }");
13311   verifyFormat("void F(int &i) { i->~int(); }");
13312 }
13313 
13314 TEST_F(FormatTest, FormatsWithWebKitStyle) {
13315   FormatStyle Style = getWebKitStyle();
13316 
13317   // Don't indent in outer namespaces.
13318   verifyFormat("namespace outer {\n"
13319                "int i;\n"
13320                "namespace inner {\n"
13321                "    int i;\n"
13322                "} // namespace inner\n"
13323                "} // namespace outer\n"
13324                "namespace other_outer {\n"
13325                "int i;\n"
13326                "}",
13327                Style);
13328 
13329   // Don't indent case labels.
13330   verifyFormat("switch (variable) {\n"
13331                "case 1:\n"
13332                "case 2:\n"
13333                "    doSomething();\n"
13334                "    break;\n"
13335                "default:\n"
13336                "    ++variable;\n"
13337                "}",
13338                Style);
13339 
13340   // Wrap before binary operators.
13341   EXPECT_EQ("void f()\n"
13342             "{\n"
13343             "    if (aaaaaaaaaaaaaaaa\n"
13344             "        && bbbbbbbbbbbbbbbbbbbbbbbb\n"
13345             "        && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
13346             "        return;\n"
13347             "}",
13348             format("void f() {\n"
13349                    "if (aaaaaaaaaaaaaaaa\n"
13350                    "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
13351                    "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
13352                    "return;\n"
13353                    "}",
13354                    Style));
13355 
13356   // Allow functions on a single line.
13357   verifyFormat("void f() { return; }", Style);
13358 
13359   // Allow empty blocks on a single line and insert a space in empty blocks.
13360   EXPECT_EQ("void f() { }", format("void f() {}", Style));
13361   EXPECT_EQ("while (true) { }", format("while (true) {}", Style));
13362   // However, don't merge non-empty short loops.
13363   EXPECT_EQ("while (true) {\n"
13364             "    continue;\n"
13365             "}",
13366             format("while (true) { continue; }", Style));
13367 
13368   // Constructor initializers are formatted one per line with the "," on the
13369   // new line.
13370   verifyFormat("Constructor()\n"
13371                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
13372                "    , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
13373                "          aaaaaaaaaaaaaa)\n"
13374                "    , aaaaaaaaaaaaaaaaaaaaaaa()\n"
13375                "{\n"
13376                "}",
13377                Style);
13378   verifyFormat("SomeClass::Constructor()\n"
13379                "    : a(a)\n"
13380                "{\n"
13381                "}",
13382                Style);
13383   EXPECT_EQ("SomeClass::Constructor()\n"
13384             "    : a(a)\n"
13385             "{\n"
13386             "}",
13387             format("SomeClass::Constructor():a(a){}", Style));
13388   verifyFormat("SomeClass::Constructor()\n"
13389                "    : a(a)\n"
13390                "    , b(b)\n"
13391                "    , c(c)\n"
13392                "{\n"
13393                "}",
13394                Style);
13395   verifyFormat("SomeClass::Constructor()\n"
13396                "    : a(a)\n"
13397                "{\n"
13398                "    foo();\n"
13399                "    bar();\n"
13400                "}",
13401                Style);
13402 
13403   // Access specifiers should be aligned left.
13404   verifyFormat("class C {\n"
13405                "public:\n"
13406                "    int i;\n"
13407                "};",
13408                Style);
13409 
13410   // Do not align comments.
13411   verifyFormat("int a; // Do not\n"
13412                "double b; // align comments.",
13413                Style);
13414 
13415   // Do not align operands.
13416   EXPECT_EQ("ASSERT(aaaa\n"
13417             "    || bbbb);",
13418             format("ASSERT ( aaaa\n||bbbb);", Style));
13419 
13420   // Accept input's line breaks.
13421   EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
13422             "    || bbbbbbbbbbbbbbb) {\n"
13423             "    i++;\n"
13424             "}",
13425             format("if (aaaaaaaaaaaaaaa\n"
13426                    "|| bbbbbbbbbbbbbbb) { i++; }",
13427                    Style));
13428   EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
13429             "    i++;\n"
13430             "}",
13431             format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
13432 
13433   // Don't automatically break all macro definitions (llvm.org/PR17842).
13434   verifyFormat("#define aNumber 10", Style);
13435   // However, generally keep the line breaks that the user authored.
13436   EXPECT_EQ("#define aNumber \\\n"
13437             "    10",
13438             format("#define aNumber \\\n"
13439                    " 10",
13440                    Style));
13441 
13442   // Keep empty and one-element array literals on a single line.
13443   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
13444             "                                  copyItems:YES];",
13445             format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
13446                    "copyItems:YES];",
13447                    Style));
13448   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
13449             "                                  copyItems:YES];",
13450             format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
13451                    "             copyItems:YES];",
13452                    Style));
13453   // FIXME: This does not seem right, there should be more indentation before
13454   // the array literal's entries. Nested blocks have the same problem.
13455   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
13456             "    @\"a\",\n"
13457             "    @\"a\"\n"
13458             "]\n"
13459             "                                  copyItems:YES];",
13460             format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
13461                    "     @\"a\",\n"
13462                    "     @\"a\"\n"
13463                    "     ]\n"
13464                    "       copyItems:YES];",
13465                    Style));
13466   EXPECT_EQ(
13467       "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
13468       "                                  copyItems:YES];",
13469       format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
13470              "   copyItems:YES];",
13471              Style));
13472 
13473   verifyFormat("[self.a b:c c:d];", Style);
13474   EXPECT_EQ("[self.a b:c\n"
13475             "        c:d];",
13476             format("[self.a b:c\n"
13477                    "c:d];",
13478                    Style));
13479 }
13480 
13481 TEST_F(FormatTest, FormatsLambdas) {
13482   verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
13483   verifyFormat(
13484       "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n");
13485   verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
13486   verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
13487   verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
13488   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
13489   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
13490   verifyFormat("auto c = [a = [b = 42] {}] {};\n");
13491   verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
13492   verifyFormat("int x = f(*+[] {});");
13493   verifyFormat("void f() {\n"
13494                "  other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
13495                "}\n");
13496   verifyFormat("void f() {\n"
13497                "  other(x.begin(), //\n"
13498                "        x.end(),   //\n"
13499                "        [&](int, int) { return 1; });\n"
13500                "}\n");
13501   verifyFormat("void f() {\n"
13502                "  other.other.other.other.other(\n"
13503                "      x.begin(), x.end(),\n"
13504                "      [something, rather](int, int, int, int, int, int, int) { "
13505                "return 1; });\n"
13506                "}\n");
13507   verifyFormat(
13508       "void f() {\n"
13509       "  other.other.other.other.other(\n"
13510       "      x.begin(), x.end(),\n"
13511       "      [something, rather](int, int, int, int, int, int, int) {\n"
13512       "        //\n"
13513       "      });\n"
13514       "}\n");
13515   verifyFormat("SomeFunction([]() { // A cool function...\n"
13516                "  return 43;\n"
13517                "});");
13518   EXPECT_EQ("SomeFunction([]() {\n"
13519             "#define A a\n"
13520             "  return 43;\n"
13521             "});",
13522             format("SomeFunction([](){\n"
13523                    "#define A a\n"
13524                    "return 43;\n"
13525                    "});"));
13526   verifyFormat("void f() {\n"
13527                "  SomeFunction([](decltype(x), A *a) {});\n"
13528                "}");
13529   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
13530                "    [](const aaaaaaaaaa &a) { return a; });");
13531   verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
13532                "  SomeOtherFunctioooooooooooooooooooooooooon();\n"
13533                "});");
13534   verifyFormat("Constructor()\n"
13535                "    : Field([] { // comment\n"
13536                "        int i;\n"
13537                "      }) {}");
13538   verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
13539                "  return some_parameter.size();\n"
13540                "};");
13541   verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
13542                "    [](const string &s) { return s; };");
13543   verifyFormat("int i = aaaaaa ? 1 //\n"
13544                "               : [] {\n"
13545                "                   return 2; //\n"
13546                "                 }();");
13547   verifyFormat("llvm::errs() << \"number of twos is \"\n"
13548                "             << std::count_if(v.begin(), v.end(), [](int x) {\n"
13549                "                  return x == 2; // force break\n"
13550                "                });");
13551   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
13552                "    [=](int iiiiiiiiiiii) {\n"
13553                "      return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
13554                "             aaaaaaaaaaaaaaaaaaaaaaa;\n"
13555                "    });",
13556                getLLVMStyleWithColumns(60));
13557   verifyFormat("SomeFunction({[&] {\n"
13558                "                // comment\n"
13559                "              },\n"
13560                "              [&] {\n"
13561                "                // comment\n"
13562                "              }});");
13563   verifyFormat("SomeFunction({[&] {\n"
13564                "  // comment\n"
13565                "}});");
13566   verifyFormat(
13567       "virtual aaaaaaaaaaaaaaaa(\n"
13568       "    std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n"
13569       "    aaaaa aaaaaaaaa);");
13570 
13571   // Lambdas with return types.
13572   verifyFormat("int c = []() -> int { return 2; }();\n");
13573   verifyFormat("int c = []() -> int * { return 2; }();\n");
13574   verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
13575   verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
13576   verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
13577   verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
13578   verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
13579   verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
13580   verifyFormat("[a, a]() -> a<1> {};");
13581   verifyFormat("[]() -> foo<5 + 2> { return {}; };");
13582   verifyFormat("[]() -> foo<5 - 2> { return {}; };");
13583   verifyFormat("[]() -> foo<5 / 2> { return {}; };");
13584   verifyFormat("[]() -> foo<5 * 2> { return {}; };");
13585   verifyFormat("[]() -> foo<5 % 2> { return {}; };");
13586   verifyFormat("[]() -> foo<5 << 2> { return {}; };");
13587   verifyFormat("[]() -> foo<!5> { return {}; };");
13588   verifyFormat("[]() -> foo<~5> { return {}; };");
13589   verifyFormat("[]() -> foo<5 | 2> { return {}; };");
13590   verifyFormat("[]() -> foo<5 || 2> { return {}; };");
13591   verifyFormat("[]() -> foo<5 & 2> { return {}; };");
13592   verifyFormat("[]() -> foo<5 && 2> { return {}; };");
13593   verifyFormat("[]() -> foo<5 == 2> { return {}; };");
13594   verifyFormat("[]() -> foo<5 != 2> { return {}; };");
13595   verifyFormat("[]() -> foo<5 >= 2> { return {}; };");
13596   verifyFormat("[]() -> foo<5 <= 2> { return {}; };");
13597   verifyFormat("[]() -> foo<5 < 2> { return {}; };");
13598   verifyFormat("[]() -> foo<2 ? 1 : 0> { return {}; };");
13599   verifyFormat("namespace bar {\n"
13600                "// broken:\n"
13601                "auto foo{[]() -> foo<5 + 2> { return {}; }};\n"
13602                "} // namespace bar");
13603   verifyFormat("namespace bar {\n"
13604                "// broken:\n"
13605                "auto foo{[]() -> foo<5 - 2> { return {}; }};\n"
13606                "} // namespace bar");
13607   verifyFormat("namespace bar {\n"
13608                "// broken:\n"
13609                "auto foo{[]() -> foo<5 / 2> { return {}; }};\n"
13610                "} // namespace bar");
13611   verifyFormat("namespace bar {\n"
13612                "// broken:\n"
13613                "auto foo{[]() -> foo<5 * 2> { return {}; }};\n"
13614                "} // namespace bar");
13615   verifyFormat("namespace bar {\n"
13616                "// broken:\n"
13617                "auto foo{[]() -> foo<5 % 2> { return {}; }};\n"
13618                "} // namespace bar");
13619   verifyFormat("namespace bar {\n"
13620                "// broken:\n"
13621                "auto foo{[]() -> foo<5 << 2> { return {}; }};\n"
13622                "} // namespace bar");
13623   verifyFormat("namespace bar {\n"
13624                "// broken:\n"
13625                "auto foo{[]() -> foo<!5> { return {}; }};\n"
13626                "} // namespace bar");
13627   verifyFormat("namespace bar {\n"
13628                "// broken:\n"
13629                "auto foo{[]() -> foo<~5> { return {}; }};\n"
13630                "} // namespace bar");
13631   verifyFormat("namespace bar {\n"
13632                "// broken:\n"
13633                "auto foo{[]() -> foo<5 | 2> { return {}; }};\n"
13634                "} // namespace bar");
13635   verifyFormat("namespace bar {\n"
13636                "// broken:\n"
13637                "auto foo{[]() -> foo<5 || 2> { return {}; }};\n"
13638                "} // namespace bar");
13639   verifyFormat("namespace bar {\n"
13640                "// broken:\n"
13641                "auto foo{[]() -> foo<5 & 2> { return {}; }};\n"
13642                "} // namespace bar");
13643   verifyFormat("namespace bar {\n"
13644                "// broken:\n"
13645                "auto foo{[]() -> foo<5 && 2> { return {}; }};\n"
13646                "} // namespace bar");
13647   verifyFormat("namespace bar {\n"
13648                "// broken:\n"
13649                "auto foo{[]() -> foo<5 == 2> { return {}; }};\n"
13650                "} // namespace bar");
13651   verifyFormat("namespace bar {\n"
13652                "// broken:\n"
13653                "auto foo{[]() -> foo<5 != 2> { return {}; }};\n"
13654                "} // namespace bar");
13655   verifyFormat("namespace bar {\n"
13656                "// broken:\n"
13657                "auto foo{[]() -> foo<5 >= 2> { return {}; }};\n"
13658                "} // namespace bar");
13659   verifyFormat("namespace bar {\n"
13660                "// broken:\n"
13661                "auto foo{[]() -> foo<5 <= 2> { return {}; }};\n"
13662                "} // namespace bar");
13663   verifyFormat("namespace bar {\n"
13664                "// broken:\n"
13665                "auto foo{[]() -> foo<5 < 2> { return {}; }};\n"
13666                "} // namespace bar");
13667   verifyFormat("namespace bar {\n"
13668                "// broken:\n"
13669                "auto foo{[]() -> foo<2 ? 1 : 0> { return {}; }};\n"
13670                "} // namespace bar");
13671   verifyFormat("[]() -> a<1> {};");
13672   verifyFormat("[]() -> a<1> { ; };");
13673   verifyFormat("[]() -> a<1> { ; }();");
13674   verifyFormat("[a, a]() -> a<true> {};");
13675   verifyFormat("[]() -> a<true> {};");
13676   verifyFormat("[]() -> a<true> { ; };");
13677   verifyFormat("[]() -> a<true> { ; }();");
13678   verifyFormat("[a, a]() -> a<false> {};");
13679   verifyFormat("[]() -> a<false> {};");
13680   verifyFormat("[]() -> a<false> { ; };");
13681   verifyFormat("[]() -> a<false> { ; }();");
13682   verifyFormat("auto foo{[]() -> foo<false> { ; }};");
13683   verifyFormat("namespace bar {\n"
13684                "auto foo{[]() -> foo<false> { ; }};\n"
13685                "} // namespace bar");
13686   verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
13687                "                   int j) -> int {\n"
13688                "  return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
13689                "};");
13690   verifyFormat(
13691       "aaaaaaaaaaaaaaaaaaaaaa(\n"
13692       "    [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
13693       "      return aaaaaaaaaaaaaaaaa;\n"
13694       "    });",
13695       getLLVMStyleWithColumns(70));
13696   verifyFormat("[]() //\n"
13697                "    -> int {\n"
13698                "  return 1; //\n"
13699                "};");
13700 
13701   // Lambdas with explicit template argument lists.
13702   verifyFormat(
13703       "auto L = []<template <typename> class T, class U>(T<U> &&a) {};\n");
13704 
13705   // Multiple lambdas in the same parentheses change indentation rules. These
13706   // lambdas are forced to start on new lines.
13707   verifyFormat("SomeFunction(\n"
13708                "    []() {\n"
13709                "      //\n"
13710                "    },\n"
13711                "    []() {\n"
13712                "      //\n"
13713                "    });");
13714 
13715   // A lambda passed as arg0 is always pushed to the next line.
13716   verifyFormat("SomeFunction(\n"
13717                "    [this] {\n"
13718                "      //\n"
13719                "    },\n"
13720                "    1);\n");
13721 
13722   // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like
13723   // the arg0 case above.
13724   auto Style = getGoogleStyle();
13725   Style.BinPackArguments = false;
13726   verifyFormat("SomeFunction(\n"
13727                "    a,\n"
13728                "    [this] {\n"
13729                "      //\n"
13730                "    },\n"
13731                "    b);\n",
13732                Style);
13733   verifyFormat("SomeFunction(\n"
13734                "    a,\n"
13735                "    [this] {\n"
13736                "      //\n"
13737                "    },\n"
13738                "    b);\n");
13739 
13740   // A lambda with a very long line forces arg0 to be pushed out irrespective of
13741   // the BinPackArguments value (as long as the code is wide enough).
13742   verifyFormat(
13743       "something->SomeFunction(\n"
13744       "    a,\n"
13745       "    [this] {\n"
13746       "      "
13747       "D0000000000000000000000000000000000000000000000000000000000001();\n"
13748       "    },\n"
13749       "    b);\n");
13750 
13751   // A multi-line lambda is pulled up as long as the introducer fits on the
13752   // previous line and there are no further args.
13753   verifyFormat("function(1, [this, that] {\n"
13754                "  //\n"
13755                "});\n");
13756   verifyFormat("function([this, that] {\n"
13757                "  //\n"
13758                "});\n");
13759   // FIXME: this format is not ideal and we should consider forcing the first
13760   // arg onto its own line.
13761   verifyFormat("function(a, b, c, //\n"
13762                "         d, [this, that] {\n"
13763                "           //\n"
13764                "         });\n");
13765 
13766   // Multiple lambdas are treated correctly even when there is a short arg0.
13767   verifyFormat("SomeFunction(\n"
13768                "    1,\n"
13769                "    [this] {\n"
13770                "      //\n"
13771                "    },\n"
13772                "    [this] {\n"
13773                "      //\n"
13774                "    },\n"
13775                "    1);\n");
13776 
13777   // More complex introducers.
13778   verifyFormat("return [i, args...] {};");
13779 
13780   // Not lambdas.
13781   verifyFormat("constexpr char hello[]{\"hello\"};");
13782   verifyFormat("double &operator[](int i) { return 0; }\n"
13783                "int i;");
13784   verifyFormat("std::unique_ptr<int[]> foo() {}");
13785   verifyFormat("int i = a[a][a]->f();");
13786   verifyFormat("int i = (*b)[a]->f();");
13787 
13788   // Other corner cases.
13789   verifyFormat("void f() {\n"
13790                "  bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
13791                "  );\n"
13792                "}");
13793 
13794   // Lambdas created through weird macros.
13795   verifyFormat("void f() {\n"
13796                "  MACRO((const AA &a) { return 1; });\n"
13797                "  MACRO((AA &a) { return 1; });\n"
13798                "}");
13799 
13800   verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
13801                "      doo_dah();\n"
13802                "      doo_dah();\n"
13803                "    })) {\n"
13804                "}");
13805   verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
13806                "                doo_dah();\n"
13807                "                doo_dah();\n"
13808                "              })) {\n"
13809                "}");
13810   verifyFormat("if CONSTEXPR (blah_blah(whatever, whatever, [] {\n"
13811                "                doo_dah();\n"
13812                "                doo_dah();\n"
13813                "              })) {\n"
13814                "}");
13815   verifyFormat("auto lambda = []() {\n"
13816                "  int a = 2\n"
13817                "#if A\n"
13818                "          + 2\n"
13819                "#endif\n"
13820                "      ;\n"
13821                "};");
13822 
13823   // Lambdas with complex multiline introducers.
13824   verifyFormat(
13825       "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
13826       "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
13827       "        -> ::std::unordered_set<\n"
13828       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
13829       "      //\n"
13830       "    });");
13831 
13832   FormatStyle DoNotMerge = getLLVMStyle();
13833   DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None;
13834   verifyFormat("auto c = []() {\n"
13835                "  return b;\n"
13836                "};",
13837                "auto c = []() { return b; };", DoNotMerge);
13838   verifyFormat("auto c = []() {\n"
13839                "};",
13840                " auto c = []() {};", DoNotMerge);
13841 
13842   FormatStyle MergeEmptyOnly = getLLVMStyle();
13843   MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty;
13844   verifyFormat("auto c = []() {\n"
13845                "  return b;\n"
13846                "};",
13847                "auto c = []() {\n"
13848                "  return b;\n"
13849                " };",
13850                MergeEmptyOnly);
13851   verifyFormat("auto c = []() {};",
13852                "auto c = []() {\n"
13853                "};",
13854                MergeEmptyOnly);
13855 
13856   FormatStyle MergeInline = getLLVMStyle();
13857   MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline;
13858   verifyFormat("auto c = []() {\n"
13859                "  return b;\n"
13860                "};",
13861                "auto c = []() { return b; };", MergeInline);
13862   verifyFormat("function([]() { return b; })", "function([]() { return b; })",
13863                MergeInline);
13864   verifyFormat("function([]() { return b; }, a)",
13865                "function([]() { return b; }, a)", MergeInline);
13866   verifyFormat("function(a, []() { return b; })",
13867                "function(a, []() { return b; })", MergeInline);
13868 }
13869 
13870 TEST_F(FormatTest, EmptyLinesInLambdas) {
13871   verifyFormat("auto lambda = []() {\n"
13872                "  x(); //\n"
13873                "};",
13874                "auto lambda = []() {\n"
13875                "\n"
13876                "  x(); //\n"
13877                "\n"
13878                "};");
13879 }
13880 
13881 TEST_F(FormatTest, FormatsBlocks) {
13882   FormatStyle ShortBlocks = getLLVMStyle();
13883   ShortBlocks.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always;
13884   verifyFormat("int (^Block)(int, int);", ShortBlocks);
13885   verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
13886   verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
13887   verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
13888   verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
13889   verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
13890 
13891   verifyFormat("foo(^{ bar(); });", ShortBlocks);
13892   verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
13893   verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
13894 
13895   verifyFormat("[operation setCompletionBlock:^{\n"
13896                "  [self onOperationDone];\n"
13897                "}];");
13898   verifyFormat("int i = {[operation setCompletionBlock:^{\n"
13899                "  [self onOperationDone];\n"
13900                "}]};");
13901   verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
13902                "  f();\n"
13903                "}];");
13904   verifyFormat("int a = [operation block:^int(int *i) {\n"
13905                "  return 1;\n"
13906                "}];");
13907   verifyFormat("[myObject doSomethingWith:arg1\n"
13908                "                      aaa:^int(int *a) {\n"
13909                "                        return 1;\n"
13910                "                      }\n"
13911                "                      bbb:f(a * bbbbbbbb)];");
13912 
13913   verifyFormat("[operation setCompletionBlock:^{\n"
13914                "  [self.delegate newDataAvailable];\n"
13915                "}];",
13916                getLLVMStyleWithColumns(60));
13917   verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
13918                "  NSString *path = [self sessionFilePath];\n"
13919                "  if (path) {\n"
13920                "    // ...\n"
13921                "  }\n"
13922                "});");
13923   verifyFormat("[[SessionService sharedService]\n"
13924                "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
13925                "      if (window) {\n"
13926                "        [self windowDidLoad:window];\n"
13927                "      } else {\n"
13928                "        [self errorLoadingWindow];\n"
13929                "      }\n"
13930                "    }];");
13931   verifyFormat("void (^largeBlock)(void) = ^{\n"
13932                "  // ...\n"
13933                "};\n",
13934                getLLVMStyleWithColumns(40));
13935   verifyFormat("[[SessionService sharedService]\n"
13936                "    loadWindowWithCompletionBlock: //\n"
13937                "        ^(SessionWindow *window) {\n"
13938                "          if (window) {\n"
13939                "            [self windowDidLoad:window];\n"
13940                "          } else {\n"
13941                "            [self errorLoadingWindow];\n"
13942                "          }\n"
13943                "        }];",
13944                getLLVMStyleWithColumns(60));
13945   verifyFormat("[myObject doSomethingWith:arg1\n"
13946                "    firstBlock:^(Foo *a) {\n"
13947                "      // ...\n"
13948                "      int i;\n"
13949                "    }\n"
13950                "    secondBlock:^(Bar *b) {\n"
13951                "      // ...\n"
13952                "      int i;\n"
13953                "    }\n"
13954                "    thirdBlock:^Foo(Bar *b) {\n"
13955                "      // ...\n"
13956                "      int i;\n"
13957                "    }];");
13958   verifyFormat("[myObject doSomethingWith:arg1\n"
13959                "               firstBlock:-1\n"
13960                "              secondBlock:^(Bar *b) {\n"
13961                "                // ...\n"
13962                "                int i;\n"
13963                "              }];");
13964 
13965   verifyFormat("f(^{\n"
13966                "  @autoreleasepool {\n"
13967                "    if (a) {\n"
13968                "      g();\n"
13969                "    }\n"
13970                "  }\n"
13971                "});");
13972   verifyFormat("Block b = ^int *(A *a, B *b) {}");
13973   verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
13974                "};");
13975 
13976   FormatStyle FourIndent = getLLVMStyle();
13977   FourIndent.ObjCBlockIndentWidth = 4;
13978   verifyFormat("[operation setCompletionBlock:^{\n"
13979                "    [self onOperationDone];\n"
13980                "}];",
13981                FourIndent);
13982 }
13983 
13984 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
13985   FormatStyle ZeroColumn = getLLVMStyle();
13986   ZeroColumn.ColumnLimit = 0;
13987 
13988   verifyFormat("[[SessionService sharedService] "
13989                "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
13990                "  if (window) {\n"
13991                "    [self windowDidLoad:window];\n"
13992                "  } else {\n"
13993                "    [self errorLoadingWindow];\n"
13994                "  }\n"
13995                "}];",
13996                ZeroColumn);
13997   EXPECT_EQ("[[SessionService sharedService]\n"
13998             "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
13999             "      if (window) {\n"
14000             "        [self windowDidLoad:window];\n"
14001             "      } else {\n"
14002             "        [self errorLoadingWindow];\n"
14003             "      }\n"
14004             "    }];",
14005             format("[[SessionService sharedService]\n"
14006                    "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
14007                    "                if (window) {\n"
14008                    "    [self windowDidLoad:window];\n"
14009                    "  } else {\n"
14010                    "    [self errorLoadingWindow];\n"
14011                    "  }\n"
14012                    "}];",
14013                    ZeroColumn));
14014   verifyFormat("[myObject doSomethingWith:arg1\n"
14015                "    firstBlock:^(Foo *a) {\n"
14016                "      // ...\n"
14017                "      int i;\n"
14018                "    }\n"
14019                "    secondBlock:^(Bar *b) {\n"
14020                "      // ...\n"
14021                "      int i;\n"
14022                "    }\n"
14023                "    thirdBlock:^Foo(Bar *b) {\n"
14024                "      // ...\n"
14025                "      int i;\n"
14026                "    }];",
14027                ZeroColumn);
14028   verifyFormat("f(^{\n"
14029                "  @autoreleasepool {\n"
14030                "    if (a) {\n"
14031                "      g();\n"
14032                "    }\n"
14033                "  }\n"
14034                "});",
14035                ZeroColumn);
14036   verifyFormat("void (^largeBlock)(void) = ^{\n"
14037                "  // ...\n"
14038                "};",
14039                ZeroColumn);
14040 
14041   ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always;
14042   EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
14043             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
14044   ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never;
14045   EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
14046             "  int i;\n"
14047             "};",
14048             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
14049 }
14050 
14051 TEST_F(FormatTest, SupportsCRLF) {
14052   EXPECT_EQ("int a;\r\n"
14053             "int b;\r\n"
14054             "int c;\r\n",
14055             format("int a;\r\n"
14056                    "  int b;\r\n"
14057                    "    int c;\r\n",
14058                    getLLVMStyle()));
14059   EXPECT_EQ("int a;\r\n"
14060             "int b;\r\n"
14061             "int c;\r\n",
14062             format("int a;\r\n"
14063                    "  int b;\n"
14064                    "    int c;\r\n",
14065                    getLLVMStyle()));
14066   EXPECT_EQ("int a;\n"
14067             "int b;\n"
14068             "int c;\n",
14069             format("int a;\r\n"
14070                    "  int b;\n"
14071                    "    int c;\n",
14072                    getLLVMStyle()));
14073   EXPECT_EQ("\"aaaaaaa \"\r\n"
14074             "\"bbbbbbb\";\r\n",
14075             format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
14076   EXPECT_EQ("#define A \\\r\n"
14077             "  b;      \\\r\n"
14078             "  c;      \\\r\n"
14079             "  d;\r\n",
14080             format("#define A \\\r\n"
14081                    "  b; \\\r\n"
14082                    "  c; d; \r\n",
14083                    getGoogleStyle()));
14084 
14085   EXPECT_EQ("/*\r\n"
14086             "multi line block comments\r\n"
14087             "should not introduce\r\n"
14088             "an extra carriage return\r\n"
14089             "*/\r\n",
14090             format("/*\r\n"
14091                    "multi line block comments\r\n"
14092                    "should not introduce\r\n"
14093                    "an extra carriage return\r\n"
14094                    "*/\r\n"));
14095   EXPECT_EQ("/*\r\n"
14096             "\r\n"
14097             "*/",
14098             format("/*\r\n"
14099                    "    \r\r\r\n"
14100                    "*/"));
14101 
14102   FormatStyle style = getLLVMStyle();
14103 
14104   style.DeriveLineEnding = true;
14105   style.UseCRLF = false;
14106   EXPECT_EQ("union FooBarBazQux {\n"
14107             "  int foo;\n"
14108             "  int bar;\n"
14109             "  int baz;\n"
14110             "};",
14111             format("union FooBarBazQux {\r\n"
14112                    "  int foo;\n"
14113                    "  int bar;\r\n"
14114                    "  int baz;\n"
14115                    "};",
14116                    style));
14117   style.UseCRLF = true;
14118   EXPECT_EQ("union FooBarBazQux {\r\n"
14119             "  int foo;\r\n"
14120             "  int bar;\r\n"
14121             "  int baz;\r\n"
14122             "};",
14123             format("union FooBarBazQux {\r\n"
14124                    "  int foo;\n"
14125                    "  int bar;\r\n"
14126                    "  int baz;\n"
14127                    "};",
14128                    style));
14129 
14130   style.DeriveLineEnding = false;
14131   style.UseCRLF = false;
14132   EXPECT_EQ("union FooBarBazQux {\n"
14133             "  int foo;\n"
14134             "  int bar;\n"
14135             "  int baz;\n"
14136             "  int qux;\n"
14137             "};",
14138             format("union FooBarBazQux {\r\n"
14139                    "  int foo;\n"
14140                    "  int bar;\r\n"
14141                    "  int baz;\n"
14142                    "  int qux;\r\n"
14143                    "};",
14144                    style));
14145   style.UseCRLF = true;
14146   EXPECT_EQ("union FooBarBazQux {\r\n"
14147             "  int foo;\r\n"
14148             "  int bar;\r\n"
14149             "  int baz;\r\n"
14150             "  int qux;\r\n"
14151             "};",
14152             format("union FooBarBazQux {\r\n"
14153                    "  int foo;\n"
14154                    "  int bar;\r\n"
14155                    "  int baz;\n"
14156                    "  int qux;\n"
14157                    "};",
14158                    style));
14159 
14160   style.DeriveLineEnding = true;
14161   style.UseCRLF = false;
14162   EXPECT_EQ("union FooBarBazQux {\r\n"
14163             "  int foo;\r\n"
14164             "  int bar;\r\n"
14165             "  int baz;\r\n"
14166             "  int qux;\r\n"
14167             "};",
14168             format("union FooBarBazQux {\r\n"
14169                    "  int foo;\n"
14170                    "  int bar;\r\n"
14171                    "  int baz;\n"
14172                    "  int qux;\r\n"
14173                    "};",
14174                    style));
14175   style.UseCRLF = true;
14176   EXPECT_EQ("union FooBarBazQux {\n"
14177             "  int foo;\n"
14178             "  int bar;\n"
14179             "  int baz;\n"
14180             "  int qux;\n"
14181             "};",
14182             format("union FooBarBazQux {\r\n"
14183                    "  int foo;\n"
14184                    "  int bar;\r\n"
14185                    "  int baz;\n"
14186                    "  int qux;\n"
14187                    "};",
14188                    style));
14189 }
14190 
14191 TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
14192   verifyFormat("MY_CLASS(C) {\n"
14193                "  int i;\n"
14194                "  int j;\n"
14195                "};");
14196 }
14197 
14198 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
14199   FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
14200   TwoIndent.ContinuationIndentWidth = 2;
14201 
14202   EXPECT_EQ("int i =\n"
14203             "  longFunction(\n"
14204             "    arg);",
14205             format("int i = longFunction(arg);", TwoIndent));
14206 
14207   FormatStyle SixIndent = getLLVMStyleWithColumns(20);
14208   SixIndent.ContinuationIndentWidth = 6;
14209 
14210   EXPECT_EQ("int i =\n"
14211             "      longFunction(\n"
14212             "            arg);",
14213             format("int i = longFunction(arg);", SixIndent));
14214 }
14215 
14216 TEST_F(FormatTest, WrappedClosingParenthesisIndent) {
14217   FormatStyle Style = getLLVMStyle();
14218   verifyFormat("int Foo::getter(\n"
14219                "    //\n"
14220                ") const {\n"
14221                "  return foo;\n"
14222                "}",
14223                Style);
14224   verifyFormat("void Foo::setter(\n"
14225                "    //\n"
14226                ") {\n"
14227                "  foo = 1;\n"
14228                "}",
14229                Style);
14230 }
14231 
14232 TEST_F(FormatTest, SpacesInAngles) {
14233   FormatStyle Spaces = getLLVMStyle();
14234   Spaces.SpacesInAngles = true;
14235 
14236   verifyFormat("static_cast< int >(arg);", Spaces);
14237   verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
14238   verifyFormat("f< int, float >();", Spaces);
14239   verifyFormat("template <> g() {}", Spaces);
14240   verifyFormat("template < std::vector< int > > f() {}", Spaces);
14241   verifyFormat("std::function< void(int, int) > fct;", Spaces);
14242   verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
14243                Spaces);
14244 
14245   Spaces.Standard = FormatStyle::LS_Cpp03;
14246   Spaces.SpacesInAngles = true;
14247   verifyFormat("A< A< int > >();", Spaces);
14248 
14249   Spaces.SpacesInAngles = false;
14250   verifyFormat("A<A<int> >();", Spaces);
14251 
14252   Spaces.Standard = FormatStyle::LS_Cpp11;
14253   Spaces.SpacesInAngles = true;
14254   verifyFormat("A< A< int > >();", Spaces);
14255 
14256   Spaces.SpacesInAngles = false;
14257   verifyFormat("A<A<int>>();", Spaces);
14258 }
14259 
14260 TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
14261   FormatStyle Style = getLLVMStyle();
14262   Style.SpaceAfterTemplateKeyword = false;
14263   verifyFormat("template<int> void foo();", Style);
14264 }
14265 
14266 TEST_F(FormatTest, TripleAngleBrackets) {
14267   verifyFormat("f<<<1, 1>>>();");
14268   verifyFormat("f<<<1, 1, 1, s>>>();");
14269   verifyFormat("f<<<a, b, c, d>>>();");
14270   EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
14271   verifyFormat("f<param><<<1, 1>>>();");
14272   verifyFormat("f<1><<<1, 1>>>();");
14273   EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
14274   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
14275                "aaaaaaaaaaa<<<\n    1, 1>>>();");
14276   verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
14277                "    <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
14278 }
14279 
14280 TEST_F(FormatTest, MergeLessLessAtEnd) {
14281   verifyFormat("<<");
14282   EXPECT_EQ("< < <", format("\\\n<<<"));
14283   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
14284                "aaallvm::outs() <<");
14285   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
14286                "aaaallvm::outs()\n    <<");
14287 }
14288 
14289 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
14290   std::string code = "#if A\n"
14291                      "#if B\n"
14292                      "a.\n"
14293                      "#endif\n"
14294                      "    a = 1;\n"
14295                      "#else\n"
14296                      "#endif\n"
14297                      "#if C\n"
14298                      "#else\n"
14299                      "#endif\n";
14300   EXPECT_EQ(code, format(code));
14301 }
14302 
14303 TEST_F(FormatTest, HandleConflictMarkers) {
14304   // Git/SVN conflict markers.
14305   EXPECT_EQ("int a;\n"
14306             "void f() {\n"
14307             "  callme(some(parameter1,\n"
14308             "<<<<<<< text by the vcs\n"
14309             "              parameter2),\n"
14310             "||||||| text by the vcs\n"
14311             "              parameter2),\n"
14312             "         parameter3,\n"
14313             "======= text by the vcs\n"
14314             "              parameter2, parameter3),\n"
14315             ">>>>>>> text by the vcs\n"
14316             "         otherparameter);\n",
14317             format("int a;\n"
14318                    "void f() {\n"
14319                    "  callme(some(parameter1,\n"
14320                    "<<<<<<< text by the vcs\n"
14321                    "  parameter2),\n"
14322                    "||||||| text by the vcs\n"
14323                    "  parameter2),\n"
14324                    "  parameter3,\n"
14325                    "======= text by the vcs\n"
14326                    "  parameter2,\n"
14327                    "  parameter3),\n"
14328                    ">>>>>>> text by the vcs\n"
14329                    "  otherparameter);\n"));
14330 
14331   // Perforce markers.
14332   EXPECT_EQ("void f() {\n"
14333             "  function(\n"
14334             ">>>> text by the vcs\n"
14335             "      parameter,\n"
14336             "==== text by the vcs\n"
14337             "      parameter,\n"
14338             "==== text by the vcs\n"
14339             "      parameter,\n"
14340             "<<<< text by the vcs\n"
14341             "      parameter);\n",
14342             format("void f() {\n"
14343                    "  function(\n"
14344                    ">>>> text by the vcs\n"
14345                    "  parameter,\n"
14346                    "==== text by the vcs\n"
14347                    "  parameter,\n"
14348                    "==== text by the vcs\n"
14349                    "  parameter,\n"
14350                    "<<<< text by the vcs\n"
14351                    "  parameter);\n"));
14352 
14353   EXPECT_EQ("<<<<<<<\n"
14354             "|||||||\n"
14355             "=======\n"
14356             ">>>>>>>",
14357             format("<<<<<<<\n"
14358                    "|||||||\n"
14359                    "=======\n"
14360                    ">>>>>>>"));
14361 
14362   EXPECT_EQ("<<<<<<<\n"
14363             "|||||||\n"
14364             "int i;\n"
14365             "=======\n"
14366             ">>>>>>>",
14367             format("<<<<<<<\n"
14368                    "|||||||\n"
14369                    "int i;\n"
14370                    "=======\n"
14371                    ">>>>>>>"));
14372 
14373   // FIXME: Handle parsing of macros around conflict markers correctly:
14374   EXPECT_EQ("#define Macro \\\n"
14375             "<<<<<<<\n"
14376             "Something \\\n"
14377             "|||||||\n"
14378             "Else \\\n"
14379             "=======\n"
14380             "Other \\\n"
14381             ">>>>>>>\n"
14382             "    End int i;\n",
14383             format("#define Macro \\\n"
14384                    "<<<<<<<\n"
14385                    "  Something \\\n"
14386                    "|||||||\n"
14387                    "  Else \\\n"
14388                    "=======\n"
14389                    "  Other \\\n"
14390                    ">>>>>>>\n"
14391                    "  End\n"
14392                    "int i;\n"));
14393 }
14394 
14395 TEST_F(FormatTest, DisableRegions) {
14396   EXPECT_EQ("int i;\n"
14397             "// clang-format off\n"
14398             "  int j;\n"
14399             "// clang-format on\n"
14400             "int k;",
14401             format(" int  i;\n"
14402                    "   // clang-format off\n"
14403                    "  int j;\n"
14404                    " // clang-format on\n"
14405                    "   int   k;"));
14406   EXPECT_EQ("int i;\n"
14407             "/* clang-format off */\n"
14408             "  int j;\n"
14409             "/* clang-format on */\n"
14410             "int k;",
14411             format(" int  i;\n"
14412                    "   /* clang-format off */\n"
14413                    "  int j;\n"
14414                    " /* clang-format on */\n"
14415                    "   int   k;"));
14416 
14417   // Don't reflow comments within disabled regions.
14418   EXPECT_EQ("// clang-format off\n"
14419             "// long long long long long long line\n"
14420             "/* clang-format on */\n"
14421             "/* long long long\n"
14422             " * long long long\n"
14423             " * line */\n"
14424             "int i;\n"
14425             "/* clang-format off */\n"
14426             "/* long long long long long long line */\n",
14427             format("// clang-format off\n"
14428                    "// long long long long long long line\n"
14429                    "/* clang-format on */\n"
14430                    "/* long long long long long long line */\n"
14431                    "int i;\n"
14432                    "/* clang-format off */\n"
14433                    "/* long long long long long long line */\n",
14434                    getLLVMStyleWithColumns(20)));
14435 }
14436 
14437 TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
14438   format("? ) =");
14439   verifyNoCrash("#define a\\\n /**/}");
14440 }
14441 
14442 TEST_F(FormatTest, FormatsTableGenCode) {
14443   FormatStyle Style = getLLVMStyle();
14444   Style.Language = FormatStyle::LK_TableGen;
14445   verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
14446 }
14447 
14448 TEST_F(FormatTest, ArrayOfTemplates) {
14449   EXPECT_EQ("auto a = new unique_ptr<int>[10];",
14450             format("auto a = new unique_ptr<int > [ 10];"));
14451 
14452   FormatStyle Spaces = getLLVMStyle();
14453   Spaces.SpacesInSquareBrackets = true;
14454   EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
14455             format("auto a = new unique_ptr<int > [10];", Spaces));
14456 }
14457 
14458 TEST_F(FormatTest, ArrayAsTemplateType) {
14459   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
14460             format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
14461 
14462   FormatStyle Spaces = getLLVMStyle();
14463   Spaces.SpacesInSquareBrackets = true;
14464   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
14465             format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
14466 }
14467 
14468 TEST_F(FormatTest, NoSpaceAfterSuper) { verifyFormat("__super::FooBar();"); }
14469 
14470 TEST(FormatStyle, GetStyleWithEmptyFileName) {
14471   llvm::vfs::InMemoryFileSystem FS;
14472   auto Style1 = getStyle("file", "", "Google", "", &FS);
14473   ASSERT_TRUE((bool)Style1);
14474   ASSERT_EQ(*Style1, getGoogleStyle());
14475 }
14476 
14477 TEST(FormatStyle, GetStyleOfFile) {
14478   llvm::vfs::InMemoryFileSystem FS;
14479   // Test 1: format file in the same directory.
14480   ASSERT_TRUE(
14481       FS.addFile("/a/.clang-format", 0,
14482                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
14483   ASSERT_TRUE(
14484       FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
14485   auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
14486   ASSERT_TRUE((bool)Style1);
14487   ASSERT_EQ(*Style1, getLLVMStyle());
14488 
14489   // Test 2.1: fallback to default.
14490   ASSERT_TRUE(
14491       FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
14492   auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
14493   ASSERT_TRUE((bool)Style2);
14494   ASSERT_EQ(*Style2, getMozillaStyle());
14495 
14496   // Test 2.2: no format on 'none' fallback style.
14497   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
14498   ASSERT_TRUE((bool)Style2);
14499   ASSERT_EQ(*Style2, getNoStyle());
14500 
14501   // Test 2.3: format if config is found with no based style while fallback is
14502   // 'none'.
14503   ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
14504                          llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
14505   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
14506   ASSERT_TRUE((bool)Style2);
14507   ASSERT_EQ(*Style2, getLLVMStyle());
14508 
14509   // Test 2.4: format if yaml with no based style, while fallback is 'none'.
14510   Style2 = getStyle("{}", "a.h", "none", "", &FS);
14511   ASSERT_TRUE((bool)Style2);
14512   ASSERT_EQ(*Style2, getLLVMStyle());
14513 
14514   // Test 3: format file in parent directory.
14515   ASSERT_TRUE(
14516       FS.addFile("/c/.clang-format", 0,
14517                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
14518   ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
14519                          llvm::MemoryBuffer::getMemBuffer("int i;")));
14520   auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
14521   ASSERT_TRUE((bool)Style3);
14522   ASSERT_EQ(*Style3, getGoogleStyle());
14523 
14524   // Test 4: error on invalid fallback style
14525   auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
14526   ASSERT_FALSE((bool)Style4);
14527   llvm::consumeError(Style4.takeError());
14528 
14529   // Test 5: error on invalid yaml on command line
14530   auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
14531   ASSERT_FALSE((bool)Style5);
14532   llvm::consumeError(Style5.takeError());
14533 
14534   // Test 6: error on invalid style
14535   auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
14536   ASSERT_FALSE((bool)Style6);
14537   llvm::consumeError(Style6.takeError());
14538 
14539   // Test 7: found config file, error on parsing it
14540   ASSERT_TRUE(
14541       FS.addFile("/d/.clang-format", 0,
14542                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
14543                                                   "InvalidKey: InvalidValue")));
14544   ASSERT_TRUE(
14545       FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
14546   auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
14547   ASSERT_FALSE((bool)Style7);
14548   llvm::consumeError(Style7.takeError());
14549 
14550   // Test 8: inferred per-language defaults apply.
14551   auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS);
14552   ASSERT_TRUE((bool)StyleTd);
14553   ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen));
14554 }
14555 
14556 TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
14557   // Column limit is 20.
14558   std::string Code = "Type *a =\n"
14559                      "    new Type();\n"
14560                      "g(iiiii, 0, jjjjj,\n"
14561                      "  0, kkkkk, 0, mm);\n"
14562                      "int  bad     = format   ;";
14563   std::string Expected = "auto a = new Type();\n"
14564                          "g(iiiii, nullptr,\n"
14565                          "  jjjjj, nullptr,\n"
14566                          "  kkkkk, nullptr,\n"
14567                          "  mm);\n"
14568                          "int  bad     = format   ;";
14569   FileID ID = Context.createInMemoryFile("format.cpp", Code);
14570   tooling::Replacements Replaces = toReplacements(
14571       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
14572                             "auto "),
14573        tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
14574                             "nullptr"),
14575        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
14576                             "nullptr"),
14577        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
14578                             "nullptr")});
14579 
14580   format::FormatStyle Style = format::getLLVMStyle();
14581   Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
14582   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
14583   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
14584       << llvm::toString(FormattedReplaces.takeError()) << "\n";
14585   auto Result = applyAllReplacements(Code, *FormattedReplaces);
14586   EXPECT_TRUE(static_cast<bool>(Result));
14587   EXPECT_EQ(Expected, *Result);
14588 }
14589 
14590 TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
14591   std::string Code = "#include \"a.h\"\n"
14592                      "#include \"c.h\"\n"
14593                      "\n"
14594                      "int main() {\n"
14595                      "  return 0;\n"
14596                      "}";
14597   std::string Expected = "#include \"a.h\"\n"
14598                          "#include \"b.h\"\n"
14599                          "#include \"c.h\"\n"
14600                          "\n"
14601                          "int main() {\n"
14602                          "  return 0;\n"
14603                          "}";
14604   FileID ID = Context.createInMemoryFile("fix.cpp", Code);
14605   tooling::Replacements Replaces = toReplacements(
14606       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
14607                             "#include \"b.h\"\n")});
14608 
14609   format::FormatStyle Style = format::getLLVMStyle();
14610   Style.SortIncludes = true;
14611   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
14612   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
14613       << llvm::toString(FormattedReplaces.takeError()) << "\n";
14614   auto Result = applyAllReplacements(Code, *FormattedReplaces);
14615   EXPECT_TRUE(static_cast<bool>(Result));
14616   EXPECT_EQ(Expected, *Result);
14617 }
14618 
14619 TEST_F(FormatTest, FormatSortsUsingDeclarations) {
14620   EXPECT_EQ("using std::cin;\n"
14621             "using std::cout;",
14622             format("using std::cout;\n"
14623                    "using std::cin;",
14624                    getGoogleStyle()));
14625 }
14626 
14627 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
14628   format::FormatStyle Style = format::getLLVMStyle();
14629   Style.Standard = FormatStyle::LS_Cpp03;
14630   // cpp03 recognize this string as identifier u8 and literal character 'a'
14631   EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
14632 }
14633 
14634 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
14635   // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
14636   // all modes, including C++11, C++14 and C++17
14637   EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
14638 }
14639 
14640 TEST_F(FormatTest, DoNotFormatLikelyXml) {
14641   EXPECT_EQ("<!-- ;> -->", format("<!-- ;> -->", getGoogleStyle()));
14642   EXPECT_EQ(" <!-- >; -->", format(" <!-- >; -->", getGoogleStyle()));
14643 }
14644 
14645 TEST_F(FormatTest, StructuredBindings) {
14646   // Structured bindings is a C++17 feature.
14647   // all modes, including C++11, C++14 and C++17
14648   verifyFormat("auto [a, b] = f();");
14649   EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
14650   EXPECT_EQ("const auto [a, b] = f();", format("const   auto[a, b] = f();"));
14651   EXPECT_EQ("auto const [a, b] = f();", format("auto  const[a, b] = f();"));
14652   EXPECT_EQ("auto const volatile [a, b] = f();",
14653             format("auto  const   volatile[a, b] = f();"));
14654   EXPECT_EQ("auto [a, b, c] = f();", format("auto   [  a  ,  b,c   ] = f();"));
14655   EXPECT_EQ("auto &[a, b, c] = f();",
14656             format("auto   &[  a  ,  b,c   ] = f();"));
14657   EXPECT_EQ("auto &&[a, b, c] = f();",
14658             format("auto   &&[  a  ,  b,c   ] = f();"));
14659   EXPECT_EQ("auto const &[a, b] = f();", format("auto  const&[a, b] = f();"));
14660   EXPECT_EQ("auto const volatile &&[a, b] = f();",
14661             format("auto  const  volatile  &&[a, b] = f();"));
14662   EXPECT_EQ("auto const &&[a, b] = f();",
14663             format("auto  const   &&  [a, b] = f();"));
14664   EXPECT_EQ("const auto &[a, b] = f();",
14665             format("const  auto  &  [a, b] = f();"));
14666   EXPECT_EQ("const auto volatile &&[a, b] = f();",
14667             format("const  auto   volatile  &&[a, b] = f();"));
14668   EXPECT_EQ("volatile const auto &&[a, b] = f();",
14669             format("volatile  const  auto   &&[a, b] = f();"));
14670   EXPECT_EQ("const auto &&[a, b] = f();",
14671             format("const  auto  &&  [a, b] = f();"));
14672 
14673   // Make sure we don't mistake structured bindings for lambdas.
14674   FormatStyle PointerMiddle = getLLVMStyle();
14675   PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
14676   verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
14677   verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
14678   verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
14679   verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
14680   verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
14681   verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
14682   verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
14683   verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
14684   verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
14685   verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
14686   verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
14687   verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
14688 
14689   EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
14690             format("for (const auto   &&   [a, b] : some_range) {\n}"));
14691   EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
14692             format("for (const auto   &   [a, b] : some_range) {\n}"));
14693   EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
14694             format("for (const auto[a, b] : some_range) {\n}"));
14695   EXPECT_EQ("auto [x, y](expr);", format("auto[x,y]  (expr);"));
14696   EXPECT_EQ("auto &[x, y](expr);", format("auto  &  [x,y]  (expr);"));
14697   EXPECT_EQ("auto &&[x, y](expr);", format("auto  &&  [x,y]  (expr);"));
14698   EXPECT_EQ("auto const &[x, y](expr);",
14699             format("auto  const  &  [x,y]  (expr);"));
14700   EXPECT_EQ("auto const &&[x, y](expr);",
14701             format("auto  const  &&  [x,y]  (expr);"));
14702   EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y]     {expr};"));
14703   EXPECT_EQ("auto const &[x, y]{expr};",
14704             format("auto  const  &  [x,y]  {expr};"));
14705   EXPECT_EQ("auto const &&[x, y]{expr};",
14706             format("auto  const  &&  [x,y]  {expr};"));
14707 
14708   format::FormatStyle Spaces = format::getLLVMStyle();
14709   Spaces.SpacesInSquareBrackets = true;
14710   verifyFormat("auto [ a, b ] = f();", Spaces);
14711   verifyFormat("auto &&[ a, b ] = f();", Spaces);
14712   verifyFormat("auto &[ a, b ] = f();", Spaces);
14713   verifyFormat("auto const &&[ a, b ] = f();", Spaces);
14714   verifyFormat("auto const &[ a, b ] = f();", Spaces);
14715 }
14716 
14717 TEST_F(FormatTest, FileAndCode) {
14718   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", ""));
14719   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", ""));
14720   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", ""));
14721   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", ""));
14722   EXPECT_EQ(FormatStyle::LK_ObjC,
14723             guessLanguage("foo.h", "@interface Foo\n@end\n"));
14724   EXPECT_EQ(
14725       FormatStyle::LK_ObjC,
14726       guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }"));
14727   EXPECT_EQ(FormatStyle::LK_ObjC,
14728             guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))"));
14729   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;"));
14730   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", ""));
14731   EXPECT_EQ(FormatStyle::LK_ObjC,
14732             guessLanguage("foo", "@interface Foo\n@end\n"));
14733   EXPECT_EQ(FormatStyle::LK_ObjC,
14734             guessLanguage("foo.h", "int DoStuff(CGRect rect);\n"));
14735   EXPECT_EQ(
14736       FormatStyle::LK_ObjC,
14737       guessLanguage("foo.h",
14738                     "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n"));
14739   EXPECT_EQ(
14740       FormatStyle::LK_Cpp,
14741       guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;"));
14742 }
14743 
14744 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) {
14745   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];"));
14746   EXPECT_EQ(FormatStyle::LK_ObjC,
14747             guessLanguage("foo.h", "array[[calculator getIndex]];"));
14748   EXPECT_EQ(FormatStyle::LK_Cpp,
14749             guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];"));
14750   EXPECT_EQ(
14751       FormatStyle::LK_Cpp,
14752       guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];"));
14753   EXPECT_EQ(FormatStyle::LK_ObjC,
14754             guessLanguage("foo.h", "[[noreturn foo] bar];"));
14755   EXPECT_EQ(FormatStyle::LK_Cpp,
14756             guessLanguage("foo.h", "[[clang::fallthrough]];"));
14757   EXPECT_EQ(FormatStyle::LK_ObjC,
14758             guessLanguage("foo.h", "[[clang:fallthrough] foo];"));
14759   EXPECT_EQ(FormatStyle::LK_Cpp,
14760             guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];"));
14761   EXPECT_EQ(FormatStyle::LK_Cpp,
14762             guessLanguage("foo.h", "[[using clang: fallthrough]];"));
14763   EXPECT_EQ(FormatStyle::LK_ObjC,
14764             guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];"));
14765   EXPECT_EQ(FormatStyle::LK_Cpp,
14766             guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];"));
14767   EXPECT_EQ(
14768       FormatStyle::LK_Cpp,
14769       guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)"));
14770   EXPECT_EQ(
14771       FormatStyle::LK_Cpp,
14772       guessLanguage("foo.h",
14773                     "[[clang::callable_when(\"unconsumed\", \"unknown\")]]"));
14774   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]"));
14775 }
14776 
14777 TEST_F(FormatTest, GuessLanguageWithCaret) {
14778   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);"));
14779   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);"));
14780   EXPECT_EQ(FormatStyle::LK_ObjC,
14781             guessLanguage("foo.h", "int(^)(char, float);"));
14782   EXPECT_EQ(FormatStyle::LK_ObjC,
14783             guessLanguage("foo.h", "int(^foo)(char, float);"));
14784   EXPECT_EQ(FormatStyle::LK_ObjC,
14785             guessLanguage("foo.h", "int(^foo[10])(char, float);"));
14786   EXPECT_EQ(FormatStyle::LK_ObjC,
14787             guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);"));
14788   EXPECT_EQ(
14789       FormatStyle::LK_ObjC,
14790       guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);"));
14791 }
14792 
14793 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) {
14794   EXPECT_EQ(FormatStyle::LK_Cpp,
14795             guessLanguage("foo.h", "void f() {\n"
14796                                    "  asm (\"mov %[e], %[d]\"\n"
14797                                    "     : [d] \"=rm\" (d)\n"
14798                                    "       [e] \"rm\" (*e));\n"
14799                                    "}"));
14800   EXPECT_EQ(FormatStyle::LK_Cpp,
14801             guessLanguage("foo.h", "void f() {\n"
14802                                    "  _asm (\"mov %[e], %[d]\"\n"
14803                                    "     : [d] \"=rm\" (d)\n"
14804                                    "       [e] \"rm\" (*e));\n"
14805                                    "}"));
14806   EXPECT_EQ(FormatStyle::LK_Cpp,
14807             guessLanguage("foo.h", "void f() {\n"
14808                                    "  __asm (\"mov %[e], %[d]\"\n"
14809                                    "     : [d] \"=rm\" (d)\n"
14810                                    "       [e] \"rm\" (*e));\n"
14811                                    "}"));
14812   EXPECT_EQ(FormatStyle::LK_Cpp,
14813             guessLanguage("foo.h", "void f() {\n"
14814                                    "  __asm__ (\"mov %[e], %[d]\"\n"
14815                                    "     : [d] \"=rm\" (d)\n"
14816                                    "       [e] \"rm\" (*e));\n"
14817                                    "}"));
14818   EXPECT_EQ(FormatStyle::LK_Cpp,
14819             guessLanguage("foo.h", "void f() {\n"
14820                                    "  asm (\"mov %[e], %[d]\"\n"
14821                                    "     : [d] \"=rm\" (d),\n"
14822                                    "       [e] \"rm\" (*e));\n"
14823                                    "}"));
14824   EXPECT_EQ(FormatStyle::LK_Cpp,
14825             guessLanguage("foo.h", "void f() {\n"
14826                                    "  asm volatile (\"mov %[e], %[d]\"\n"
14827                                    "     : [d] \"=rm\" (d)\n"
14828                                    "       [e] \"rm\" (*e));\n"
14829                                    "}"));
14830 }
14831 
14832 TEST_F(FormatTest, GuessLanguageWithChildLines) {
14833   EXPECT_EQ(FormatStyle::LK_Cpp,
14834             guessLanguage("foo.h", "#define FOO ({ std::string s; })"));
14835   EXPECT_EQ(FormatStyle::LK_ObjC,
14836             guessLanguage("foo.h", "#define FOO ({ NSString *s; })"));
14837   EXPECT_EQ(
14838       FormatStyle::LK_Cpp,
14839       guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })"));
14840   EXPECT_EQ(
14841       FormatStyle::LK_ObjC,
14842       guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })"));
14843 }
14844 
14845 TEST_F(FormatTest, TypenameMacros) {
14846   std::vector<std::string> TypenameMacros = {"STACK_OF", "LIST", "TAILQ_ENTRY"};
14847 
14848   // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=30353
14849   FormatStyle Google = getGoogleStyleWithColumns(0);
14850   Google.TypenameMacros = TypenameMacros;
14851   verifyFormat("struct foo {\n"
14852                "  int bar;\n"
14853                "  TAILQ_ENTRY(a) bleh;\n"
14854                "};",
14855                Google);
14856 
14857   FormatStyle Macros = getLLVMStyle();
14858   Macros.TypenameMacros = TypenameMacros;
14859 
14860   verifyFormat("STACK_OF(int) a;", Macros);
14861   verifyFormat("STACK_OF(int) *a;", Macros);
14862   verifyFormat("STACK_OF(int const *) *a;", Macros);
14863   verifyFormat("STACK_OF(int *const) *a;", Macros);
14864   verifyFormat("STACK_OF(int, string) a;", Macros);
14865   verifyFormat("STACK_OF(LIST(int)) a;", Macros);
14866   verifyFormat("STACK_OF(LIST(int)) a, b;", Macros);
14867   verifyFormat("for (LIST(int) *a = NULL; a;) {\n}", Macros);
14868   verifyFormat("STACK_OF(int) f(LIST(int) *arg);", Macros);
14869 
14870   Macros.PointerAlignment = FormatStyle::PAS_Left;
14871   verifyFormat("STACK_OF(int)* a;", Macros);
14872   verifyFormat("STACK_OF(int*)* a;", Macros);
14873 }
14874 
14875 TEST_F(FormatTest, AmbersandInLamda) {
14876   // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=41899
14877   FormatStyle AlignStyle = getLLVMStyle();
14878   AlignStyle.PointerAlignment = FormatStyle::PAS_Left;
14879   verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle);
14880   AlignStyle.PointerAlignment = FormatStyle::PAS_Right;
14881   verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle);
14882 }
14883 
14884  TEST_F(FormatTest, SpacesInConditionalStatement) {
14885   FormatStyle Spaces = getLLVMStyle();
14886   Spaces.SpacesInConditionalStatement = true;
14887   verifyFormat("for ( int i = 0; i; i++ )\n  continue;", Spaces);
14888   verifyFormat("if ( !a )\n  return;", Spaces);
14889   verifyFormat("if ( a )\n  return;", Spaces);
14890   verifyFormat("if constexpr ( a )\n  return;", Spaces);
14891   verifyFormat("switch ( a )\ncase 1:\n  return;", Spaces);
14892   verifyFormat("while ( a )\n  return;", Spaces);
14893   verifyFormat("while ( (a && b) )\n  return;", Spaces);
14894   verifyFormat("do {\n} while ( 1 != 0 );", Spaces);
14895   // Check that space on the left of "::" is inserted as expected at beginning
14896   // of condition.
14897   verifyFormat("while ( ::func() )\n  return;", Spaces);
14898 }
14899 
14900 TEST_F(FormatTest, AlternativeOperators) {
14901   // Test case for ensuring alternate operators are not
14902   // combined with their right most neighbour.
14903   verifyFormat("int a and b;");
14904   verifyFormat("int a and_eq b;");
14905   verifyFormat("int a bitand b;");
14906   verifyFormat("int a bitor b;");
14907   verifyFormat("int a compl b;");
14908   verifyFormat("int a not b;");
14909   verifyFormat("int a not_eq b;");
14910   verifyFormat("int a or b;");
14911   verifyFormat("int a xor b;");
14912   verifyFormat("int a xor_eq b;");
14913   verifyFormat("return this not_eq bitand other;");
14914   verifyFormat("bool operator not_eq(const X bitand other)");
14915 
14916   verifyFormat("int a and 5;");
14917   verifyFormat("int a and_eq 5;");
14918   verifyFormat("int a bitand 5;");
14919   verifyFormat("int a bitor 5;");
14920   verifyFormat("int a compl 5;");
14921   verifyFormat("int a not 5;");
14922   verifyFormat("int a not_eq 5;");
14923   verifyFormat("int a or 5;");
14924   verifyFormat("int a xor 5;");
14925   verifyFormat("int a xor_eq 5;");
14926 
14927   verifyFormat("int a compl(5);");
14928   verifyFormat("int a not(5);");
14929 
14930   /* FIXME handle alternate tokens
14931    * https://en.cppreference.com/w/cpp/language/operator_alternative
14932   // alternative tokens
14933   verifyFormat("compl foo();");     //  ~foo();
14934   verifyFormat("foo() <%%>;");      // foo();
14935   verifyFormat("void foo() <%%>;"); // void foo(){}
14936   verifyFormat("int a <:1:>;");     // int a[1];[
14937   verifyFormat("%:define ABC abc"); // #define ABC abc
14938   verifyFormat("%:%:");             // ##
14939   */
14940 }
14941 
14942 TEST_F(FormatTest, STLWhileNotDefineChed) {
14943   verifyFormat("#if defined(while)\n"
14944                "#define while EMIT WARNING C4005\n"
14945                "#endif // while");
14946 }
14947 
14948 TEST_F(FormatTest, OperatorSpacing) {
14949   FormatStyle Style = getLLVMStyle();
14950   Style.PointerAlignment = FormatStyle::PAS_Right;
14951   verifyFormat("Foo::operator*();", Style);
14952   verifyFormat("Foo::operator void *();", Style);
14953   verifyFormat("Foo::operator()(void *);", Style);
14954   verifyFormat("Foo::operator*(void *);", Style);
14955   verifyFormat("Foo::operator*();", Style);
14956   verifyFormat("operator*(int (*)(), class Foo);", Style);
14957 
14958   verifyFormat("Foo::operator&();", Style);
14959   verifyFormat("Foo::operator void &();", Style);
14960   verifyFormat("Foo::operator()(void &);", Style);
14961   verifyFormat("Foo::operator&(void &);", Style);
14962   verifyFormat("Foo::operator&();", Style);
14963   verifyFormat("operator&(int (&)(), class Foo);", Style);
14964 
14965   verifyFormat("Foo::operator&&();", Style);
14966   verifyFormat("Foo::operator void &&();", Style);
14967   verifyFormat("Foo::operator()(void &&);", Style);
14968   verifyFormat("Foo::operator&&(void &&);", Style);
14969   verifyFormat("Foo::operator&&();", Style);
14970   verifyFormat("operator&&(int(&&)(), class Foo);", Style);
14971 
14972   Style.PointerAlignment = FormatStyle::PAS_Left;
14973   verifyFormat("Foo::operator*();", Style);
14974   verifyFormat("Foo::operator void*();", Style);
14975   verifyFormat("Foo::operator()(void*);", Style);
14976   verifyFormat("Foo::operator*(void*);", Style);
14977   verifyFormat("Foo::operator*();", Style);
14978   verifyFormat("operator*(int (*)(), class Foo);", Style);
14979 
14980   verifyFormat("Foo::operator&();", Style);
14981   verifyFormat("Foo::operator void&();", Style);
14982   verifyFormat("Foo::operator()(void&);", Style);
14983   verifyFormat("Foo::operator&(void&);", Style);
14984   verifyFormat("Foo::operator&();", Style);
14985   verifyFormat("operator&(int (&)(), class Foo);", Style);
14986 
14987   verifyFormat("Foo::operator&&();", Style);
14988   verifyFormat("Foo::operator void&&();", Style);
14989   verifyFormat("Foo::operator()(void&&);", Style);
14990   verifyFormat("Foo::operator&&(void&&);", Style);
14991   verifyFormat("Foo::operator&&();", Style);
14992   verifyFormat("operator&&(int(&&)(), class Foo);", Style);
14993 
14994   Style.PointerAlignment = FormatStyle::PAS_Middle;
14995   verifyFormat("Foo::operator*();", Style);
14996   verifyFormat("Foo::operator void *();", Style);
14997   verifyFormat("Foo::operator()(void *);", Style);
14998   verifyFormat("Foo::operator*(void *);", Style);
14999   verifyFormat("Foo::operator*();", Style);
15000   verifyFormat("operator*(int (*)(), class Foo);", Style);
15001 
15002   verifyFormat("Foo::operator&();", Style);
15003   verifyFormat("Foo::operator void &();", Style);
15004   verifyFormat("Foo::operator()(void &);", Style);
15005   verifyFormat("Foo::operator&(void &);", Style);
15006   verifyFormat("Foo::operator&();", Style);
15007   verifyFormat("operator&(int (&)(), class Foo);", Style);
15008 
15009   verifyFormat("Foo::operator&&();", Style);
15010   verifyFormat("Foo::operator void &&();", Style);
15011   verifyFormat("Foo::operator()(void &&);", Style);
15012   verifyFormat("Foo::operator&&(void &&);", Style);
15013   verifyFormat("Foo::operator&&();", Style);
15014   verifyFormat("operator&&(int(&&)(), class Foo);", Style);
15015 }
15016 
15017 } // namespace
15018 } // namespace format
15019 } // namespace clang
15020