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