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 "llvm/Support/Debug.h"
15 #include "llvm/Support/MemoryBuffer.h"
16 #include "gtest/gtest.h"
17 
18 #define DEBUG_TYPE "format-test"
19 
20 using clang::tooling::ReplacementTest;
21 using clang::tooling::toReplacements;
22 using testing::internal::ScopedTrace;
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(const char *File, int Line, llvm::StringRef Expected,
69                      llvm::StringRef Code,
70                      const FormatStyle &Style = getLLVMStyle()) {
71     ScopedTrace t(File, Line, ::testing::Message() << Code.str());
72     EXPECT_EQ(Expected.str(), format(Expected, Style))
73         << "Expected code is not stable";
74     EXPECT_EQ(Expected.str(), format(Code, Style));
75     if (Style.Language == FormatStyle::LK_Cpp) {
76       // Objective-C++ is a superset of C++, so everything checked for C++
77       // needs to be checked for Objective-C++ as well.
78       FormatStyle ObjCStyle = Style;
79       ObjCStyle.Language = FormatStyle::LK_ObjC;
80       EXPECT_EQ(Expected.str(), format(test::messUp(Code), ObjCStyle));
81     }
82   }
83 
84   void _verifyFormat(const char *File, int Line, llvm::StringRef Code,
85                      const FormatStyle &Style = getLLVMStyle()) {
86     _verifyFormat(File, Line, Code, test::messUp(Code), Style);
87   }
88 
89   void _verifyIncompleteFormat(const char *File, int Line, llvm::StringRef Code,
90                                const FormatStyle &Style = getLLVMStyle()) {
91     ScopedTrace t(File, Line, ::testing::Message() << Code.str());
92     EXPECT_EQ(Code.str(),
93               format(test::messUp(Code), Style, SC_ExpectIncomplete));
94   }
95 
96   void _verifyIndependentOfContext(const char *File, int Line,
97                                    llvm::StringRef Text,
98                                    const FormatStyle &Style = getLLVMStyle()) {
99     _verifyFormat(File, Line, Text, Style);
100     _verifyFormat(File, Line, llvm::Twine("void f() { " + Text + " }").str(),
101                   Style);
102   }
103 
104   /// \brief Verify that clang-format does not crash on the given input.
105   void verifyNoCrash(llvm::StringRef Code,
106                      const FormatStyle &Style = getLLVMStyle()) {
107     format(Code, Style, SC_DoNotCheck);
108   }
109 
110   int ReplacementCount;
111 };
112 
113 #define verifyIndependentOfContext(...)                                        \
114   _verifyIndependentOfContext(__FILE__, __LINE__, __VA_ARGS__)
115 #define verifyIncompleteFormat(...)                                            \
116   _verifyIncompleteFormat(__FILE__, __LINE__, __VA_ARGS__)
117 #define verifyFormat(...) _verifyFormat(__FILE__, __LINE__, __VA_ARGS__)
118 #define verifyGoogleFormat(Code) verifyFormat(Code, getGoogleStyle())
119 
120 TEST_F(FormatTest, MessUp) {
121   EXPECT_EQ("1 2 3", test::messUp("1 2 3"));
122   EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n"));
123   EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc"));
124   EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc"));
125   EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne"));
126 }
127 
128 TEST_F(FormatTest, DefaultLLVMStyleIsCpp) {
129   EXPECT_EQ(FormatStyle::LK_Cpp, getLLVMStyle().Language);
130 }
131 
132 TEST_F(FormatTest, LLVMStyleOverride) {
133   EXPECT_EQ(FormatStyle::LK_Proto,
134             getLLVMStyle(FormatStyle::LK_Proto).Language);
135 }
136 
137 //===----------------------------------------------------------------------===//
138 // Basic function tests.
139 //===----------------------------------------------------------------------===//
140 
141 TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) {
142   EXPECT_EQ(";", format(";"));
143 }
144 
145 TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
146   EXPECT_EQ("int i;", format("  int i;"));
147   EXPECT_EQ("\nint i;", format(" \n\t \v \f  int i;"));
148   EXPECT_EQ("int i;\nint j;", format("    int i; int j;"));
149   EXPECT_EQ("int i;\nint j;", format("    int i;\n  int j;"));
150 }
151 
152 TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
153   EXPECT_EQ("int i;", format("int\ni;"));
154 }
155 
156 TEST_F(FormatTest, FormatsNestedBlockStatements) {
157   EXPECT_EQ("{\n  {\n    {}\n  }\n}", format("{{{}}}"));
158 }
159 
160 TEST_F(FormatTest, FormatsNestedCall) {
161   verifyFormat("Method(f1, f2(f3));");
162   verifyFormat("Method(f1(f2, f3()));");
163   verifyFormat("Method(f1(f2, (f3())));");
164 }
165 
166 TEST_F(FormatTest, NestedNameSpecifiers) {
167   verifyFormat("vector<::Type> v;");
168   verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())");
169   verifyFormat("static constexpr bool Bar = decltype(bar())::value;");
170   verifyFormat("static constexpr bool Bar = typeof(bar())::value;");
171   verifyFormat("static constexpr bool Bar = __underlying_type(bar())::value;");
172   verifyFormat("static constexpr bool Bar = _Atomic(bar())::value;");
173   verifyFormat("bool a = 2 < ::SomeFunction();");
174   verifyFormat("ALWAYS_INLINE ::std::string getName();");
175   verifyFormat("some::string getName();");
176 }
177 
178 TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
179   EXPECT_EQ("if (a) {\n"
180             "  f();\n"
181             "}",
182             format("if(a){f();}"));
183   EXPECT_EQ(4, ReplacementCount);
184   EXPECT_EQ("if (a) {\n"
185             "  f();\n"
186             "}",
187             format("if (a) {\n"
188                    "  f();\n"
189                    "}"));
190   EXPECT_EQ(0, ReplacementCount);
191   EXPECT_EQ("/*\r\n"
192             "\r\n"
193             "*/\r\n",
194             format("/*\r\n"
195                    "\r\n"
196                    "*/\r\n"));
197   EXPECT_EQ(0, ReplacementCount);
198 }
199 
200 TEST_F(FormatTest, RemovesEmptyLines) {
201   EXPECT_EQ("class C {\n"
202             "  int i;\n"
203             "};",
204             format("class C {\n"
205                    " int i;\n"
206                    "\n"
207                    "};"));
208 
209   // Don't remove empty lines at the start of namespaces or extern "C" blocks.
210   EXPECT_EQ("namespace N {\n"
211             "\n"
212             "int i;\n"
213             "}",
214             format("namespace N {\n"
215                    "\n"
216                    "int    i;\n"
217                    "}",
218                    getGoogleStyle()));
219   EXPECT_EQ("/* something */ namespace N {\n"
220             "\n"
221             "int i;\n"
222             "}",
223             format("/* something */ namespace N {\n"
224                    "\n"
225                    "int    i;\n"
226                    "}",
227                    getGoogleStyle()));
228   EXPECT_EQ("inline namespace N {\n"
229             "\n"
230             "int i;\n"
231             "}",
232             format("inline namespace N {\n"
233                    "\n"
234                    "int    i;\n"
235                    "}",
236                    getGoogleStyle()));
237   EXPECT_EQ("/* something */ inline namespace N {\n"
238             "\n"
239             "int i;\n"
240             "}",
241             format("/* something */ inline namespace N {\n"
242                    "\n"
243                    "int    i;\n"
244                    "}",
245                    getGoogleStyle()));
246   EXPECT_EQ("export namespace N {\n"
247             "\n"
248             "int i;\n"
249             "}",
250             format("export namespace N {\n"
251                    "\n"
252                    "int    i;\n"
253                    "}",
254                    getGoogleStyle()));
255   EXPECT_EQ("extern /**/ \"C\" /**/ {\n"
256             "\n"
257             "int i;\n"
258             "}",
259             format("extern /**/ \"C\" /**/ {\n"
260                    "\n"
261                    "int    i;\n"
262                    "}",
263                    getGoogleStyle()));
264 
265   // ...but do keep inlining and removing empty lines for non-block extern "C"
266   // functions.
267   verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle());
268   EXPECT_EQ("extern \"C\" int f() {\n"
269             "  int i = 42;\n"
270             "  return i;\n"
271             "}",
272             format("extern \"C\" int f() {\n"
273                    "\n"
274                    "  int i = 42;\n"
275                    "  return i;\n"
276                    "}",
277                    getGoogleStyle()));
278 
279   // Remove empty lines at the beginning and end of blocks.
280   EXPECT_EQ("void f() {\n"
281             "\n"
282             "  if (a) {\n"
283             "\n"
284             "    f();\n"
285             "  }\n"
286             "}",
287             format("void f() {\n"
288                    "\n"
289                    "  if (a) {\n"
290                    "\n"
291                    "    f();\n"
292                    "\n"
293                    "  }\n"
294                    "\n"
295                    "}",
296                    getLLVMStyle()));
297   EXPECT_EQ("void f() {\n"
298             "  if (a) {\n"
299             "    f();\n"
300             "  }\n"
301             "}",
302             format("void f() {\n"
303                    "\n"
304                    "  if (a) {\n"
305                    "\n"
306                    "    f();\n"
307                    "\n"
308                    "  }\n"
309                    "\n"
310                    "}",
311                    getGoogleStyle()));
312 
313   // Don't remove empty lines in more complex control statements.
314   EXPECT_EQ("void f() {\n"
315             "  if (a) {\n"
316             "    f();\n"
317             "\n"
318             "  } else if (b) {\n"
319             "    f();\n"
320             "  }\n"
321             "}",
322             format("void f() {\n"
323                    "  if (a) {\n"
324                    "    f();\n"
325                    "\n"
326                    "  } else if (b) {\n"
327                    "    f();\n"
328                    "\n"
329                    "  }\n"
330                    "\n"
331                    "}"));
332 
333   // Don't remove empty lines before namespace endings.
334   FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
335   LLVMWithNoNamespaceFix.FixNamespaceComments = false;
336   EXPECT_EQ("namespace {\n"
337             "int i;\n"
338             "\n"
339             "}",
340             format("namespace {\n"
341                    "int i;\n"
342                    "\n"
343                    "}",
344                    LLVMWithNoNamespaceFix));
345   EXPECT_EQ("namespace {\n"
346             "int i;\n"
347             "}",
348             format("namespace {\n"
349                    "int i;\n"
350                    "}",
351                    LLVMWithNoNamespaceFix));
352   EXPECT_EQ("namespace {\n"
353             "int i;\n"
354             "\n"
355             "};",
356             format("namespace {\n"
357                    "int i;\n"
358                    "\n"
359                    "};",
360                    LLVMWithNoNamespaceFix));
361   EXPECT_EQ("namespace {\n"
362             "int i;\n"
363             "};",
364             format("namespace {\n"
365                    "int i;\n"
366                    "};",
367                    LLVMWithNoNamespaceFix));
368   EXPECT_EQ("namespace {\n"
369             "int i;\n"
370             "\n"
371             "}",
372             format("namespace {\n"
373                    "int i;\n"
374                    "\n"
375                    "}"));
376   EXPECT_EQ("namespace {\n"
377             "int i;\n"
378             "\n"
379             "} // namespace",
380             format("namespace {\n"
381                    "int i;\n"
382                    "\n"
383                    "}  // namespace"));
384 
385   FormatStyle Style = getLLVMStyle();
386   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
387   Style.MaxEmptyLinesToKeep = 2;
388   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
389   Style.BraceWrapping.AfterClass = true;
390   Style.BraceWrapping.AfterFunction = true;
391   Style.KeepEmptyLinesAtTheStartOfBlocks = false;
392 
393   EXPECT_EQ("class Foo\n"
394             "{\n"
395             "  Foo() {}\n"
396             "\n"
397             "  void funk() {}\n"
398             "};",
399             format("class Foo\n"
400                    "{\n"
401                    "  Foo()\n"
402                    "  {\n"
403                    "  }\n"
404                    "\n"
405                    "  void funk() {}\n"
406                    "};",
407                    Style));
408 }
409 
410 TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
411   verifyFormat("x = (a) and (b);");
412   verifyFormat("x = (a) or (b);");
413   verifyFormat("x = (a) bitand (b);");
414   verifyFormat("x = (a) bitor (b);");
415   verifyFormat("x = (a) not_eq (b);");
416   verifyFormat("x = (a) and_eq (b);");
417   verifyFormat("x = (a) or_eq (b);");
418   verifyFormat("x = (a) xor (b);");
419 }
420 
421 TEST_F(FormatTest, RecognizesUnaryOperatorKeywords) {
422   verifyFormat("x = compl(a);");
423   verifyFormat("x = not(a);");
424   verifyFormat("x = bitand(a);");
425   // Unary operator must not be merged with the next identifier
426   verifyFormat("x = compl a;");
427   verifyFormat("x = not a;");
428   verifyFormat("x = bitand a;");
429 }
430 
431 //===----------------------------------------------------------------------===//
432 // Tests for control statements.
433 //===----------------------------------------------------------------------===//
434 
435 TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
436   verifyFormat("if (true)\n  f();\ng();");
437   verifyFormat("if (a)\n  if (b)\n    if (c)\n      g();\nh();");
438   verifyFormat("if (a)\n  if (b) {\n    f();\n  }\ng();");
439   verifyFormat("if constexpr (true)\n"
440                "  f();\ng();");
441   verifyFormat("if CONSTEXPR (true)\n"
442                "  f();\ng();");
443   verifyFormat("if constexpr (a)\n"
444                "  if constexpr (b)\n"
445                "    if constexpr (c)\n"
446                "      g();\n"
447                "h();");
448   verifyFormat("if CONSTEXPR (a)\n"
449                "  if CONSTEXPR (b)\n"
450                "    if CONSTEXPR (c)\n"
451                "      g();\n"
452                "h();");
453   verifyFormat("if constexpr (a)\n"
454                "  if constexpr (b) {\n"
455                "    f();\n"
456                "  }\n"
457                "g();");
458   verifyFormat("if CONSTEXPR (a)\n"
459                "  if CONSTEXPR (b) {\n"
460                "    f();\n"
461                "  }\n"
462                "g();");
463 
464   FormatStyle AllowsMergedIf = getLLVMStyle();
465   AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left;
466   AllowsMergedIf.AllowShortIfStatementsOnASingleLine =
467       FormatStyle::SIS_WithoutElse;
468   verifyFormat("if (a)\n"
469                "  // comment\n"
470                "  f();",
471                AllowsMergedIf);
472   verifyFormat("{\n"
473                "  if (a)\n"
474                "  label:\n"
475                "    f();\n"
476                "}",
477                AllowsMergedIf);
478   verifyFormat("#define A \\\n"
479                "  if (a)  \\\n"
480                "  label:  \\\n"
481                "    f()",
482                AllowsMergedIf);
483   verifyFormat("if (a)\n"
484                "  ;",
485                AllowsMergedIf);
486   verifyFormat("if (a)\n"
487                "  if (b) return;",
488                AllowsMergedIf);
489 
490   verifyFormat("if (a) // Can't merge this\n"
491                "  f();\n",
492                AllowsMergedIf);
493   verifyFormat("if (a) /* still don't merge */\n"
494                "  f();",
495                AllowsMergedIf);
496   verifyFormat("if (a) { // Never merge this\n"
497                "  f();\n"
498                "}",
499                AllowsMergedIf);
500   verifyFormat("if (a) { /* Never merge this */\n"
501                "  f();\n"
502                "}",
503                AllowsMergedIf);
504 
505   AllowsMergedIf.ColumnLimit = 14;
506   verifyFormat("if (a) return;", AllowsMergedIf);
507   verifyFormat("if (aaaaaaaaa)\n"
508                "  return;",
509                AllowsMergedIf);
510 
511   AllowsMergedIf.ColumnLimit = 13;
512   verifyFormat("if (a)\n  return;", AllowsMergedIf);
513 }
514 
515 TEST_F(FormatTest, FormatIfWithoutCompoundStatementButElseWith) {
516   FormatStyle AllowsMergedIf = getLLVMStyle();
517   AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left;
518   AllowsMergedIf.AllowShortIfStatementsOnASingleLine =
519       FormatStyle::SIS_WithoutElse;
520   verifyFormat("if (a)\n"
521                "  f();\n"
522                "else {\n"
523                "  g();\n"
524                "}",
525                AllowsMergedIf);
526   verifyFormat("if (a)\n"
527                "  f();\n"
528                "else\n"
529                "  g();\n",
530                AllowsMergedIf);
531 
532   AllowsMergedIf.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always;
533 
534   verifyFormat("if (a) f();\n"
535                "else {\n"
536                "  g();\n"
537                "}",
538                AllowsMergedIf);
539   verifyFormat("if (a) f();\n"
540                "else {\n"
541                "  if (a) f();\n"
542                "  else {\n"
543                "    g();\n"
544                "  }\n"
545                "  g();\n"
546                "}",
547                AllowsMergedIf);
548 }
549 
550 TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
551   FormatStyle AllowsMergedLoops = getLLVMStyle();
552   AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
553   verifyFormat("while (true) continue;", AllowsMergedLoops);
554   verifyFormat("for (;;) continue;", AllowsMergedLoops);
555   verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
556   verifyFormat("while (true)\n"
557                "  ;",
558                AllowsMergedLoops);
559   verifyFormat("for (;;)\n"
560                "  ;",
561                AllowsMergedLoops);
562   verifyFormat("for (;;)\n"
563                "  for (;;) continue;",
564                AllowsMergedLoops);
565   verifyFormat("for (;;) // Can't merge this\n"
566                "  continue;",
567                AllowsMergedLoops);
568   verifyFormat("for (;;) /* still don't merge */\n"
569                "  continue;",
570                AllowsMergedLoops);
571   verifyFormat("do a++;\n"
572                "while (true);",
573                AllowsMergedLoops);
574   verifyFormat("do /* Don't merge */\n"
575                "  a++;\n"
576                "while (true);",
577                AllowsMergedLoops);
578   verifyFormat("do // Don't merge\n"
579                "  a++;\n"
580                "while (true);",
581                AllowsMergedLoops);
582   verifyFormat("do\n"
583                "  // Don't merge\n"
584                "  a++;\n"
585                "while (true);",
586                AllowsMergedLoops);
587   // Without braces labels are interpreted differently.
588   verifyFormat("{\n"
589                "  do\n"
590                "  label:\n"
591                "    a++;\n"
592                "  while (true);\n"
593                "}",
594                AllowsMergedLoops);
595 }
596 
597 TEST_F(FormatTest, FormatShortBracedStatements) {
598   FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
599   AllowSimpleBracedStatements.ColumnLimit = 40;
600   AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine =
601       FormatStyle::SBS_Always;
602 
603   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine =
604       FormatStyle::SIS_WithoutElse;
605   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
606 
607   AllowSimpleBracedStatements.BreakBeforeBraces = FormatStyle::BS_Custom;
608   AllowSimpleBracedStatements.BraceWrapping.AfterFunction = true;
609   AllowSimpleBracedStatements.BraceWrapping.SplitEmptyRecord = false;
610 
611   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
612   verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
613   verifyFormat("if CONSTEXPR (true) {}", AllowSimpleBracedStatements);
614   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
615   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
616   verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
617   verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
618   verifyFormat("if CONSTEXPR (true) { f(); }", AllowSimpleBracedStatements);
619   verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
620   verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
621   verifyFormat("if (true) { fffffffffffffffffffffff(); }",
622                AllowSimpleBracedStatements);
623   verifyFormat("if (true) {\n"
624                "  ffffffffffffffffffffffff();\n"
625                "}",
626                AllowSimpleBracedStatements);
627   verifyFormat("if (true) {\n"
628                "  ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
629                "}",
630                AllowSimpleBracedStatements);
631   verifyFormat("if (true) { //\n"
632                "  f();\n"
633                "}",
634                AllowSimpleBracedStatements);
635   verifyFormat("if (true) {\n"
636                "  f();\n"
637                "  f();\n"
638                "}",
639                AllowSimpleBracedStatements);
640   verifyFormat("if (true) {\n"
641                "  f();\n"
642                "} else {\n"
643                "  f();\n"
644                "}",
645                AllowSimpleBracedStatements);
646 
647   verifyFormat("struct A2 {\n"
648                "  int X;\n"
649                "};",
650                AllowSimpleBracedStatements);
651   verifyFormat("typedef struct A2 {\n"
652                "  int X;\n"
653                "} A2_t;",
654                AllowSimpleBracedStatements);
655   verifyFormat("template <int> struct A2 {\n"
656                "  struct B {};\n"
657                "};",
658                AllowSimpleBracedStatements);
659 
660   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine =
661       FormatStyle::SIS_Never;
662   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
663   verifyFormat("if (true) {\n"
664                "  f();\n"
665                "}",
666                AllowSimpleBracedStatements);
667   verifyFormat("if (true) {\n"
668                "  f();\n"
669                "} else {\n"
670                "  f();\n"
671                "}",
672                AllowSimpleBracedStatements);
673 
674   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
675   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
676   verifyFormat("while (true) {\n"
677                "  f();\n"
678                "}",
679                AllowSimpleBracedStatements);
680   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
681   verifyFormat("for (;;) {\n"
682                "  f();\n"
683                "}",
684                AllowSimpleBracedStatements);
685 
686   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine =
687       FormatStyle::SIS_WithoutElse;
688   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
689   AllowSimpleBracedStatements.BraceWrapping.AfterControlStatement =
690       FormatStyle::BWACS_Always;
691 
692   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
693   verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
694   verifyFormat("if CONSTEXPR (true) {}", AllowSimpleBracedStatements);
695   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
696   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
697   verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
698   verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
699   verifyFormat("if CONSTEXPR (true) { f(); }", AllowSimpleBracedStatements);
700   verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
701   verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
702   verifyFormat("if (true) { fffffffffffffffffffffff(); }",
703                AllowSimpleBracedStatements);
704   verifyFormat("if (true)\n"
705                "{\n"
706                "  ffffffffffffffffffffffff();\n"
707                "}",
708                AllowSimpleBracedStatements);
709   verifyFormat("if (true)\n"
710                "{\n"
711                "  ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
712                "}",
713                AllowSimpleBracedStatements);
714   verifyFormat("if (true)\n"
715                "{ //\n"
716                "  f();\n"
717                "}",
718                AllowSimpleBracedStatements);
719   verifyFormat("if (true)\n"
720                "{\n"
721                "  f();\n"
722                "  f();\n"
723                "}",
724                AllowSimpleBracedStatements);
725   verifyFormat("if (true)\n"
726                "{\n"
727                "  f();\n"
728                "} else\n"
729                "{\n"
730                "  f();\n"
731                "}",
732                AllowSimpleBracedStatements);
733 
734   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine =
735       FormatStyle::SIS_Never;
736   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
737   verifyFormat("if (true)\n"
738                "{\n"
739                "  f();\n"
740                "}",
741                AllowSimpleBracedStatements);
742   verifyFormat("if (true)\n"
743                "{\n"
744                "  f();\n"
745                "} else\n"
746                "{\n"
747                "  f();\n"
748                "}",
749                AllowSimpleBracedStatements);
750 
751   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
752   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
753   verifyFormat("while (true)\n"
754                "{\n"
755                "  f();\n"
756                "}",
757                AllowSimpleBracedStatements);
758   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
759   verifyFormat("for (;;)\n"
760                "{\n"
761                "  f();\n"
762                "}",
763                AllowSimpleBracedStatements);
764 }
765 
766 TEST_F(FormatTest, ShortBlocksInMacrosDontMergeWithCodeAfterMacro) {
767   FormatStyle Style = getLLVMStyleWithColumns(60);
768   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always;
769   Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse;
770   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
771   EXPECT_EQ("#define A                                                  \\\n"
772             "  if (HANDLEwernufrnuLwrmviferuvnierv)                     \\\n"
773             "  {                                                        \\\n"
774             "    RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier;               \\\n"
775             "  }\n"
776             "X;",
777             format("#define A \\\n"
778                    "   if (HANDLEwernufrnuLwrmviferuvnierv) { \\\n"
779                    "      RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; \\\n"
780                    "   }\n"
781                    "X;",
782                    Style));
783 }
784 
785 TEST_F(FormatTest, ParseIfElse) {
786   verifyFormat("if (true)\n"
787                "  if (true)\n"
788                "    if (true)\n"
789                "      f();\n"
790                "    else\n"
791                "      g();\n"
792                "  else\n"
793                "    h();\n"
794                "else\n"
795                "  i();");
796   verifyFormat("if (true)\n"
797                "  if (true)\n"
798                "    if (true) {\n"
799                "      if (true)\n"
800                "        f();\n"
801                "    } else {\n"
802                "      g();\n"
803                "    }\n"
804                "  else\n"
805                "    h();\n"
806                "else {\n"
807                "  i();\n"
808                "}");
809   verifyFormat("if (true)\n"
810                "  if constexpr (true)\n"
811                "    if (true) {\n"
812                "      if constexpr (true)\n"
813                "        f();\n"
814                "    } else {\n"
815                "      g();\n"
816                "    }\n"
817                "  else\n"
818                "    h();\n"
819                "else {\n"
820                "  i();\n"
821                "}");
822   verifyFormat("if (true)\n"
823                "  if CONSTEXPR (true)\n"
824                "    if (true) {\n"
825                "      if CONSTEXPR (true)\n"
826                "        f();\n"
827                "    } else {\n"
828                "      g();\n"
829                "    }\n"
830                "  else\n"
831                "    h();\n"
832                "else {\n"
833                "  i();\n"
834                "}");
835   verifyFormat("void f() {\n"
836                "  if (a) {\n"
837                "  } else {\n"
838                "  }\n"
839                "}");
840 }
841 
842 TEST_F(FormatTest, ElseIf) {
843   verifyFormat("if (a) {\n} else if (b) {\n}");
844   verifyFormat("if (a)\n"
845                "  f();\n"
846                "else if (b)\n"
847                "  g();\n"
848                "else\n"
849                "  h();");
850   verifyFormat("if constexpr (a)\n"
851                "  f();\n"
852                "else if constexpr (b)\n"
853                "  g();\n"
854                "else\n"
855                "  h();");
856   verifyFormat("if CONSTEXPR (a)\n"
857                "  f();\n"
858                "else if CONSTEXPR (b)\n"
859                "  g();\n"
860                "else\n"
861                "  h();");
862   verifyFormat("if (a) {\n"
863                "  f();\n"
864                "}\n"
865                "// or else ..\n"
866                "else {\n"
867                "  g()\n"
868                "}");
869 
870   verifyFormat("if (a) {\n"
871                "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
872                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
873                "}");
874   verifyFormat("if (a) {\n"
875                "} else if constexpr (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
876                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
877                "}");
878   verifyFormat("if (a) {\n"
879                "} else if CONSTEXPR (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
880                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
881                "}");
882   verifyFormat("if (a) {\n"
883                "} else if (\n"
884                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
885                "}",
886                getLLVMStyleWithColumns(62));
887   verifyFormat("if (a) {\n"
888                "} else if constexpr (\n"
889                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
890                "}",
891                getLLVMStyleWithColumns(62));
892   verifyFormat("if (a) {\n"
893                "} else if CONSTEXPR (\n"
894                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
895                "}",
896                getLLVMStyleWithColumns(62));
897 }
898 
899 TEST_F(FormatTest, FormatsForLoop) {
900   verifyFormat(
901       "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
902       "     ++VeryVeryLongLoopVariable)\n"
903       "  ;");
904   verifyFormat("for (;;)\n"
905                "  f();");
906   verifyFormat("for (;;) {\n}");
907   verifyFormat("for (;;) {\n"
908                "  f();\n"
909                "}");
910   verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
911 
912   verifyFormat(
913       "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
914       "                                          E = UnwrappedLines.end();\n"
915       "     I != E; ++I) {\n}");
916 
917   verifyFormat(
918       "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
919       "     ++IIIII) {\n}");
920   verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
921                "         aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
922                "     aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
923   verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
924                "         I = FD->getDeclsInPrototypeScope().begin(),\n"
925                "         E = FD->getDeclsInPrototypeScope().end();\n"
926                "     I != E; ++I) {\n}");
927   verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
928                "         I = Container.begin(),\n"
929                "         E = Container.end();\n"
930                "     I != E; ++I) {\n}",
931                getLLVMStyleWithColumns(76));
932 
933   verifyFormat(
934       "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
935       "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
936       "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
937       "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
938       "     ++aaaaaaaaaaa) {\n}");
939   verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
940                "                bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
941                "     ++i) {\n}");
942   verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
943                "     aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
944                "}");
945   verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
946                "         aaaaaaaaaa);\n"
947                "     iter; ++iter) {\n"
948                "}");
949   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
950                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
951                "     aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
952                "     ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
953 
954   // These should not be formatted as Objective-C for-in loops.
955   verifyFormat("for (Foo *x = 0; x != in; x++) {\n}");
956   verifyFormat("Foo *x;\nfor (x = 0; x != in; x++) {\n}");
957   verifyFormat("Foo *x;\nfor (x in y) {\n}");
958   verifyFormat(
959       "for (const Foo<Bar> &baz = in.value(); !baz.at_end(); ++baz) {\n}");
960 
961   FormatStyle NoBinPacking = getLLVMStyle();
962   NoBinPacking.BinPackParameters = false;
963   verifyFormat("for (int aaaaaaaaaaa = 1;\n"
964                "     aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
965                "                                           aaaaaaaaaaaaaaaa,\n"
966                "                                           aaaaaaaaaaaaaaaa,\n"
967                "                                           aaaaaaaaaaaaaaaa);\n"
968                "     aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
969                "}",
970                NoBinPacking);
971   verifyFormat(
972       "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
973       "                                          E = UnwrappedLines.end();\n"
974       "     I != E;\n"
975       "     ++I) {\n}",
976       NoBinPacking);
977 
978   FormatStyle AlignLeft = getLLVMStyle();
979   AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
980   verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft);
981 }
982 
983 TEST_F(FormatTest, RangeBasedForLoops) {
984   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
985                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
986   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
987                "     aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
988   verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
989                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
990   verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
991                "     aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
992 }
993 
994 TEST_F(FormatTest, ForEachLoops) {
995   verifyFormat("void f() {\n"
996                "  foreach (Item *item, itemlist) {}\n"
997                "  Q_FOREACH (Item *item, itemlist) {}\n"
998                "  BOOST_FOREACH (Item *item, itemlist) {}\n"
999                "  UNKNOWN_FORACH(Item * item, itemlist) {}\n"
1000                "}");
1001 
1002   FormatStyle Style = getLLVMStyle();
1003   Style.SpaceBeforeParens =
1004       FormatStyle::SBPO_ControlStatementsExceptForEachMacros;
1005   verifyFormat("void f() {\n"
1006                "  foreach(Item *item, itemlist) {}\n"
1007                "  Q_FOREACH(Item *item, itemlist) {}\n"
1008                "  BOOST_FOREACH(Item *item, itemlist) {}\n"
1009                "  UNKNOWN_FORACH(Item * item, itemlist) {}\n"
1010                "}",
1011                Style);
1012 
1013   // As function-like macros.
1014   verifyFormat("#define foreach(x, y)\n"
1015                "#define Q_FOREACH(x, y)\n"
1016                "#define BOOST_FOREACH(x, y)\n"
1017                "#define UNKNOWN_FOREACH(x, y)\n");
1018 
1019   // Not as function-like macros.
1020   verifyFormat("#define foreach (x, y)\n"
1021                "#define Q_FOREACH (x, y)\n"
1022                "#define BOOST_FOREACH (x, y)\n"
1023                "#define UNKNOWN_FOREACH (x, y)\n");
1024 
1025   // handle microsoft non standard extension
1026   verifyFormat("for each (char c in x->MyStringProperty)");
1027 }
1028 
1029 TEST_F(FormatTest, FormatsWhileLoop) {
1030   verifyFormat("while (true) {\n}");
1031   verifyFormat("while (true)\n"
1032                "  f();");
1033   verifyFormat("while () {\n}");
1034   verifyFormat("while () {\n"
1035                "  f();\n"
1036                "}");
1037 }
1038 
1039 TEST_F(FormatTest, FormatsDoWhile) {
1040   verifyFormat("do {\n"
1041                "  do_something();\n"
1042                "} while (something());");
1043   verifyFormat("do\n"
1044                "  do_something();\n"
1045                "while (something());");
1046 }
1047 
1048 TEST_F(FormatTest, FormatsSwitchStatement) {
1049   verifyFormat("switch (x) {\n"
1050                "case 1:\n"
1051                "  f();\n"
1052                "  break;\n"
1053                "case kFoo:\n"
1054                "case ns::kBar:\n"
1055                "case kBaz:\n"
1056                "  break;\n"
1057                "default:\n"
1058                "  g();\n"
1059                "  break;\n"
1060                "}");
1061   verifyFormat("switch (x) {\n"
1062                "case 1: {\n"
1063                "  f();\n"
1064                "  break;\n"
1065                "}\n"
1066                "case 2: {\n"
1067                "  break;\n"
1068                "}\n"
1069                "}");
1070   verifyFormat("switch (x) {\n"
1071                "case 1: {\n"
1072                "  f();\n"
1073                "  {\n"
1074                "    g();\n"
1075                "    h();\n"
1076                "  }\n"
1077                "  break;\n"
1078                "}\n"
1079                "}");
1080   verifyFormat("switch (x) {\n"
1081                "case 1: {\n"
1082                "  f();\n"
1083                "  if (foo) {\n"
1084                "    g();\n"
1085                "    h();\n"
1086                "  }\n"
1087                "  break;\n"
1088                "}\n"
1089                "}");
1090   verifyFormat("switch (x) {\n"
1091                "case 1: {\n"
1092                "  f();\n"
1093                "  g();\n"
1094                "} break;\n"
1095                "}");
1096   verifyFormat("switch (test)\n"
1097                "  ;");
1098   verifyFormat("switch (x) {\n"
1099                "default: {\n"
1100                "  // Do nothing.\n"
1101                "}\n"
1102                "}");
1103   verifyFormat("switch (x) {\n"
1104                "// comment\n"
1105                "// if 1, do f()\n"
1106                "case 1:\n"
1107                "  f();\n"
1108                "}");
1109   verifyFormat("switch (x) {\n"
1110                "case 1:\n"
1111                "  // Do amazing stuff\n"
1112                "  {\n"
1113                "    f();\n"
1114                "    g();\n"
1115                "  }\n"
1116                "  break;\n"
1117                "}");
1118   verifyFormat("#define A          \\\n"
1119                "  switch (x) {     \\\n"
1120                "  case a:          \\\n"
1121                "    foo = b;       \\\n"
1122                "  }",
1123                getLLVMStyleWithColumns(20));
1124   verifyFormat("#define OPERATION_CASE(name)           \\\n"
1125                "  case OP_name:                        \\\n"
1126                "    return operations::Operation##name\n",
1127                getLLVMStyleWithColumns(40));
1128   verifyFormat("switch (x) {\n"
1129                "case 1:;\n"
1130                "default:;\n"
1131                "  int i;\n"
1132                "}");
1133 
1134   verifyGoogleFormat("switch (x) {\n"
1135                      "  case 1:\n"
1136                      "    f();\n"
1137                      "    break;\n"
1138                      "  case kFoo:\n"
1139                      "  case ns::kBar:\n"
1140                      "  case kBaz:\n"
1141                      "    break;\n"
1142                      "  default:\n"
1143                      "    g();\n"
1144                      "    break;\n"
1145                      "}");
1146   verifyGoogleFormat("switch (x) {\n"
1147                      "  case 1: {\n"
1148                      "    f();\n"
1149                      "    break;\n"
1150                      "  }\n"
1151                      "}");
1152   verifyGoogleFormat("switch (test)\n"
1153                      "  ;");
1154 
1155   verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
1156                      "  case OP_name:              \\\n"
1157                      "    return operations::Operation##name\n");
1158   verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
1159                      "  // Get the correction operation class.\n"
1160                      "  switch (OpCode) {\n"
1161                      "    CASE(Add);\n"
1162                      "    CASE(Subtract);\n"
1163                      "    default:\n"
1164                      "      return operations::Unknown;\n"
1165                      "  }\n"
1166                      "#undef OPERATION_CASE\n"
1167                      "}");
1168   verifyFormat("DEBUG({\n"
1169                "  switch (x) {\n"
1170                "  case A:\n"
1171                "    f();\n"
1172                "    break;\n"
1173                "    // fallthrough\n"
1174                "  case B:\n"
1175                "    g();\n"
1176                "    break;\n"
1177                "  }\n"
1178                "});");
1179   EXPECT_EQ("DEBUG({\n"
1180             "  switch (x) {\n"
1181             "  case A:\n"
1182             "    f();\n"
1183             "    break;\n"
1184             "  // On B:\n"
1185             "  case B:\n"
1186             "    g();\n"
1187             "    break;\n"
1188             "  }\n"
1189             "});",
1190             format("DEBUG({\n"
1191                    "  switch (x) {\n"
1192                    "  case A:\n"
1193                    "    f();\n"
1194                    "    break;\n"
1195                    "  // On B:\n"
1196                    "  case B:\n"
1197                    "    g();\n"
1198                    "    break;\n"
1199                    "  }\n"
1200                    "});",
1201                    getLLVMStyle()));
1202   EXPECT_EQ("switch (n) {\n"
1203             "case 0: {\n"
1204             "  return false;\n"
1205             "}\n"
1206             "default: {\n"
1207             "  return true;\n"
1208             "}\n"
1209             "}",
1210             format("switch (n)\n"
1211                    "{\n"
1212                    "case 0: {\n"
1213                    "  return false;\n"
1214                    "}\n"
1215                    "default: {\n"
1216                    "  return true;\n"
1217                    "}\n"
1218                    "}",
1219                    getLLVMStyle()));
1220   verifyFormat("switch (a) {\n"
1221                "case (b):\n"
1222                "  return;\n"
1223                "}");
1224 
1225   verifyFormat("switch (a) {\n"
1226                "case some_namespace::\n"
1227                "    some_constant:\n"
1228                "  return;\n"
1229                "}",
1230                getLLVMStyleWithColumns(34));
1231 
1232   FormatStyle Style = getLLVMStyle();
1233   Style.IndentCaseLabels = true;
1234   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never;
1235   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1236   Style.BraceWrapping.AfterCaseLabel = true;
1237   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always;
1238   EXPECT_EQ("switch (n)\n"
1239             "{\n"
1240             "  case 0:\n"
1241             "  {\n"
1242             "    return false;\n"
1243             "  }\n"
1244             "  default:\n"
1245             "  {\n"
1246             "    return true;\n"
1247             "  }\n"
1248             "}",
1249             format("switch (n) {\n"
1250                    "  case 0: {\n"
1251                    "    return false;\n"
1252                    "  }\n"
1253                    "  default: {\n"
1254                    "    return true;\n"
1255                    "  }\n"
1256                    "}",
1257                    Style));
1258   Style.BraceWrapping.AfterCaseLabel = false;
1259   EXPECT_EQ("switch (n)\n"
1260             "{\n"
1261             "  case 0: {\n"
1262             "    return false;\n"
1263             "  }\n"
1264             "  default: {\n"
1265             "    return true;\n"
1266             "  }\n"
1267             "}",
1268             format("switch (n) {\n"
1269                    "  case 0:\n"
1270                    "  {\n"
1271                    "    return false;\n"
1272                    "  }\n"
1273                    "  default:\n"
1274                    "  {\n"
1275                    "    return true;\n"
1276                    "  }\n"
1277                    "}",
1278                    Style));
1279   Style.IndentCaseLabels = false;
1280   Style.IndentCaseBlocks = true;
1281   EXPECT_EQ("switch (n)\n"
1282             "{\n"
1283             "case 0:\n"
1284             "  {\n"
1285             "    return false;\n"
1286             "  }\n"
1287             "case 1:\n"
1288             "  break;\n"
1289             "default:\n"
1290             "  {\n"
1291             "    return true;\n"
1292             "  }\n"
1293             "}",
1294             format("switch (n) {\n"
1295                    "case 0: {\n"
1296                    "  return false;\n"
1297                    "}\n"
1298                    "case 1:\n"
1299                    "  break;\n"
1300                    "default: {\n"
1301                    "  return true;\n"
1302                    "}\n"
1303                    "}",
1304                    Style));
1305   Style.IndentCaseLabels = true;
1306   Style.IndentCaseBlocks = true;
1307   EXPECT_EQ("switch (n)\n"
1308             "{\n"
1309             "  case 0:\n"
1310             "    {\n"
1311             "      return false;\n"
1312             "    }\n"
1313             "  case 1:\n"
1314             "    break;\n"
1315             "  default:\n"
1316             "    {\n"
1317             "      return true;\n"
1318             "    }\n"
1319             "}",
1320             format("switch (n) {\n"
1321                    "case 0: {\n"
1322                    "  return false;\n"
1323                    "}\n"
1324                    "case 1:\n"
1325                    "  break;\n"
1326                    "default: {\n"
1327                    "  return true;\n"
1328                    "}\n"
1329                    "}",
1330                    Style));
1331 }
1332 
1333 TEST_F(FormatTest, CaseRanges) {
1334   verifyFormat("switch (x) {\n"
1335                "case 'A' ... 'Z':\n"
1336                "case 1 ... 5:\n"
1337                "case a ... b:\n"
1338                "  break;\n"
1339                "}");
1340 }
1341 
1342 TEST_F(FormatTest, ShortEnums) {
1343   FormatStyle Style = getLLVMStyle();
1344   Style.AllowShortEnumsOnASingleLine = true;
1345   verifyFormat("enum { A, B, C } ShortEnum1, ShortEnum2;", Style);
1346   Style.AllowShortEnumsOnASingleLine = false;
1347   verifyFormat("enum\n"
1348                "{\n"
1349                "  A,\n"
1350                "  B,\n"
1351                "  C\n"
1352                "} ShortEnum1, ShortEnum2;",
1353                Style);
1354 }
1355 
1356 TEST_F(FormatTest, ShortCaseLabels) {
1357   FormatStyle Style = getLLVMStyle();
1358   Style.AllowShortCaseLabelsOnASingleLine = true;
1359   verifyFormat("switch (a) {\n"
1360                "case 1: x = 1; break;\n"
1361                "case 2: return;\n"
1362                "case 3:\n"
1363                "case 4:\n"
1364                "case 5: return;\n"
1365                "case 6: // comment\n"
1366                "  return;\n"
1367                "case 7:\n"
1368                "  // comment\n"
1369                "  return;\n"
1370                "case 8:\n"
1371                "  x = 8; // comment\n"
1372                "  break;\n"
1373                "default: y = 1; break;\n"
1374                "}",
1375                Style);
1376   verifyFormat("switch (a) {\n"
1377                "case 0: return; // comment\n"
1378                "case 1: break;  // comment\n"
1379                "case 2: return;\n"
1380                "// comment\n"
1381                "case 3: return;\n"
1382                "// comment 1\n"
1383                "// comment 2\n"
1384                "// comment 3\n"
1385                "case 4: break; /* comment */\n"
1386                "case 5:\n"
1387                "  // comment\n"
1388                "  break;\n"
1389                "case 6: /* comment */ x = 1; break;\n"
1390                "case 7: x = /* comment */ 1; break;\n"
1391                "case 8:\n"
1392                "  x = 1; /* comment */\n"
1393                "  break;\n"
1394                "case 9:\n"
1395                "  break; // comment line 1\n"
1396                "         // comment line 2\n"
1397                "}",
1398                Style);
1399   EXPECT_EQ("switch (a) {\n"
1400             "case 1:\n"
1401             "  x = 8;\n"
1402             "  // fall through\n"
1403             "case 2: x = 8;\n"
1404             "// comment\n"
1405             "case 3:\n"
1406             "  return; /* comment line 1\n"
1407             "           * comment line 2 */\n"
1408             "case 4: i = 8;\n"
1409             "// something else\n"
1410             "#if FOO\n"
1411             "case 5: break;\n"
1412             "#endif\n"
1413             "}",
1414             format("switch (a) {\n"
1415                    "case 1: x = 8;\n"
1416                    "  // fall through\n"
1417                    "case 2:\n"
1418                    "  x = 8;\n"
1419                    "// comment\n"
1420                    "case 3:\n"
1421                    "  return; /* comment line 1\n"
1422                    "           * comment line 2 */\n"
1423                    "case 4:\n"
1424                    "  i = 8;\n"
1425                    "// something else\n"
1426                    "#if FOO\n"
1427                    "case 5: break;\n"
1428                    "#endif\n"
1429                    "}",
1430                    Style));
1431   EXPECT_EQ("switch (a) {\n"
1432             "case 0:\n"
1433             "  return; // long long long long long long long long long long "
1434             "long long comment\n"
1435             "          // line\n"
1436             "}",
1437             format("switch (a) {\n"
1438                    "case 0: return; // long long long long long long long long "
1439                    "long long long long comment line\n"
1440                    "}",
1441                    Style));
1442   EXPECT_EQ("switch (a) {\n"
1443             "case 0:\n"
1444             "  return; /* long long long long long long long long long long "
1445             "long long comment\n"
1446             "             line */\n"
1447             "}",
1448             format("switch (a) {\n"
1449                    "case 0: return; /* long long long long long long long long "
1450                    "long long long long comment line */\n"
1451                    "}",
1452                    Style));
1453   verifyFormat("switch (a) {\n"
1454                "#if FOO\n"
1455                "case 0: return 0;\n"
1456                "#endif\n"
1457                "}",
1458                Style);
1459   verifyFormat("switch (a) {\n"
1460                "case 1: {\n"
1461                "}\n"
1462                "case 2: {\n"
1463                "  return;\n"
1464                "}\n"
1465                "case 3: {\n"
1466                "  x = 1;\n"
1467                "  return;\n"
1468                "}\n"
1469                "case 4:\n"
1470                "  if (x)\n"
1471                "    return;\n"
1472                "}",
1473                Style);
1474   Style.ColumnLimit = 21;
1475   verifyFormat("switch (a) {\n"
1476                "case 1: x = 1; break;\n"
1477                "case 2: return;\n"
1478                "case 3:\n"
1479                "case 4:\n"
1480                "case 5: return;\n"
1481                "default:\n"
1482                "  y = 1;\n"
1483                "  break;\n"
1484                "}",
1485                Style);
1486   Style.ColumnLimit = 80;
1487   Style.AllowShortCaseLabelsOnASingleLine = false;
1488   Style.IndentCaseLabels = true;
1489   EXPECT_EQ("switch (n) {\n"
1490             "  default /*comments*/:\n"
1491             "    return true;\n"
1492             "  case 0:\n"
1493             "    return false;\n"
1494             "}",
1495             format("switch (n) {\n"
1496                    "default/*comments*/:\n"
1497                    "  return true;\n"
1498                    "case 0:\n"
1499                    "  return false;\n"
1500                    "}",
1501                    Style));
1502   Style.AllowShortCaseLabelsOnASingleLine = true;
1503   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1504   Style.BraceWrapping.AfterCaseLabel = true;
1505   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always;
1506   EXPECT_EQ("switch (n)\n"
1507             "{\n"
1508             "  case 0:\n"
1509             "  {\n"
1510             "    return false;\n"
1511             "  }\n"
1512             "  default:\n"
1513             "  {\n"
1514             "    return true;\n"
1515             "  }\n"
1516             "}",
1517             format("switch (n) {\n"
1518                    "  case 0: {\n"
1519                    "    return false;\n"
1520                    "  }\n"
1521                    "  default:\n"
1522                    "  {\n"
1523                    "    return true;\n"
1524                    "  }\n"
1525                    "}",
1526                    Style));
1527 }
1528 
1529 TEST_F(FormatTest, FormatsLabels) {
1530   verifyFormat("void f() {\n"
1531                "  some_code();\n"
1532                "test_label:\n"
1533                "  some_other_code();\n"
1534                "  {\n"
1535                "    some_more_code();\n"
1536                "  another_label:\n"
1537                "    some_more_code();\n"
1538                "  }\n"
1539                "}");
1540   verifyFormat("{\n"
1541                "  some_code();\n"
1542                "test_label:\n"
1543                "  some_other_code();\n"
1544                "}");
1545   verifyFormat("{\n"
1546                "  some_code();\n"
1547                "test_label:;\n"
1548                "  int i = 0;\n"
1549                "}");
1550   FormatStyle Style = getLLVMStyle();
1551   Style.IndentGotoLabels = false;
1552   verifyFormat("void f() {\n"
1553                "  some_code();\n"
1554                "test_label:\n"
1555                "  some_other_code();\n"
1556                "  {\n"
1557                "    some_more_code();\n"
1558                "another_label:\n"
1559                "    some_more_code();\n"
1560                "  }\n"
1561                "}",
1562                Style);
1563   verifyFormat("{\n"
1564                "  some_code();\n"
1565                "test_label:\n"
1566                "  some_other_code();\n"
1567                "}",
1568                Style);
1569   verifyFormat("{\n"
1570                "  some_code();\n"
1571                "test_label:;\n"
1572                "  int i = 0;\n"
1573                "}");
1574 }
1575 
1576 TEST_F(FormatTest, MultiLineControlStatements) {
1577   FormatStyle Style = getLLVMStyle();
1578   Style.BreakBeforeBraces = FormatStyle::BraceBreakingStyle::BS_Custom;
1579   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_MultiLine;
1580   Style.ColumnLimit = 20;
1581   // Short lines should keep opening brace on same line.
1582   EXPECT_EQ("if (foo) {\n"
1583             "  bar();\n"
1584             "}",
1585             format("if(foo){bar();}", Style));
1586   EXPECT_EQ("if (foo) {\n"
1587             "  bar();\n"
1588             "} else {\n"
1589             "  baz();\n"
1590             "}",
1591             format("if(foo){bar();}else{baz();}", Style));
1592   EXPECT_EQ("if (foo && bar) {\n"
1593             "  baz();\n"
1594             "}",
1595             format("if(foo&&bar){baz();}", Style));
1596   EXPECT_EQ("if (foo) {\n"
1597             "  bar();\n"
1598             "} else if (baz) {\n"
1599             "  quux();\n"
1600             "}",
1601             format("if(foo){bar();}else if(baz){quux();}", Style));
1602   EXPECT_EQ(
1603       "if (foo) {\n"
1604       "  bar();\n"
1605       "} else if (baz) {\n"
1606       "  quux();\n"
1607       "} else {\n"
1608       "  foobar();\n"
1609       "}",
1610       format("if(foo){bar();}else if(baz){quux();}else{foobar();}", Style));
1611   EXPECT_EQ("for (;;) {\n"
1612             "  foo();\n"
1613             "}",
1614             format("for(;;){foo();}"));
1615   EXPECT_EQ("while (1) {\n"
1616             "  foo();\n"
1617             "}",
1618             format("while(1){foo();}", Style));
1619   EXPECT_EQ("switch (foo) {\n"
1620             "case bar:\n"
1621             "  return;\n"
1622             "}",
1623             format("switch(foo){case bar:return;}", Style));
1624   EXPECT_EQ("try {\n"
1625             "  foo();\n"
1626             "} catch (...) {\n"
1627             "  bar();\n"
1628             "}",
1629             format("try{foo();}catch(...){bar();}", Style));
1630   EXPECT_EQ("do {\n"
1631             "  foo();\n"
1632             "} while (bar &&\n"
1633             "         baz);",
1634             format("do{foo();}while(bar&&baz);", Style));
1635   // Long lines should put opening brace on new line.
1636   EXPECT_EQ("if (foo && bar &&\n"
1637             "    baz)\n"
1638             "{\n"
1639             "  quux();\n"
1640             "}",
1641             format("if(foo&&bar&&baz){quux();}", Style));
1642   EXPECT_EQ("if (foo && bar &&\n"
1643             "    baz)\n"
1644             "{\n"
1645             "  quux();\n"
1646             "}",
1647             format("if (foo && bar &&\n"
1648                    "    baz) {\n"
1649                    "  quux();\n"
1650                    "}",
1651                    Style));
1652   EXPECT_EQ("if (foo) {\n"
1653             "  bar();\n"
1654             "} else if (baz ||\n"
1655             "           quux)\n"
1656             "{\n"
1657             "  foobar();\n"
1658             "}",
1659             format("if(foo){bar();}else if(baz||quux){foobar();}", Style));
1660   EXPECT_EQ(
1661       "if (foo) {\n"
1662       "  bar();\n"
1663       "} else if (baz ||\n"
1664       "           quux)\n"
1665       "{\n"
1666       "  foobar();\n"
1667       "} else {\n"
1668       "  barbaz();\n"
1669       "}",
1670       format("if(foo){bar();}else if(baz||quux){foobar();}else{barbaz();}",
1671              Style));
1672   EXPECT_EQ("for (int i = 0;\n"
1673             "     i < 10; ++i)\n"
1674             "{\n"
1675             "  foo();\n"
1676             "}",
1677             format("for(int i=0;i<10;++i){foo();}", Style));
1678   EXPECT_EQ("foreach (int i,\n"
1679             "         list)\n"
1680             "{\n"
1681             "  foo();\n"
1682             "}",
1683             format("foreach(int i, list){foo();}", Style));
1684   Style.ColumnLimit =
1685       40; // to concentrate at brace wrapping, not line wrap due to column limit
1686   EXPECT_EQ("foreach (int i, list) {\n"
1687             "  foo();\n"
1688             "}",
1689             format("foreach(int i, list){foo();}", Style));
1690   Style.ColumnLimit =
1691       20; // to concentrate at brace wrapping, not line wrap due to column limit
1692   EXPECT_EQ("while (foo || bar ||\n"
1693             "       baz)\n"
1694             "{\n"
1695             "  quux();\n"
1696             "}",
1697             format("while(foo||bar||baz){quux();}", Style));
1698   EXPECT_EQ("switch (\n"
1699             "    foo = barbaz)\n"
1700             "{\n"
1701             "case quux:\n"
1702             "  return;\n"
1703             "}",
1704             format("switch(foo=barbaz){case quux:return;}", Style));
1705   EXPECT_EQ("try {\n"
1706             "  foo();\n"
1707             "} catch (\n"
1708             "    Exception &bar)\n"
1709             "{\n"
1710             "  baz();\n"
1711             "}",
1712             format("try{foo();}catch(Exception&bar){baz();}", Style));
1713   Style.ColumnLimit =
1714       40; // to concentrate at brace wrapping, not line wrap due to column limit
1715   EXPECT_EQ("try {\n"
1716             "  foo();\n"
1717             "} catch (Exception &bar) {\n"
1718             "  baz();\n"
1719             "}",
1720             format("try{foo();}catch(Exception&bar){baz();}", Style));
1721   Style.ColumnLimit =
1722       20; // to concentrate at brace wrapping, not line wrap due to column limit
1723 
1724   Style.BraceWrapping.BeforeElse = true;
1725   EXPECT_EQ(
1726       "if (foo) {\n"
1727       "  bar();\n"
1728       "}\n"
1729       "else if (baz ||\n"
1730       "         quux)\n"
1731       "{\n"
1732       "  foobar();\n"
1733       "}\n"
1734       "else {\n"
1735       "  barbaz();\n"
1736       "}",
1737       format("if(foo){bar();}else if(baz||quux){foobar();}else{barbaz();}",
1738              Style));
1739 
1740   Style.BraceWrapping.BeforeCatch = true;
1741   EXPECT_EQ("try {\n"
1742             "  foo();\n"
1743             "}\n"
1744             "catch (...) {\n"
1745             "  baz();\n"
1746             "}",
1747             format("try{foo();}catch(...){baz();}", Style));
1748 }
1749 
1750 TEST_F(FormatTest, BeforeWhile) {
1751   FormatStyle Style = getLLVMStyle();
1752   Style.BreakBeforeBraces = FormatStyle::BraceBreakingStyle::BS_Custom;
1753 
1754   verifyFormat("do {\n"
1755                "  foo();\n"
1756                "} while (1);",
1757                Style);
1758   Style.BraceWrapping.BeforeWhile = true;
1759   verifyFormat("do {\n"
1760                "  foo();\n"
1761                "}\n"
1762                "while (1);",
1763                Style);
1764 }
1765 
1766 //===----------------------------------------------------------------------===//
1767 // Tests for classes, namespaces, etc.
1768 //===----------------------------------------------------------------------===//
1769 
1770 TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
1771   verifyFormat("class A {};");
1772 }
1773 
1774 TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1775   verifyFormat("class A {\n"
1776                "public:\n"
1777                "public: // comment\n"
1778                "protected:\n"
1779                "private:\n"
1780                "  void f() {}\n"
1781                "};");
1782   verifyFormat("export class A {\n"
1783                "public:\n"
1784                "public: // comment\n"
1785                "protected:\n"
1786                "private:\n"
1787                "  void f() {}\n"
1788                "};");
1789   verifyGoogleFormat("class A {\n"
1790                      " public:\n"
1791                      " protected:\n"
1792                      " private:\n"
1793                      "  void f() {}\n"
1794                      "};");
1795   verifyGoogleFormat("export class A {\n"
1796                      " public:\n"
1797                      " protected:\n"
1798                      " private:\n"
1799                      "  void f() {}\n"
1800                      "};");
1801   verifyFormat("class A {\n"
1802                "public slots:\n"
1803                "  void f1() {}\n"
1804                "public Q_SLOTS:\n"
1805                "  void f2() {}\n"
1806                "protected slots:\n"
1807                "  void f3() {}\n"
1808                "protected Q_SLOTS:\n"
1809                "  void f4() {}\n"
1810                "private slots:\n"
1811                "  void f5() {}\n"
1812                "private Q_SLOTS:\n"
1813                "  void f6() {}\n"
1814                "signals:\n"
1815                "  void g1();\n"
1816                "Q_SIGNALS:\n"
1817                "  void g2();\n"
1818                "};");
1819 
1820   // Don't interpret 'signals' the wrong way.
1821   verifyFormat("signals.set();");
1822   verifyFormat("for (Signals signals : f()) {\n}");
1823   verifyFormat("{\n"
1824                "  signals.set(); // This needs indentation.\n"
1825                "}");
1826   verifyFormat("void f() {\n"
1827                "label:\n"
1828                "  signals.baz();\n"
1829                "}");
1830 }
1831 
1832 TEST_F(FormatTest, SeparatesLogicalBlocks) {
1833   EXPECT_EQ("class A {\n"
1834             "public:\n"
1835             "  void f();\n"
1836             "\n"
1837             "private:\n"
1838             "  void g() {}\n"
1839             "  // test\n"
1840             "protected:\n"
1841             "  int h;\n"
1842             "};",
1843             format("class A {\n"
1844                    "public:\n"
1845                    "void f();\n"
1846                    "private:\n"
1847                    "void g() {}\n"
1848                    "// test\n"
1849                    "protected:\n"
1850                    "int h;\n"
1851                    "};"));
1852   EXPECT_EQ("class A {\n"
1853             "protected:\n"
1854             "public:\n"
1855             "  void f();\n"
1856             "};",
1857             format("class A {\n"
1858                    "protected:\n"
1859                    "\n"
1860                    "public:\n"
1861                    "\n"
1862                    "  void f();\n"
1863                    "};"));
1864 
1865   // Even ensure proper spacing inside macros.
1866   EXPECT_EQ("#define B     \\\n"
1867             "  class A {   \\\n"
1868             "   protected: \\\n"
1869             "   public:    \\\n"
1870             "    void f(); \\\n"
1871             "  };",
1872             format("#define B     \\\n"
1873                    "  class A {   \\\n"
1874                    "   protected: \\\n"
1875                    "              \\\n"
1876                    "   public:    \\\n"
1877                    "              \\\n"
1878                    "    void f(); \\\n"
1879                    "  };",
1880                    getGoogleStyle()));
1881   // But don't remove empty lines after macros ending in access specifiers.
1882   EXPECT_EQ("#define A private:\n"
1883             "\n"
1884             "int i;",
1885             format("#define A         private:\n"
1886                    "\n"
1887                    "int              i;"));
1888 }
1889 
1890 TEST_F(FormatTest, FormatsClasses) {
1891   verifyFormat("class A : public B {};");
1892   verifyFormat("class A : public ::B {};");
1893 
1894   verifyFormat(
1895       "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1896       "                             public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
1897   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1898                "    : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1899                "      public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
1900   verifyFormat(
1901       "class A : public B, public C, public D, public E, public F {};");
1902   verifyFormat("class AAAAAAAAAAAA : public B,\n"
1903                "                     public C,\n"
1904                "                     public D,\n"
1905                "                     public E,\n"
1906                "                     public F,\n"
1907                "                     public G {};");
1908 
1909   verifyFormat("class\n"
1910                "    ReallyReallyLongClassName {\n"
1911                "  int i;\n"
1912                "};",
1913                getLLVMStyleWithColumns(32));
1914   verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1915                "                           aaaaaaaaaaaaaaaa> {};");
1916   verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1917                "    : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1918                "                                 aaaaaaaaaaaaaaaaaaaaaa> {};");
1919   verifyFormat("template <class R, class C>\n"
1920                "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1921                "    : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
1922   verifyFormat("class ::A::B {};");
1923 }
1924 
1925 TEST_F(FormatTest, BreakInheritanceStyle) {
1926   FormatStyle StyleWithInheritanceBreakBeforeComma = getLLVMStyle();
1927   StyleWithInheritanceBreakBeforeComma.BreakInheritanceList =
1928       FormatStyle::BILS_BeforeComma;
1929   verifyFormat("class MyClass : public X {};",
1930                StyleWithInheritanceBreakBeforeComma);
1931   verifyFormat("class MyClass\n"
1932                "    : public X\n"
1933                "    , public Y {};",
1934                StyleWithInheritanceBreakBeforeComma);
1935   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA\n"
1936                "    : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n"
1937                "    , public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};",
1938                StyleWithInheritanceBreakBeforeComma);
1939   verifyFormat("struct aaaaaaaaaaaaa\n"
1940                "    : public aaaaaaaaaaaaaaaaaaa< // break\n"
1941                "          aaaaaaaaaaaaaaaa> {};",
1942                StyleWithInheritanceBreakBeforeComma);
1943 
1944   FormatStyle StyleWithInheritanceBreakAfterColon = getLLVMStyle();
1945   StyleWithInheritanceBreakAfterColon.BreakInheritanceList =
1946       FormatStyle::BILS_AfterColon;
1947   verifyFormat("class MyClass : public X {};",
1948                StyleWithInheritanceBreakAfterColon);
1949   verifyFormat("class MyClass : public X, public Y {};",
1950                StyleWithInheritanceBreakAfterColon);
1951   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA :\n"
1952                "    public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1953                "    public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};",
1954                StyleWithInheritanceBreakAfterColon);
1955   verifyFormat("struct aaaaaaaaaaaaa :\n"
1956                "    public aaaaaaaaaaaaaaaaaaa< // break\n"
1957                "        aaaaaaaaaaaaaaaa> {};",
1958                StyleWithInheritanceBreakAfterColon);
1959 }
1960 
1961 TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
1962   verifyFormat("class A {\n} a, b;");
1963   verifyFormat("struct A {\n} a, b;");
1964   verifyFormat("union A {\n} a;");
1965 }
1966 
1967 TEST_F(FormatTest, FormatsEnum) {
1968   verifyFormat("enum {\n"
1969                "  Zero,\n"
1970                "  One = 1,\n"
1971                "  Two = One + 1,\n"
1972                "  Three = (One + Two),\n"
1973                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1974                "  Five = (One, Two, Three, Four, 5)\n"
1975                "};");
1976   verifyGoogleFormat("enum {\n"
1977                      "  Zero,\n"
1978                      "  One = 1,\n"
1979                      "  Two = One + 1,\n"
1980                      "  Three = (One + Two),\n"
1981                      "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1982                      "  Five = (One, Two, Three, Four, 5)\n"
1983                      "};");
1984   verifyFormat("enum Enum {};");
1985   verifyFormat("enum {};");
1986   verifyFormat("enum X E {} d;");
1987   verifyFormat("enum __attribute__((...)) E {} d;");
1988   verifyFormat("enum __declspec__((...)) E {} d;");
1989   verifyFormat("enum {\n"
1990                "  Bar = Foo<int, int>::value\n"
1991                "};",
1992                getLLVMStyleWithColumns(30));
1993 
1994   verifyFormat("enum ShortEnum { A, B, C };");
1995   verifyGoogleFormat("enum ShortEnum { A, B, C };");
1996 
1997   EXPECT_EQ("enum KeepEmptyLines {\n"
1998             "  ONE,\n"
1999             "\n"
2000             "  TWO,\n"
2001             "\n"
2002             "  THREE\n"
2003             "}",
2004             format("enum KeepEmptyLines {\n"
2005                    "  ONE,\n"
2006                    "\n"
2007                    "  TWO,\n"
2008                    "\n"
2009                    "\n"
2010                    "  THREE\n"
2011                    "}"));
2012   verifyFormat("enum E { // comment\n"
2013                "  ONE,\n"
2014                "  TWO\n"
2015                "};\n"
2016                "int i;");
2017 
2018   FormatStyle EightIndent = getLLVMStyle();
2019   EightIndent.IndentWidth = 8;
2020   verifyFormat("enum {\n"
2021                "        VOID,\n"
2022                "        CHAR,\n"
2023                "        SHORT,\n"
2024                "        INT,\n"
2025                "        LONG,\n"
2026                "        SIGNED,\n"
2027                "        UNSIGNED,\n"
2028                "        BOOL,\n"
2029                "        FLOAT,\n"
2030                "        DOUBLE,\n"
2031                "        COMPLEX\n"
2032                "};",
2033                EightIndent);
2034 
2035   // Not enums.
2036   verifyFormat("enum X f() {\n"
2037                "  a();\n"
2038                "  return 42;\n"
2039                "}");
2040   verifyFormat("enum X Type::f() {\n"
2041                "  a();\n"
2042                "  return 42;\n"
2043                "}");
2044   verifyFormat("enum ::X f() {\n"
2045                "  a();\n"
2046                "  return 42;\n"
2047                "}");
2048   verifyFormat("enum ns::X f() {\n"
2049                "  a();\n"
2050                "  return 42;\n"
2051                "}");
2052 }
2053 
2054 TEST_F(FormatTest, FormatsEnumsWithErrors) {
2055   verifyFormat("enum Type {\n"
2056                "  One = 0; // These semicolons should be commas.\n"
2057                "  Two = 1;\n"
2058                "};");
2059   verifyFormat("namespace n {\n"
2060                "enum Type {\n"
2061                "  One,\n"
2062                "  Two, // missing };\n"
2063                "  int i;\n"
2064                "}\n"
2065                "void g() {}");
2066 }
2067 
2068 TEST_F(FormatTest, FormatsEnumStruct) {
2069   verifyFormat("enum struct {\n"
2070                "  Zero,\n"
2071                "  One = 1,\n"
2072                "  Two = One + 1,\n"
2073                "  Three = (One + Two),\n"
2074                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
2075                "  Five = (One, Two, Three, Four, 5)\n"
2076                "};");
2077   verifyFormat("enum struct Enum {};");
2078   verifyFormat("enum struct {};");
2079   verifyFormat("enum struct X E {} d;");
2080   verifyFormat("enum struct __attribute__((...)) E {} d;");
2081   verifyFormat("enum struct __declspec__((...)) E {} d;");
2082   verifyFormat("enum struct X f() {\n  a();\n  return 42;\n}");
2083 }
2084 
2085 TEST_F(FormatTest, FormatsEnumClass) {
2086   verifyFormat("enum class {\n"
2087                "  Zero,\n"
2088                "  One = 1,\n"
2089                "  Two = One + 1,\n"
2090                "  Three = (One + Two),\n"
2091                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
2092                "  Five = (One, Two, Three, Four, 5)\n"
2093                "};");
2094   verifyFormat("enum class Enum {};");
2095   verifyFormat("enum class {};");
2096   verifyFormat("enum class X E {} d;");
2097   verifyFormat("enum class __attribute__((...)) E {} d;");
2098   verifyFormat("enum class __declspec__((...)) E {} d;");
2099   verifyFormat("enum class X f() {\n  a();\n  return 42;\n}");
2100 }
2101 
2102 TEST_F(FormatTest, FormatsEnumTypes) {
2103   verifyFormat("enum X : int {\n"
2104                "  A, // Force multiple lines.\n"
2105                "  B\n"
2106                "};");
2107   verifyFormat("enum X : int { A, B };");
2108   verifyFormat("enum X : std::uint32_t { A, B };");
2109 }
2110 
2111 TEST_F(FormatTest, FormatsTypedefEnum) {
2112   FormatStyle Style = getLLVMStyle();
2113   Style.ColumnLimit = 40;
2114   verifyFormat("typedef enum {} EmptyEnum;");
2115   verifyFormat("typedef enum { A, B, C } ShortEnum;");
2116   verifyFormat("typedef enum {\n"
2117                "  ZERO = 0,\n"
2118                "  ONE = 1,\n"
2119                "  TWO = 2,\n"
2120                "  THREE = 3\n"
2121                "} LongEnum;",
2122                Style);
2123   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2124   Style.BraceWrapping.AfterEnum = true;
2125   verifyFormat("typedef enum {} EmptyEnum;");
2126   verifyFormat("typedef enum { A, B, C } ShortEnum;");
2127   verifyFormat("typedef enum\n"
2128                "{\n"
2129                "  ZERO = 0,\n"
2130                "  ONE = 1,\n"
2131                "  TWO = 2,\n"
2132                "  THREE = 3\n"
2133                "} LongEnum;",
2134                Style);
2135 }
2136 
2137 TEST_F(FormatTest, FormatsNSEnums) {
2138   verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
2139   verifyGoogleFormat(
2140       "typedef NS_CLOSED_ENUM(NSInteger, SomeName) { AAA, BBB }");
2141   verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
2142                      "  // Information about someDecentlyLongValue.\n"
2143                      "  someDecentlyLongValue,\n"
2144                      "  // Information about anotherDecentlyLongValue.\n"
2145                      "  anotherDecentlyLongValue,\n"
2146                      "  // Information about aThirdDecentlyLongValue.\n"
2147                      "  aThirdDecentlyLongValue\n"
2148                      "};");
2149   verifyGoogleFormat("typedef NS_CLOSED_ENUM(NSInteger, MyType) {\n"
2150                      "  // Information about someDecentlyLongValue.\n"
2151                      "  someDecentlyLongValue,\n"
2152                      "  // Information about anotherDecentlyLongValue.\n"
2153                      "  anotherDecentlyLongValue,\n"
2154                      "  // Information about aThirdDecentlyLongValue.\n"
2155                      "  aThirdDecentlyLongValue\n"
2156                      "};");
2157   verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
2158                      "  a = 1,\n"
2159                      "  b = 2,\n"
2160                      "  c = 3,\n"
2161                      "};");
2162   verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
2163                      "  a = 1,\n"
2164                      "  b = 2,\n"
2165                      "  c = 3,\n"
2166                      "};");
2167   verifyGoogleFormat("typedef CF_CLOSED_ENUM(NSInteger, MyType) {\n"
2168                      "  a = 1,\n"
2169                      "  b = 2,\n"
2170                      "  c = 3,\n"
2171                      "};");
2172   verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
2173                      "  a = 1,\n"
2174                      "  b = 2,\n"
2175                      "  c = 3,\n"
2176                      "};");
2177 }
2178 
2179 TEST_F(FormatTest, FormatsBitfields) {
2180   verifyFormat("struct Bitfields {\n"
2181                "  unsigned sClass : 8;\n"
2182                "  unsigned ValueKind : 2;\n"
2183                "};");
2184   verifyFormat("struct A {\n"
2185                "  int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
2186                "      bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
2187                "};");
2188   verifyFormat("struct MyStruct {\n"
2189                "  uchar data;\n"
2190                "  uchar : 8;\n"
2191                "  uchar : 8;\n"
2192                "  uchar other;\n"
2193                "};");
2194   FormatStyle Style = getLLVMStyle();
2195   Style.BitFieldColonSpacing = FormatStyle::BFCS_None;
2196   verifyFormat("struct Bitfields {\n"
2197                "  unsigned sClass:8;\n"
2198                "  unsigned ValueKind:2;\n"
2199                "  uchar other;\n"
2200                "};",
2201                Style);
2202   verifyFormat("struct A {\n"
2203                "  int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:1,\n"
2204                "      bbbbbbbbbbbbbbbbbbbbbbbbb:2;\n"
2205                "};",
2206                Style);
2207   Style.BitFieldColonSpacing = FormatStyle::BFCS_Before;
2208   verifyFormat("struct Bitfields {\n"
2209                "  unsigned sClass :8;\n"
2210                "  unsigned ValueKind :2;\n"
2211                "  uchar other;\n"
2212                "};",
2213                Style);
2214   Style.BitFieldColonSpacing = FormatStyle::BFCS_After;
2215   verifyFormat("struct Bitfields {\n"
2216                "  unsigned sClass: 8;\n"
2217                "  unsigned ValueKind: 2;\n"
2218                "  uchar other;\n"
2219                "};",
2220                Style);
2221 }
2222 
2223 TEST_F(FormatTest, FormatsNamespaces) {
2224   FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
2225   LLVMWithNoNamespaceFix.FixNamespaceComments = false;
2226 
2227   verifyFormat("namespace some_namespace {\n"
2228                "class A {};\n"
2229                "void f() { f(); }\n"
2230                "}",
2231                LLVMWithNoNamespaceFix);
2232   verifyFormat("namespace N::inline D {\n"
2233                "class A {};\n"
2234                "void f() { f(); }\n"
2235                "}",
2236                LLVMWithNoNamespaceFix);
2237   verifyFormat("namespace N::inline D::E {\n"
2238                "class A {};\n"
2239                "void f() { f(); }\n"
2240                "}",
2241                LLVMWithNoNamespaceFix);
2242   verifyFormat("namespace [[deprecated(\"foo[bar\")]] some_namespace {\n"
2243                "class A {};\n"
2244                "void f() { f(); }\n"
2245                "}",
2246                LLVMWithNoNamespaceFix);
2247   verifyFormat("/* something */ namespace some_namespace {\n"
2248                "class A {};\n"
2249                "void f() { f(); }\n"
2250                "}",
2251                LLVMWithNoNamespaceFix);
2252   verifyFormat("namespace {\n"
2253                "class A {};\n"
2254                "void f() { f(); }\n"
2255                "}",
2256                LLVMWithNoNamespaceFix);
2257   verifyFormat("/* something */ namespace {\n"
2258                "class A {};\n"
2259                "void f() { f(); }\n"
2260                "}",
2261                LLVMWithNoNamespaceFix);
2262   verifyFormat("inline namespace X {\n"
2263                "class A {};\n"
2264                "void f() { f(); }\n"
2265                "}",
2266                LLVMWithNoNamespaceFix);
2267   verifyFormat("/* something */ inline namespace X {\n"
2268                "class A {};\n"
2269                "void f() { f(); }\n"
2270                "}",
2271                LLVMWithNoNamespaceFix);
2272   verifyFormat("export namespace X {\n"
2273                "class A {};\n"
2274                "void f() { f(); }\n"
2275                "}",
2276                LLVMWithNoNamespaceFix);
2277   verifyFormat("using namespace some_namespace;\n"
2278                "class A {};\n"
2279                "void f() { f(); }",
2280                LLVMWithNoNamespaceFix);
2281 
2282   // This code is more common than we thought; if we
2283   // layout this correctly the semicolon will go into
2284   // its own line, which is undesirable.
2285   verifyFormat("namespace {};", LLVMWithNoNamespaceFix);
2286   verifyFormat("namespace {\n"
2287                "class A {};\n"
2288                "};",
2289                LLVMWithNoNamespaceFix);
2290 
2291   verifyFormat("namespace {\n"
2292                "int SomeVariable = 0; // comment\n"
2293                "} // namespace",
2294                LLVMWithNoNamespaceFix);
2295   EXPECT_EQ("#ifndef HEADER_GUARD\n"
2296             "#define HEADER_GUARD\n"
2297             "namespace my_namespace {\n"
2298             "int i;\n"
2299             "} // my_namespace\n"
2300             "#endif // HEADER_GUARD",
2301             format("#ifndef HEADER_GUARD\n"
2302                    " #define HEADER_GUARD\n"
2303                    "   namespace my_namespace {\n"
2304                    "int i;\n"
2305                    "}    // my_namespace\n"
2306                    "#endif    // HEADER_GUARD",
2307                    LLVMWithNoNamespaceFix));
2308 
2309   EXPECT_EQ("namespace A::B {\n"
2310             "class C {};\n"
2311             "}",
2312             format("namespace A::B {\n"
2313                    "class C {};\n"
2314                    "}",
2315                    LLVMWithNoNamespaceFix));
2316 
2317   FormatStyle Style = getLLVMStyle();
2318   Style.NamespaceIndentation = FormatStyle::NI_All;
2319   EXPECT_EQ("namespace out {\n"
2320             "  int i;\n"
2321             "  namespace in {\n"
2322             "    int i;\n"
2323             "  } // namespace in\n"
2324             "} // namespace out",
2325             format("namespace out {\n"
2326                    "int i;\n"
2327                    "namespace in {\n"
2328                    "int i;\n"
2329                    "} // namespace in\n"
2330                    "} // namespace out",
2331                    Style));
2332 
2333   Style.NamespaceIndentation = FormatStyle::NI_Inner;
2334   EXPECT_EQ("namespace out {\n"
2335             "int i;\n"
2336             "namespace in {\n"
2337             "  int i;\n"
2338             "} // namespace in\n"
2339             "} // namespace out",
2340             format("namespace out {\n"
2341                    "int i;\n"
2342                    "namespace in {\n"
2343                    "int i;\n"
2344                    "} // namespace in\n"
2345                    "} // namespace out",
2346                    Style));
2347 }
2348 
2349 TEST_F(FormatTest, NamespaceMacros) {
2350   FormatStyle Style = getLLVMStyle();
2351   Style.NamespaceMacros.push_back("TESTSUITE");
2352 
2353   verifyFormat("TESTSUITE(A) {\n"
2354                "int foo();\n"
2355                "} // TESTSUITE(A)",
2356                Style);
2357 
2358   verifyFormat("TESTSUITE(A, B) {\n"
2359                "int foo();\n"
2360                "} // TESTSUITE(A)",
2361                Style);
2362 
2363   // Properly indent according to NamespaceIndentation style
2364   Style.NamespaceIndentation = FormatStyle::NI_All;
2365   verifyFormat("TESTSUITE(A) {\n"
2366                "  int foo();\n"
2367                "} // TESTSUITE(A)",
2368                Style);
2369   verifyFormat("TESTSUITE(A) {\n"
2370                "  namespace B {\n"
2371                "    int foo();\n"
2372                "  } // namespace B\n"
2373                "} // TESTSUITE(A)",
2374                Style);
2375   verifyFormat("namespace A {\n"
2376                "  TESTSUITE(B) {\n"
2377                "    int foo();\n"
2378                "  } // TESTSUITE(B)\n"
2379                "} // namespace A",
2380                Style);
2381 
2382   Style.NamespaceIndentation = FormatStyle::NI_Inner;
2383   verifyFormat("TESTSUITE(A) {\n"
2384                "TESTSUITE(B) {\n"
2385                "  int foo();\n"
2386                "} // TESTSUITE(B)\n"
2387                "} // TESTSUITE(A)",
2388                Style);
2389   verifyFormat("TESTSUITE(A) {\n"
2390                "namespace B {\n"
2391                "  int foo();\n"
2392                "} // namespace B\n"
2393                "} // TESTSUITE(A)",
2394                Style);
2395   verifyFormat("namespace A {\n"
2396                "TESTSUITE(B) {\n"
2397                "  int foo();\n"
2398                "} // TESTSUITE(B)\n"
2399                "} // namespace A",
2400                Style);
2401 
2402   // Properly merge namespace-macros blocks in CompactNamespaces mode
2403   Style.NamespaceIndentation = FormatStyle::NI_None;
2404   Style.CompactNamespaces = true;
2405   verifyFormat("TESTSUITE(A) { TESTSUITE(B) {\n"
2406                "}} // TESTSUITE(A::B)",
2407                Style);
2408 
2409   EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n"
2410             "}} // TESTSUITE(out::in)",
2411             format("TESTSUITE(out) {\n"
2412                    "TESTSUITE(in) {\n"
2413                    "} // TESTSUITE(in)\n"
2414                    "} // TESTSUITE(out)",
2415                    Style));
2416 
2417   EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n"
2418             "}} // TESTSUITE(out::in)",
2419             format("TESTSUITE(out) {\n"
2420                    "TESTSUITE(in) {\n"
2421                    "} // TESTSUITE(in)\n"
2422                    "} // TESTSUITE(out)",
2423                    Style));
2424 
2425   // Do not merge different namespaces/macros
2426   EXPECT_EQ("namespace out {\n"
2427             "TESTSUITE(in) {\n"
2428             "} // TESTSUITE(in)\n"
2429             "} // namespace out",
2430             format("namespace out {\n"
2431                    "TESTSUITE(in) {\n"
2432                    "} // TESTSUITE(in)\n"
2433                    "} // namespace out",
2434                    Style));
2435   EXPECT_EQ("TESTSUITE(out) {\n"
2436             "namespace in {\n"
2437             "} // namespace in\n"
2438             "} // TESTSUITE(out)",
2439             format("TESTSUITE(out) {\n"
2440                    "namespace in {\n"
2441                    "} // namespace in\n"
2442                    "} // TESTSUITE(out)",
2443                    Style));
2444   Style.NamespaceMacros.push_back("FOOBAR");
2445   EXPECT_EQ("TESTSUITE(out) {\n"
2446             "FOOBAR(in) {\n"
2447             "} // FOOBAR(in)\n"
2448             "} // TESTSUITE(out)",
2449             format("TESTSUITE(out) {\n"
2450                    "FOOBAR(in) {\n"
2451                    "} // FOOBAR(in)\n"
2452                    "} // TESTSUITE(out)",
2453                    Style));
2454 }
2455 
2456 TEST_F(FormatTest, FormatsCompactNamespaces) {
2457   FormatStyle Style = getLLVMStyle();
2458   Style.CompactNamespaces = true;
2459   Style.NamespaceMacros.push_back("TESTSUITE");
2460 
2461   verifyFormat("namespace A { namespace B {\n"
2462                "}} // namespace A::B",
2463                Style);
2464 
2465   EXPECT_EQ("namespace out { namespace in {\n"
2466             "}} // namespace out::in",
2467             format("namespace out {\n"
2468                    "namespace in {\n"
2469                    "} // namespace in\n"
2470                    "} // namespace out",
2471                    Style));
2472 
2473   // Only namespaces which have both consecutive opening and end get compacted
2474   EXPECT_EQ("namespace out {\n"
2475             "namespace in1 {\n"
2476             "} // namespace in1\n"
2477             "namespace in2 {\n"
2478             "} // namespace in2\n"
2479             "} // namespace out",
2480             format("namespace out {\n"
2481                    "namespace in1 {\n"
2482                    "} // namespace in1\n"
2483                    "namespace in2 {\n"
2484                    "} // namespace in2\n"
2485                    "} // namespace out",
2486                    Style));
2487 
2488   EXPECT_EQ("namespace out {\n"
2489             "int i;\n"
2490             "namespace in {\n"
2491             "int j;\n"
2492             "} // namespace in\n"
2493             "int k;\n"
2494             "} // namespace out",
2495             format("namespace out { int i;\n"
2496                    "namespace in { int j; } // namespace in\n"
2497                    "int k; } // namespace out",
2498                    Style));
2499 
2500   EXPECT_EQ("namespace A { namespace B { namespace C {\n"
2501             "}}} // namespace A::B::C\n",
2502             format("namespace A { namespace B {\n"
2503                    "namespace C {\n"
2504                    "}} // namespace B::C\n"
2505                    "} // namespace A\n",
2506                    Style));
2507 
2508   Style.ColumnLimit = 40;
2509   EXPECT_EQ("namespace aaaaaaaaaa {\n"
2510             "namespace bbbbbbbbbb {\n"
2511             "}} // namespace aaaaaaaaaa::bbbbbbbbbb",
2512             format("namespace aaaaaaaaaa {\n"
2513                    "namespace bbbbbbbbbb {\n"
2514                    "} // namespace bbbbbbbbbb\n"
2515                    "} // namespace aaaaaaaaaa",
2516                    Style));
2517 
2518   EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n"
2519             "namespace cccccc {\n"
2520             "}}} // namespace aaaaaa::bbbbbb::cccccc",
2521             format("namespace aaaaaa {\n"
2522                    "namespace bbbbbb {\n"
2523                    "namespace cccccc {\n"
2524                    "} // namespace cccccc\n"
2525                    "} // namespace bbbbbb\n"
2526                    "} // namespace aaaaaa",
2527                    Style));
2528   Style.ColumnLimit = 80;
2529 
2530   // Extra semicolon after 'inner' closing brace prevents merging
2531   EXPECT_EQ("namespace out { namespace in {\n"
2532             "}; } // namespace out::in",
2533             format("namespace out {\n"
2534                    "namespace in {\n"
2535                    "}; // namespace in\n"
2536                    "} // namespace out",
2537                    Style));
2538 
2539   // Extra semicolon after 'outer' closing brace is conserved
2540   EXPECT_EQ("namespace out { namespace in {\n"
2541             "}}; // namespace out::in",
2542             format("namespace out {\n"
2543                    "namespace in {\n"
2544                    "} // namespace in\n"
2545                    "}; // namespace out",
2546                    Style));
2547 
2548   Style.NamespaceIndentation = FormatStyle::NI_All;
2549   EXPECT_EQ("namespace out { namespace in {\n"
2550             "  int i;\n"
2551             "}} // namespace out::in",
2552             format("namespace out {\n"
2553                    "namespace in {\n"
2554                    "int i;\n"
2555                    "} // namespace in\n"
2556                    "} // namespace out",
2557                    Style));
2558   EXPECT_EQ("namespace out { namespace mid {\n"
2559             "  namespace in {\n"
2560             "    int j;\n"
2561             "  } // namespace in\n"
2562             "  int k;\n"
2563             "}} // namespace out::mid",
2564             format("namespace out { namespace mid {\n"
2565                    "namespace in { int j; } // namespace in\n"
2566                    "int k; }} // namespace out::mid",
2567                    Style));
2568 
2569   Style.NamespaceIndentation = FormatStyle::NI_Inner;
2570   EXPECT_EQ("namespace out { namespace in {\n"
2571             "  int i;\n"
2572             "}} // namespace out::in",
2573             format("namespace out {\n"
2574                    "namespace in {\n"
2575                    "int i;\n"
2576                    "} // namespace in\n"
2577                    "} // namespace out",
2578                    Style));
2579   EXPECT_EQ("namespace out { namespace mid { namespace in {\n"
2580             "  int i;\n"
2581             "}}} // namespace out::mid::in",
2582             format("namespace out {\n"
2583                    "namespace mid {\n"
2584                    "namespace in {\n"
2585                    "int i;\n"
2586                    "} // namespace in\n"
2587                    "} // namespace mid\n"
2588                    "} // namespace out",
2589                    Style));
2590 }
2591 
2592 TEST_F(FormatTest, FormatsExternC) {
2593   verifyFormat("extern \"C\" {\nint a;");
2594   verifyFormat("extern \"C\" {}");
2595   verifyFormat("extern \"C\" {\n"
2596                "int foo();\n"
2597                "}");
2598   verifyFormat("extern \"C\" int foo() {}");
2599   verifyFormat("extern \"C\" int foo();");
2600   verifyFormat("extern \"C\" int foo() {\n"
2601                "  int i = 42;\n"
2602                "  return i;\n"
2603                "}");
2604 
2605   FormatStyle Style = getLLVMStyle();
2606   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2607   Style.BraceWrapping.AfterFunction = true;
2608   verifyFormat("extern \"C\" int foo() {}", Style);
2609   verifyFormat("extern \"C\" int foo();", Style);
2610   verifyFormat("extern \"C\" int foo()\n"
2611                "{\n"
2612                "  int i = 42;\n"
2613                "  return i;\n"
2614                "}",
2615                Style);
2616 
2617   Style.BraceWrapping.AfterExternBlock = true;
2618   Style.BraceWrapping.SplitEmptyRecord = false;
2619   verifyFormat("extern \"C\"\n"
2620                "{}",
2621                Style);
2622   verifyFormat("extern \"C\"\n"
2623                "{\n"
2624                "  int foo();\n"
2625                "}",
2626                Style);
2627 }
2628 
2629 TEST_F(FormatTest, IndentExternBlockStyle) {
2630   FormatStyle Style = getLLVMStyle();
2631   Style.IndentWidth = 2;
2632 
2633   Style.IndentExternBlock = FormatStyle::IEBS_Indent;
2634   verifyFormat("extern \"C\" { /*9*/\n}", Style);
2635   verifyFormat("extern \"C\" {\n"
2636                "  int foo10();\n"
2637                "}",
2638                Style);
2639 
2640   Style.IndentExternBlock = FormatStyle::IEBS_NoIndent;
2641   verifyFormat("extern \"C\" { /*11*/\n}", Style);
2642   verifyFormat("extern \"C\" {\n"
2643                "int foo12();\n"
2644                "}",
2645                Style);
2646 
2647   Style.IndentExternBlock = FormatStyle::IEBS_AfterExternBlock;
2648   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2649   Style.BraceWrapping.AfterExternBlock = true;
2650   verifyFormat("extern \"C\"\n{ /*13*/\n}", Style);
2651   verifyFormat("extern \"C\"\n{\n"
2652                "  int foo14();\n"
2653                "}",
2654                Style);
2655 
2656   Style.IndentExternBlock = FormatStyle::IEBS_AfterExternBlock;
2657   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2658   Style.BraceWrapping.AfterExternBlock = false;
2659   verifyFormat("extern \"C\" { /*15*/\n}", Style);
2660   verifyFormat("extern \"C\" {\n"
2661                "int foo16();\n"
2662                "}",
2663                Style);
2664 }
2665 
2666 TEST_F(FormatTest, FormatsInlineASM) {
2667   verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
2668   verifyFormat("asm(\"nop\" ::: \"memory\");");
2669   verifyFormat(
2670       "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
2671       "    \"cpuid\\n\\t\"\n"
2672       "    \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
2673       "    : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
2674       "    : \"a\"(value));");
2675   EXPECT_EQ(
2676       "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
2677       "  __asm {\n"
2678       "        mov     edx,[that] // vtable in edx\n"
2679       "        mov     eax,methodIndex\n"
2680       "        call    [edx][eax*4] // stdcall\n"
2681       "  }\n"
2682       "}",
2683       format("void NS_InvokeByIndex(void *that,   unsigned int methodIndex) {\n"
2684              "    __asm {\n"
2685              "        mov     edx,[that] // vtable in edx\n"
2686              "        mov     eax,methodIndex\n"
2687              "        call    [edx][eax*4] // stdcall\n"
2688              "    }\n"
2689              "}"));
2690   EXPECT_EQ("_asm {\n"
2691             "  xor eax, eax;\n"
2692             "  cpuid;\n"
2693             "}",
2694             format("_asm {\n"
2695                    "  xor eax, eax;\n"
2696                    "  cpuid;\n"
2697                    "}"));
2698   verifyFormat("void function() {\n"
2699                "  // comment\n"
2700                "  asm(\"\");\n"
2701                "}");
2702   EXPECT_EQ("__asm {\n"
2703             "}\n"
2704             "int i;",
2705             format("__asm   {\n"
2706                    "}\n"
2707                    "int   i;"));
2708 }
2709 
2710 TEST_F(FormatTest, FormatTryCatch) {
2711   verifyFormat("try {\n"
2712                "  throw a * b;\n"
2713                "} catch (int a) {\n"
2714                "  // Do nothing.\n"
2715                "} catch (...) {\n"
2716                "  exit(42);\n"
2717                "}");
2718 
2719   // Function-level try statements.
2720   verifyFormat("int f() try { return 4; } catch (...) {\n"
2721                "  return 5;\n"
2722                "}");
2723   verifyFormat("class A {\n"
2724                "  int a;\n"
2725                "  A() try : a(0) {\n"
2726                "  } catch (...) {\n"
2727                "    throw;\n"
2728                "  }\n"
2729                "};\n");
2730 
2731   // Incomplete try-catch blocks.
2732   verifyIncompleteFormat("try {} catch (");
2733 }
2734 
2735 TEST_F(FormatTest, FormatTryAsAVariable) {
2736   verifyFormat("int try;");
2737   verifyFormat("int try, size;");
2738   verifyFormat("try = foo();");
2739   verifyFormat("if (try < size) {\n  return true;\n}");
2740 
2741   verifyFormat("int catch;");
2742   verifyFormat("int catch, size;");
2743   verifyFormat("catch = foo();");
2744   verifyFormat("if (catch < size) {\n  return true;\n}");
2745 
2746   FormatStyle Style = getLLVMStyle();
2747   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2748   Style.BraceWrapping.AfterFunction = true;
2749   Style.BraceWrapping.BeforeCatch = true;
2750   verifyFormat("try {\n"
2751                "  int bar = 1;\n"
2752                "}\n"
2753                "catch (...) {\n"
2754                "  int bar = 1;\n"
2755                "}",
2756                Style);
2757   verifyFormat("#if NO_EX\n"
2758                "try\n"
2759                "#endif\n"
2760                "{\n"
2761                "}\n"
2762                "#if NO_EX\n"
2763                "catch (...) {\n"
2764                "}",
2765                Style);
2766   verifyFormat("try /* abc */ {\n"
2767                "  int bar = 1;\n"
2768                "}\n"
2769                "catch (...) {\n"
2770                "  int bar = 1;\n"
2771                "}",
2772                Style);
2773   verifyFormat("try\n"
2774                "// abc\n"
2775                "{\n"
2776                "  int bar = 1;\n"
2777                "}\n"
2778                "catch (...) {\n"
2779                "  int bar = 1;\n"
2780                "}",
2781                Style);
2782 }
2783 
2784 TEST_F(FormatTest, FormatSEHTryCatch) {
2785   verifyFormat("__try {\n"
2786                "  int a = b * c;\n"
2787                "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
2788                "  // Do nothing.\n"
2789                "}");
2790 
2791   verifyFormat("__try {\n"
2792                "  int a = b * c;\n"
2793                "} __finally {\n"
2794                "  // Do nothing.\n"
2795                "}");
2796 
2797   verifyFormat("DEBUG({\n"
2798                "  __try {\n"
2799                "  } __finally {\n"
2800                "  }\n"
2801                "});\n");
2802 }
2803 
2804 TEST_F(FormatTest, IncompleteTryCatchBlocks) {
2805   verifyFormat("try {\n"
2806                "  f();\n"
2807                "} catch {\n"
2808                "  g();\n"
2809                "}");
2810   verifyFormat("try {\n"
2811                "  f();\n"
2812                "} catch (A a) MACRO(x) {\n"
2813                "  g();\n"
2814                "} catch (B b) MACRO(x) {\n"
2815                "  g();\n"
2816                "}");
2817 }
2818 
2819 TEST_F(FormatTest, FormatTryCatchBraceStyles) {
2820   FormatStyle Style = getLLVMStyle();
2821   for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
2822                           FormatStyle::BS_WebKit}) {
2823     Style.BreakBeforeBraces = BraceStyle;
2824     verifyFormat("try {\n"
2825                  "  // something\n"
2826                  "} catch (...) {\n"
2827                  "  // something\n"
2828                  "}",
2829                  Style);
2830   }
2831   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
2832   verifyFormat("try {\n"
2833                "  // something\n"
2834                "}\n"
2835                "catch (...) {\n"
2836                "  // something\n"
2837                "}",
2838                Style);
2839   verifyFormat("__try {\n"
2840                "  // something\n"
2841                "}\n"
2842                "__finally {\n"
2843                "  // something\n"
2844                "}",
2845                Style);
2846   verifyFormat("@try {\n"
2847                "  // something\n"
2848                "}\n"
2849                "@finally {\n"
2850                "  // something\n"
2851                "}",
2852                Style);
2853   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2854   verifyFormat("try\n"
2855                "{\n"
2856                "  // something\n"
2857                "}\n"
2858                "catch (...)\n"
2859                "{\n"
2860                "  // something\n"
2861                "}",
2862                Style);
2863   Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths;
2864   verifyFormat("try\n"
2865                "  {\n"
2866                "  // something white\n"
2867                "  }\n"
2868                "catch (...)\n"
2869                "  {\n"
2870                "  // something white\n"
2871                "  }",
2872                Style);
2873   Style.BreakBeforeBraces = FormatStyle::BS_GNU;
2874   verifyFormat("try\n"
2875                "  {\n"
2876                "    // something\n"
2877                "  }\n"
2878                "catch (...)\n"
2879                "  {\n"
2880                "    // something\n"
2881                "  }",
2882                Style);
2883   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2884   Style.BraceWrapping.BeforeCatch = true;
2885   verifyFormat("try {\n"
2886                "  // something\n"
2887                "}\n"
2888                "catch (...) {\n"
2889                "  // something\n"
2890                "}",
2891                Style);
2892 }
2893 
2894 TEST_F(FormatTest, StaticInitializers) {
2895   verifyFormat("static SomeClass SC = {1, 'a'};");
2896 
2897   verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
2898                "    100000000, "
2899                "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
2900 
2901   // Here, everything other than the "}" would fit on a line.
2902   verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
2903                "    10000000000000000000000000};");
2904   EXPECT_EQ("S s = {a,\n"
2905             "\n"
2906             "       b};",
2907             format("S s = {\n"
2908                    "  a,\n"
2909                    "\n"
2910                    "  b\n"
2911                    "};"));
2912 
2913   // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
2914   // line. However, the formatting looks a bit off and this probably doesn't
2915   // happen often in practice.
2916   verifyFormat("static int Variable[1] = {\n"
2917                "    {1000000000000000000000000000000000000}};",
2918                getLLVMStyleWithColumns(40));
2919 }
2920 
2921 TEST_F(FormatTest, DesignatedInitializers) {
2922   verifyFormat("const struct A a = {.a = 1, .b = 2};");
2923   verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
2924                "                    .bbbbbbbbbb = 2,\n"
2925                "                    .cccccccccc = 3,\n"
2926                "                    .dddddddddd = 4,\n"
2927                "                    .eeeeeeeeee = 5};");
2928   verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
2929                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
2930                "    .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
2931                "    .ccccccccccccccccccccccccccc = 3,\n"
2932                "    .ddddddddddddddddddddddddddd = 4,\n"
2933                "    .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
2934 
2935   verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
2936 
2937   verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
2938   verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n"
2939                "                    [2] = bbbbbbbbbb,\n"
2940                "                    [3] = cccccccccc,\n"
2941                "                    [4] = dddddddddd,\n"
2942                "                    [5] = eeeeeeeeee};");
2943   verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
2944                "    [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2945                "    [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2946                "    [3] = cccccccccccccccccccccccccccccccccccccc,\n"
2947                "    [4] = dddddddddddddddddddddddddddddddddddddd,\n"
2948                "    [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};");
2949 }
2950 
2951 TEST_F(FormatTest, NestedStaticInitializers) {
2952   verifyFormat("static A x = {{{}}};\n");
2953   verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
2954                "               {init1, init2, init3, init4}}};",
2955                getLLVMStyleWithColumns(50));
2956 
2957   verifyFormat("somes Status::global_reps[3] = {\n"
2958                "    {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2959                "    {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2960                "    {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
2961                getLLVMStyleWithColumns(60));
2962   verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
2963                      "    {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2964                      "    {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2965                      "    {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
2966   verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
2967                "                  {rect.fRight - rect.fLeft, rect.fBottom - "
2968                "rect.fTop}};");
2969 
2970   verifyFormat(
2971       "SomeArrayOfSomeType a = {\n"
2972       "    {{1, 2, 3},\n"
2973       "     {1, 2, 3},\n"
2974       "     {111111111111111111111111111111, 222222222222222222222222222222,\n"
2975       "      333333333333333333333333333333},\n"
2976       "     {1, 2, 3},\n"
2977       "     {1, 2, 3}}};");
2978   verifyFormat(
2979       "SomeArrayOfSomeType a = {\n"
2980       "    {{1, 2, 3}},\n"
2981       "    {{1, 2, 3}},\n"
2982       "    {{111111111111111111111111111111, 222222222222222222222222222222,\n"
2983       "      333333333333333333333333333333}},\n"
2984       "    {{1, 2, 3}},\n"
2985       "    {{1, 2, 3}}};");
2986 
2987   verifyFormat("struct {\n"
2988                "  unsigned bit;\n"
2989                "  const char *const name;\n"
2990                "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
2991                "                 {kOsWin, \"Windows\"},\n"
2992                "                 {kOsLinux, \"Linux\"},\n"
2993                "                 {kOsCrOS, \"Chrome OS\"}};");
2994   verifyFormat("struct {\n"
2995                "  unsigned bit;\n"
2996                "  const char *const name;\n"
2997                "} kBitsToOs[] = {\n"
2998                "    {kOsMac, \"Mac\"},\n"
2999                "    {kOsWin, \"Windows\"},\n"
3000                "    {kOsLinux, \"Linux\"},\n"
3001                "    {kOsCrOS, \"Chrome OS\"},\n"
3002                "};");
3003 }
3004 
3005 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
3006   verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3007                "                      \\\n"
3008                "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
3009 }
3010 
3011 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
3012   verifyFormat("virtual void write(ELFWriter *writerrr,\n"
3013                "                   OwningPtr<FileOutputBuffer> &buffer) = 0;");
3014 
3015   // Do break defaulted and deleted functions.
3016   verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
3017                "    default;",
3018                getLLVMStyleWithColumns(40));
3019   verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
3020                "    delete;",
3021                getLLVMStyleWithColumns(40));
3022 }
3023 
3024 TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
3025   verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
3026                getLLVMStyleWithColumns(40));
3027   verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
3028                getLLVMStyleWithColumns(40));
3029   EXPECT_EQ("#define Q                              \\\n"
3030             "  \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\"    \\\n"
3031             "  \"aaaaaaaa.cpp\"",
3032             format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
3033                    getLLVMStyleWithColumns(40)));
3034 }
3035 
3036 TEST_F(FormatTest, UnderstandsLinePPDirective) {
3037   EXPECT_EQ("# 123 \"A string literal\"",
3038             format("   #     123    \"A string literal\""));
3039 }
3040 
3041 TEST_F(FormatTest, LayoutUnknownPPDirective) {
3042   EXPECT_EQ("#;", format("#;"));
3043   verifyFormat("#\n;\n;\n;");
3044 }
3045 
3046 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
3047   EXPECT_EQ("#line 42 \"test\"\n",
3048             format("#  \\\n  line  \\\n  42  \\\n  \"test\"\n"));
3049   EXPECT_EQ("#define A B\n", format("#  \\\n define  \\\n    A  \\\n       B\n",
3050                                     getLLVMStyleWithColumns(12)));
3051 }
3052 
3053 TEST_F(FormatTest, EndOfFileEndsPPDirective) {
3054   EXPECT_EQ("#line 42 \"test\"",
3055             format("#  \\\n  line  \\\n  42  \\\n  \"test\""));
3056   EXPECT_EQ("#define A B", format("#  \\\n define  \\\n    A  \\\n       B"));
3057 }
3058 
3059 TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
3060   verifyFormat("#define A \\x20");
3061   verifyFormat("#define A \\ x20");
3062   EXPECT_EQ("#define A \\ x20", format("#define A \\   x20"));
3063   verifyFormat("#define A ''");
3064   verifyFormat("#define A ''qqq");
3065   verifyFormat("#define A `qqq");
3066   verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
3067   EXPECT_EQ("const char *c = STRINGIFY(\n"
3068             "\\na : b);",
3069             format("const char * c = STRINGIFY(\n"
3070                    "\\na : b);"));
3071 
3072   verifyFormat("a\r\\");
3073   verifyFormat("a\v\\");
3074   verifyFormat("a\f\\");
3075 }
3076 
3077 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
3078   verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
3079   verifyFormat("#define A( \\\n    BB)", getLLVMStyleWithColumns(12));
3080   verifyFormat("#define A( \\\n    A, B)", getLLVMStyleWithColumns(12));
3081   // FIXME: We never break before the macro name.
3082   verifyFormat("#define AA( \\\n    B)", getLLVMStyleWithColumns(12));
3083 
3084   verifyFormat("#define A A\n#define A A");
3085   verifyFormat("#define A(X) A\n#define A A");
3086 
3087   verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
3088   verifyFormat("#define Something    \\\n  Other", getLLVMStyleWithColumns(22));
3089 }
3090 
3091 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
3092   EXPECT_EQ("// somecomment\n"
3093             "#include \"a.h\"\n"
3094             "#define A(  \\\n"
3095             "    A, B)\n"
3096             "#include \"b.h\"\n"
3097             "// somecomment\n",
3098             format("  // somecomment\n"
3099                    "  #include \"a.h\"\n"
3100                    "#define A(A,\\\n"
3101                    "    B)\n"
3102                    "    #include \"b.h\"\n"
3103                    " // somecomment\n",
3104                    getLLVMStyleWithColumns(13)));
3105 }
3106 
3107 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
3108 
3109 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
3110   EXPECT_EQ("#define A    \\\n"
3111             "  c;         \\\n"
3112             "  e;\n"
3113             "f;",
3114             format("#define A c; e;\n"
3115                    "f;",
3116                    getLLVMStyleWithColumns(14)));
3117 }
3118 
3119 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
3120 
3121 TEST_F(FormatTest, MacroDefinitionInsideStatement) {
3122   EXPECT_EQ("int x,\n"
3123             "#define A\n"
3124             "    y;",
3125             format("int x,\n#define A\ny;"));
3126 }
3127 
3128 TEST_F(FormatTest, HashInMacroDefinition) {
3129   EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
3130   verifyFormat("#define A \\\n  b #c;", getLLVMStyleWithColumns(11));
3131   verifyFormat("#define A  \\\n"
3132                "  {        \\\n"
3133                "    f(#c); \\\n"
3134                "  }",
3135                getLLVMStyleWithColumns(11));
3136 
3137   verifyFormat("#define A(X)         \\\n"
3138                "  void function##X()",
3139                getLLVMStyleWithColumns(22));
3140 
3141   verifyFormat("#define A(a, b, c)   \\\n"
3142                "  void a##b##c()",
3143                getLLVMStyleWithColumns(22));
3144 
3145   verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
3146 }
3147 
3148 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
3149   EXPECT_EQ("#define A (x)", format("#define A (x)"));
3150   EXPECT_EQ("#define A(x)", format("#define A(x)"));
3151 
3152   FormatStyle Style = getLLVMStyle();
3153   Style.SpaceBeforeParens = FormatStyle::SBPO_Never;
3154   verifyFormat("#define true ((foo)1)", Style);
3155   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
3156   verifyFormat("#define false((foo)0)", Style);
3157 }
3158 
3159 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
3160   EXPECT_EQ("#define A b;", format("#define A \\\n"
3161                                    "          \\\n"
3162                                    "  b;",
3163                                    getLLVMStyleWithColumns(25)));
3164   EXPECT_EQ("#define A \\\n"
3165             "          \\\n"
3166             "  a;      \\\n"
3167             "  b;",
3168             format("#define A \\\n"
3169                    "          \\\n"
3170                    "  a;      \\\n"
3171                    "  b;",
3172                    getLLVMStyleWithColumns(11)));
3173   EXPECT_EQ("#define A \\\n"
3174             "  a;      \\\n"
3175             "          \\\n"
3176             "  b;",
3177             format("#define A \\\n"
3178                    "  a;      \\\n"
3179                    "          \\\n"
3180                    "  b;",
3181                    getLLVMStyleWithColumns(11)));
3182 }
3183 
3184 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
3185   verifyIncompleteFormat("#define A :");
3186   verifyFormat("#define SOMECASES  \\\n"
3187                "  case 1:          \\\n"
3188                "  case 2\n",
3189                getLLVMStyleWithColumns(20));
3190   verifyFormat("#define MACRO(a) \\\n"
3191                "  if (a)         \\\n"
3192                "    f();         \\\n"
3193                "  else           \\\n"
3194                "    g()",
3195                getLLVMStyleWithColumns(18));
3196   verifyFormat("#define A template <typename T>");
3197   verifyIncompleteFormat("#define STR(x) #x\n"
3198                          "f(STR(this_is_a_string_literal{));");
3199   verifyFormat("#pragma omp threadprivate( \\\n"
3200                "    y)), // expected-warning",
3201                getLLVMStyleWithColumns(28));
3202   verifyFormat("#d, = };");
3203   verifyFormat("#if \"a");
3204   verifyIncompleteFormat("({\n"
3205                          "#define b     \\\n"
3206                          "  }           \\\n"
3207                          "  a\n"
3208                          "a",
3209                          getLLVMStyleWithColumns(15));
3210   verifyFormat("#define A     \\\n"
3211                "  {           \\\n"
3212                "    {\n"
3213                "#define B     \\\n"
3214                "  }           \\\n"
3215                "  }",
3216                getLLVMStyleWithColumns(15));
3217   verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
3218   verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
3219   verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
3220   verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() {      \n)}");
3221 }
3222 
3223 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
3224   verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
3225   EXPECT_EQ("class A : public QObject {\n"
3226             "  Q_OBJECT\n"
3227             "\n"
3228             "  A() {}\n"
3229             "};",
3230             format("class A  :  public QObject {\n"
3231                    "     Q_OBJECT\n"
3232                    "\n"
3233                    "  A() {\n}\n"
3234                    "}  ;"));
3235   EXPECT_EQ("MACRO\n"
3236             "/*static*/ int i;",
3237             format("MACRO\n"
3238                    " /*static*/ int   i;"));
3239   EXPECT_EQ("SOME_MACRO\n"
3240             "namespace {\n"
3241             "void f();\n"
3242             "} // namespace",
3243             format("SOME_MACRO\n"
3244                    "  namespace    {\n"
3245                    "void   f(  );\n"
3246                    "} // namespace"));
3247   // Only if the identifier contains at least 5 characters.
3248   EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
3249   EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
3250   // Only if everything is upper case.
3251   EXPECT_EQ("class A : public QObject {\n"
3252             "  Q_Object A() {}\n"
3253             "};",
3254             format("class A  :  public QObject {\n"
3255                    "     Q_Object\n"
3256                    "  A() {\n}\n"
3257                    "}  ;"));
3258 
3259   // Only if the next line can actually start an unwrapped line.
3260   EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
3261             format("SOME_WEIRD_LOG_MACRO\n"
3262                    "<< SomeThing;"));
3263 
3264   verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
3265                "(n, buffers))\n",
3266                getChromiumStyle(FormatStyle::LK_Cpp));
3267 
3268   // See PR41483
3269   EXPECT_EQ("/**/ FOO(a)\n"
3270             "FOO(b)",
3271             format("/**/ FOO(a)\n"
3272                    "FOO(b)"));
3273 }
3274 
3275 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
3276   EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3277             "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3278             "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
3279             "class X {};\n"
3280             "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3281             "int *createScopDetectionPass() { return 0; }",
3282             format("  INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3283                    "  INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3284                    "  INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
3285                    "  class X {};\n"
3286                    "  INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3287                    "  int *createScopDetectionPass() { return 0; }"));
3288   // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
3289   // braces, so that inner block is indented one level more.
3290   EXPECT_EQ("int q() {\n"
3291             "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3292             "  IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3293             "  IPC_END_MESSAGE_MAP()\n"
3294             "}",
3295             format("int q() {\n"
3296                    "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3297                    "    IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3298                    "  IPC_END_MESSAGE_MAP()\n"
3299                    "}"));
3300 
3301   // Same inside macros.
3302   EXPECT_EQ("#define LIST(L) \\\n"
3303             "  L(A)          \\\n"
3304             "  L(B)          \\\n"
3305             "  L(C)",
3306             format("#define LIST(L) \\\n"
3307                    "  L(A) \\\n"
3308                    "  L(B) \\\n"
3309                    "  L(C)",
3310                    getGoogleStyle()));
3311 
3312   // These must not be recognized as macros.
3313   EXPECT_EQ("int q() {\n"
3314             "  f(x);\n"
3315             "  f(x) {}\n"
3316             "  f(x)->g();\n"
3317             "  f(x)->*g();\n"
3318             "  f(x).g();\n"
3319             "  f(x) = x;\n"
3320             "  f(x) += x;\n"
3321             "  f(x) -= x;\n"
3322             "  f(x) *= x;\n"
3323             "  f(x) /= x;\n"
3324             "  f(x) %= x;\n"
3325             "  f(x) &= x;\n"
3326             "  f(x) |= x;\n"
3327             "  f(x) ^= x;\n"
3328             "  f(x) >>= x;\n"
3329             "  f(x) <<= x;\n"
3330             "  f(x)[y].z();\n"
3331             "  LOG(INFO) << x;\n"
3332             "  ifstream(x) >> x;\n"
3333             "}\n",
3334             format("int q() {\n"
3335                    "  f(x)\n;\n"
3336                    "  f(x)\n {}\n"
3337                    "  f(x)\n->g();\n"
3338                    "  f(x)\n->*g();\n"
3339                    "  f(x)\n.g();\n"
3340                    "  f(x)\n = x;\n"
3341                    "  f(x)\n += x;\n"
3342                    "  f(x)\n -= x;\n"
3343                    "  f(x)\n *= x;\n"
3344                    "  f(x)\n /= x;\n"
3345                    "  f(x)\n %= x;\n"
3346                    "  f(x)\n &= x;\n"
3347                    "  f(x)\n |= x;\n"
3348                    "  f(x)\n ^= x;\n"
3349                    "  f(x)\n >>= x;\n"
3350                    "  f(x)\n <<= x;\n"
3351                    "  f(x)\n[y].z();\n"
3352                    "  LOG(INFO)\n << x;\n"
3353                    "  ifstream(x)\n >> x;\n"
3354                    "}\n"));
3355   EXPECT_EQ("int q() {\n"
3356             "  F(x)\n"
3357             "  if (1) {\n"
3358             "  }\n"
3359             "  F(x)\n"
3360             "  while (1) {\n"
3361             "  }\n"
3362             "  F(x)\n"
3363             "  G(x);\n"
3364             "  F(x)\n"
3365             "  try {\n"
3366             "    Q();\n"
3367             "  } catch (...) {\n"
3368             "  }\n"
3369             "}\n",
3370             format("int q() {\n"
3371                    "F(x)\n"
3372                    "if (1) {}\n"
3373                    "F(x)\n"
3374                    "while (1) {}\n"
3375                    "F(x)\n"
3376                    "G(x);\n"
3377                    "F(x)\n"
3378                    "try { Q(); } catch (...) {}\n"
3379                    "}\n"));
3380   EXPECT_EQ("class A {\n"
3381             "  A() : t(0) {}\n"
3382             "  A(int i) noexcept() : {}\n"
3383             "  A(X x)\n" // FIXME: function-level try blocks are broken.
3384             "  try : t(0) {\n"
3385             "  } catch (...) {\n"
3386             "  }\n"
3387             "};",
3388             format("class A {\n"
3389                    "  A()\n : t(0) {}\n"
3390                    "  A(int i)\n noexcept() : {}\n"
3391                    "  A(X x)\n"
3392                    "  try : t(0) {} catch (...) {}\n"
3393                    "};"));
3394   FormatStyle Style = getLLVMStyle();
3395   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
3396   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always;
3397   Style.BraceWrapping.AfterFunction = true;
3398   EXPECT_EQ("void f()\n"
3399             "try\n"
3400             "{\n"
3401             "}",
3402             format("void f() try {\n"
3403                    "}",
3404                    Style));
3405   EXPECT_EQ("class SomeClass {\n"
3406             "public:\n"
3407             "  SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3408             "};",
3409             format("class SomeClass {\n"
3410                    "public:\n"
3411                    "  SomeClass()\n"
3412                    "  EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3413                    "};"));
3414   EXPECT_EQ("class SomeClass {\n"
3415             "public:\n"
3416             "  SomeClass()\n"
3417             "      EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3418             "};",
3419             format("class SomeClass {\n"
3420                    "public:\n"
3421                    "  SomeClass()\n"
3422                    "  EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3423                    "};",
3424                    getLLVMStyleWithColumns(40)));
3425 
3426   verifyFormat("MACRO(>)");
3427 
3428   // Some macros contain an implicit semicolon.
3429   Style = getLLVMStyle();
3430   Style.StatementMacros.push_back("FOO");
3431   verifyFormat("FOO(a) int b = 0;");
3432   verifyFormat("FOO(a)\n"
3433                "int b = 0;",
3434                Style);
3435   verifyFormat("FOO(a);\n"
3436                "int b = 0;",
3437                Style);
3438   verifyFormat("FOO(argc, argv, \"4.0.2\")\n"
3439                "int b = 0;",
3440                Style);
3441   verifyFormat("FOO()\n"
3442                "int b = 0;",
3443                Style);
3444   verifyFormat("FOO\n"
3445                "int b = 0;",
3446                Style);
3447   verifyFormat("void f() {\n"
3448                "  FOO(a)\n"
3449                "  return a;\n"
3450                "}",
3451                Style);
3452   verifyFormat("FOO(a)\n"
3453                "FOO(b)",
3454                Style);
3455   verifyFormat("int a = 0;\n"
3456                "FOO(b)\n"
3457                "int c = 0;",
3458                Style);
3459   verifyFormat("int a = 0;\n"
3460                "int x = FOO(a)\n"
3461                "int b = 0;",
3462                Style);
3463   verifyFormat("void foo(int a) { FOO(a) }\n"
3464                "uint32_t bar() {}",
3465                Style);
3466 }
3467 
3468 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
3469   verifyFormat("#define A \\\n"
3470                "  f({     \\\n"
3471                "    g();  \\\n"
3472                "  });",
3473                getLLVMStyleWithColumns(11));
3474 }
3475 
3476 TEST_F(FormatTest, IndentPreprocessorDirectives) {
3477   FormatStyle Style = getLLVMStyle();
3478   Style.IndentPPDirectives = FormatStyle::PPDIS_None;
3479   Style.ColumnLimit = 40;
3480   verifyFormat("#ifdef _WIN32\n"
3481                "#define A 0\n"
3482                "#ifdef VAR2\n"
3483                "#define B 1\n"
3484                "#include <someheader.h>\n"
3485                "#define MACRO                          \\\n"
3486                "  some_very_long_func_aaaaaaaaaa();\n"
3487                "#endif\n"
3488                "#else\n"
3489                "#define A 1\n"
3490                "#endif",
3491                Style);
3492   Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash;
3493   verifyFormat("#ifdef _WIN32\n"
3494                "#  define A 0\n"
3495                "#  ifdef VAR2\n"
3496                "#    define B 1\n"
3497                "#    include <someheader.h>\n"
3498                "#    define MACRO                      \\\n"
3499                "      some_very_long_func_aaaaaaaaaa();\n"
3500                "#  endif\n"
3501                "#else\n"
3502                "#  define A 1\n"
3503                "#endif",
3504                Style);
3505   verifyFormat("#if A\n"
3506                "#  define MACRO                        \\\n"
3507                "    void a(int x) {                    \\\n"
3508                "      b();                             \\\n"
3509                "      c();                             \\\n"
3510                "      d();                             \\\n"
3511                "      e();                             \\\n"
3512                "      f();                             \\\n"
3513                "    }\n"
3514                "#endif",
3515                Style);
3516   // Comments before include guard.
3517   verifyFormat("// file comment\n"
3518                "// file comment\n"
3519                "#ifndef HEADER_H\n"
3520                "#define HEADER_H\n"
3521                "code();\n"
3522                "#endif",
3523                Style);
3524   // Test with include guards.
3525   verifyFormat("#ifndef HEADER_H\n"
3526                "#define HEADER_H\n"
3527                "code();\n"
3528                "#endif",
3529                Style);
3530   // Include guards must have a #define with the same variable immediately
3531   // after #ifndef.
3532   verifyFormat("#ifndef NOT_GUARD\n"
3533                "#  define FOO\n"
3534                "code();\n"
3535                "#endif",
3536                Style);
3537 
3538   // Include guards must cover the entire file.
3539   verifyFormat("code();\n"
3540                "code();\n"
3541                "#ifndef NOT_GUARD\n"
3542                "#  define NOT_GUARD\n"
3543                "code();\n"
3544                "#endif",
3545                Style);
3546   verifyFormat("#ifndef NOT_GUARD\n"
3547                "#  define NOT_GUARD\n"
3548                "code();\n"
3549                "#endif\n"
3550                "code();",
3551                Style);
3552   // Test with trailing blank lines.
3553   verifyFormat("#ifndef HEADER_H\n"
3554                "#define HEADER_H\n"
3555                "code();\n"
3556                "#endif\n",
3557                Style);
3558   // Include guards don't have #else.
3559   verifyFormat("#ifndef NOT_GUARD\n"
3560                "#  define NOT_GUARD\n"
3561                "code();\n"
3562                "#else\n"
3563                "#endif",
3564                Style);
3565   verifyFormat("#ifndef NOT_GUARD\n"
3566                "#  define NOT_GUARD\n"
3567                "code();\n"
3568                "#elif FOO\n"
3569                "#endif",
3570                Style);
3571   // Non-identifier #define after potential include guard.
3572   verifyFormat("#ifndef FOO\n"
3573                "#  define 1\n"
3574                "#endif\n",
3575                Style);
3576   // #if closes past last non-preprocessor line.
3577   verifyFormat("#ifndef FOO\n"
3578                "#define FOO\n"
3579                "#if 1\n"
3580                "int i;\n"
3581                "#  define A 0\n"
3582                "#endif\n"
3583                "#endif\n",
3584                Style);
3585   // Don't crash if there is an #elif directive without a condition.
3586   verifyFormat("#if 1\n"
3587                "int x;\n"
3588                "#elif\n"
3589                "int y;\n"
3590                "#else\n"
3591                "int z;\n"
3592                "#endif",
3593                Style);
3594   // FIXME: This doesn't handle the case where there's code between the
3595   // #ifndef and #define but all other conditions hold. This is because when
3596   // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the
3597   // previous code line yet, so we can't detect it.
3598   EXPECT_EQ("#ifndef NOT_GUARD\n"
3599             "code();\n"
3600             "#define NOT_GUARD\n"
3601             "code();\n"
3602             "#endif",
3603             format("#ifndef NOT_GUARD\n"
3604                    "code();\n"
3605                    "#  define NOT_GUARD\n"
3606                    "code();\n"
3607                    "#endif",
3608                    Style));
3609   // FIXME: This doesn't handle cases where legitimate preprocessor lines may
3610   // be outside an include guard. Examples are #pragma once and
3611   // #pragma GCC diagnostic, or anything else that does not change the meaning
3612   // of the file if it's included multiple times.
3613   EXPECT_EQ("#ifdef WIN32\n"
3614             "#  pragma once\n"
3615             "#endif\n"
3616             "#ifndef HEADER_H\n"
3617             "#  define HEADER_H\n"
3618             "code();\n"
3619             "#endif",
3620             format("#ifdef WIN32\n"
3621                    "#  pragma once\n"
3622                    "#endif\n"
3623                    "#ifndef HEADER_H\n"
3624                    "#define HEADER_H\n"
3625                    "code();\n"
3626                    "#endif",
3627                    Style));
3628   // FIXME: This does not detect when there is a single non-preprocessor line
3629   // in front of an include-guard-like structure where other conditions hold
3630   // because ScopedLineState hides the line.
3631   EXPECT_EQ("code();\n"
3632             "#ifndef HEADER_H\n"
3633             "#define HEADER_H\n"
3634             "code();\n"
3635             "#endif",
3636             format("code();\n"
3637                    "#ifndef HEADER_H\n"
3638                    "#  define HEADER_H\n"
3639                    "code();\n"
3640                    "#endif",
3641                    Style));
3642   // Keep comments aligned with #, otherwise indent comments normally. These
3643   // tests cannot use verifyFormat because messUp manipulates leading
3644   // whitespace.
3645   {
3646     const char *Expected = ""
3647                            "void f() {\n"
3648                            "#if 1\n"
3649                            "// Preprocessor aligned.\n"
3650                            "#  define A 0\n"
3651                            "  // Code. Separated by blank line.\n"
3652                            "\n"
3653                            "#  define B 0\n"
3654                            "  // Code. Not aligned with #\n"
3655                            "#  define C 0\n"
3656                            "#endif";
3657     const char *ToFormat = ""
3658                            "void f() {\n"
3659                            "#if 1\n"
3660                            "// Preprocessor aligned.\n"
3661                            "#  define A 0\n"
3662                            "// Code. Separated by blank line.\n"
3663                            "\n"
3664                            "#  define B 0\n"
3665                            "   // Code. Not aligned with #\n"
3666                            "#  define C 0\n"
3667                            "#endif";
3668     EXPECT_EQ(Expected, format(ToFormat, Style));
3669     EXPECT_EQ(Expected, format(Expected, Style));
3670   }
3671   // Keep block quotes aligned.
3672   {
3673     const char *Expected = ""
3674                            "void f() {\n"
3675                            "#if 1\n"
3676                            "/* Preprocessor aligned. */\n"
3677                            "#  define A 0\n"
3678                            "  /* Code. Separated by blank line. */\n"
3679                            "\n"
3680                            "#  define B 0\n"
3681                            "  /* Code. Not aligned with # */\n"
3682                            "#  define C 0\n"
3683                            "#endif";
3684     const char *ToFormat = ""
3685                            "void f() {\n"
3686                            "#if 1\n"
3687                            "/* Preprocessor aligned. */\n"
3688                            "#  define A 0\n"
3689                            "/* Code. Separated by blank line. */\n"
3690                            "\n"
3691                            "#  define B 0\n"
3692                            "   /* Code. Not aligned with # */\n"
3693                            "#  define C 0\n"
3694                            "#endif";
3695     EXPECT_EQ(Expected, format(ToFormat, Style));
3696     EXPECT_EQ(Expected, format(Expected, Style));
3697   }
3698   // Keep comments aligned with un-indented directives.
3699   {
3700     const char *Expected = ""
3701                            "void f() {\n"
3702                            "// Preprocessor aligned.\n"
3703                            "#define A 0\n"
3704                            "  // Code. Separated by blank line.\n"
3705                            "\n"
3706                            "#define B 0\n"
3707                            "  // Code. Not aligned with #\n"
3708                            "#define C 0\n";
3709     const char *ToFormat = ""
3710                            "void f() {\n"
3711                            "// Preprocessor aligned.\n"
3712                            "#define A 0\n"
3713                            "// Code. Separated by blank line.\n"
3714                            "\n"
3715                            "#define B 0\n"
3716                            "   // Code. Not aligned with #\n"
3717                            "#define C 0\n";
3718     EXPECT_EQ(Expected, format(ToFormat, Style));
3719     EXPECT_EQ(Expected, format(Expected, Style));
3720   }
3721   // Test AfterHash with tabs.
3722   {
3723     FormatStyle Tabbed = Style;
3724     Tabbed.UseTab = FormatStyle::UT_Always;
3725     Tabbed.IndentWidth = 8;
3726     Tabbed.TabWidth = 8;
3727     verifyFormat("#ifdef _WIN32\n"
3728                  "#\tdefine A 0\n"
3729                  "#\tifdef VAR2\n"
3730                  "#\t\tdefine B 1\n"
3731                  "#\t\tinclude <someheader.h>\n"
3732                  "#\t\tdefine MACRO          \\\n"
3733                  "\t\t\tsome_very_long_func_aaaaaaaaaa();\n"
3734                  "#\tendif\n"
3735                  "#else\n"
3736                  "#\tdefine A 1\n"
3737                  "#endif",
3738                  Tabbed);
3739   }
3740 
3741   // Regression test: Multiline-macro inside include guards.
3742   verifyFormat("#ifndef HEADER_H\n"
3743                "#define HEADER_H\n"
3744                "#define A()        \\\n"
3745                "  int i;           \\\n"
3746                "  int j;\n"
3747                "#endif // HEADER_H",
3748                getLLVMStyleWithColumns(20));
3749 
3750   Style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash;
3751   // Basic before hash indent tests
3752   verifyFormat("#ifdef _WIN32\n"
3753                "  #define A 0\n"
3754                "  #ifdef VAR2\n"
3755                "    #define B 1\n"
3756                "    #include <someheader.h>\n"
3757                "    #define MACRO                      \\\n"
3758                "      some_very_long_func_aaaaaaaaaa();\n"
3759                "  #endif\n"
3760                "#else\n"
3761                "  #define A 1\n"
3762                "#endif",
3763                Style);
3764   verifyFormat("#if A\n"
3765                "  #define MACRO                        \\\n"
3766                "    void a(int x) {                    \\\n"
3767                "      b();                             \\\n"
3768                "      c();                             \\\n"
3769                "      d();                             \\\n"
3770                "      e();                             \\\n"
3771                "      f();                             \\\n"
3772                "    }\n"
3773                "#endif",
3774                Style);
3775   // Keep comments aligned with indented directives. These
3776   // tests cannot use verifyFormat because messUp manipulates leading
3777   // whitespace.
3778   {
3779     const char *Expected = "void f() {\n"
3780                            "// Aligned to preprocessor.\n"
3781                            "#if 1\n"
3782                            "  // Aligned to code.\n"
3783                            "  int a;\n"
3784                            "  #if 1\n"
3785                            "    // Aligned to preprocessor.\n"
3786                            "    #define A 0\n"
3787                            "  // Aligned to code.\n"
3788                            "  int b;\n"
3789                            "  #endif\n"
3790                            "#endif\n"
3791                            "}";
3792     const char *ToFormat = "void f() {\n"
3793                            "// Aligned to preprocessor.\n"
3794                            "#if 1\n"
3795                            "// Aligned to code.\n"
3796                            "int a;\n"
3797                            "#if 1\n"
3798                            "// Aligned to preprocessor.\n"
3799                            "#define A 0\n"
3800                            "// Aligned to code.\n"
3801                            "int b;\n"
3802                            "#endif\n"
3803                            "#endif\n"
3804                            "}";
3805     EXPECT_EQ(Expected, format(ToFormat, Style));
3806     EXPECT_EQ(Expected, format(Expected, Style));
3807   }
3808   {
3809     const char *Expected = "void f() {\n"
3810                            "/* Aligned to preprocessor. */\n"
3811                            "#if 1\n"
3812                            "  /* Aligned to code. */\n"
3813                            "  int a;\n"
3814                            "  #if 1\n"
3815                            "    /* Aligned to preprocessor. */\n"
3816                            "    #define A 0\n"
3817                            "  /* Aligned to code. */\n"
3818                            "  int b;\n"
3819                            "  #endif\n"
3820                            "#endif\n"
3821                            "}";
3822     const char *ToFormat = "void f() {\n"
3823                            "/* Aligned to preprocessor. */\n"
3824                            "#if 1\n"
3825                            "/* Aligned to code. */\n"
3826                            "int a;\n"
3827                            "#if 1\n"
3828                            "/* Aligned to preprocessor. */\n"
3829                            "#define A 0\n"
3830                            "/* Aligned to code. */\n"
3831                            "int b;\n"
3832                            "#endif\n"
3833                            "#endif\n"
3834                            "}";
3835     EXPECT_EQ(Expected, format(ToFormat, Style));
3836     EXPECT_EQ(Expected, format(Expected, Style));
3837   }
3838 
3839   // Test single comment before preprocessor
3840   verifyFormat("// Comment\n"
3841                "\n"
3842                "#if 1\n"
3843                "#endif",
3844                Style);
3845 }
3846 
3847 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
3848   verifyFormat("{\n  { a #c; }\n}");
3849 }
3850 
3851 TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
3852   EXPECT_EQ("#define A \\\n  {       \\\n    {\nint i;",
3853             format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
3854   EXPECT_EQ("#define A \\\n  }       \\\n  }\nint i;",
3855             format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
3856 }
3857 
3858 TEST_F(FormatTest, EscapedNewlines) {
3859   FormatStyle Narrow = getLLVMStyleWithColumns(11);
3860   EXPECT_EQ("#define A \\\n  int i;  \\\n  int j;",
3861             format("#define A \\\nint i;\\\n  int j;", Narrow));
3862   EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
3863   EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
3864   EXPECT_EQ("/* \\  \\  \\\n */", format("\\\n/* \\  \\  \\\n */"));
3865   EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
3866 
3867   FormatStyle AlignLeft = getLLVMStyle();
3868   AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
3869   EXPECT_EQ("#define MACRO(x) \\\n"
3870             "private:         \\\n"
3871             "  int x(int a);\n",
3872             format("#define MACRO(x) \\\n"
3873                    "private:         \\\n"
3874                    "  int x(int a);\n",
3875                    AlignLeft));
3876 
3877   // CRLF line endings
3878   EXPECT_EQ("#define A \\\r\n  int i;  \\\r\n  int j;",
3879             format("#define A \\\r\nint i;\\\r\n  int j;", Narrow));
3880   EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;"));
3881   EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
3882   EXPECT_EQ("/* \\  \\  \\\r\n */", format("\\\r\n/* \\  \\  \\\r\n */"));
3883   EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>"));
3884   EXPECT_EQ("#define MACRO(x) \\\r\n"
3885             "private:         \\\r\n"
3886             "  int x(int a);\r\n",
3887             format("#define MACRO(x) \\\r\n"
3888                    "private:         \\\r\n"
3889                    "  int x(int a);\r\n",
3890                    AlignLeft));
3891 
3892   FormatStyle DontAlign = getLLVMStyle();
3893   DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
3894   DontAlign.MaxEmptyLinesToKeep = 3;
3895   // FIXME: can't use verifyFormat here because the newline before
3896   // "public:" is not inserted the first time it's reformatted
3897   EXPECT_EQ("#define A \\\n"
3898             "  class Foo { \\\n"
3899             "    void bar(); \\\n"
3900             "\\\n"
3901             "\\\n"
3902             "\\\n"
3903             "  public: \\\n"
3904             "    void baz(); \\\n"
3905             "  };",
3906             format("#define A \\\n"
3907                    "  class Foo { \\\n"
3908                    "    void bar(); \\\n"
3909                    "\\\n"
3910                    "\\\n"
3911                    "\\\n"
3912                    "  public: \\\n"
3913                    "    void baz(); \\\n"
3914                    "  };",
3915                    DontAlign));
3916 }
3917 
3918 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
3919   verifyFormat("#define A \\\n"
3920                "  int v(  \\\n"
3921                "      a); \\\n"
3922                "  int i;",
3923                getLLVMStyleWithColumns(11));
3924 }
3925 
3926 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
3927   EXPECT_EQ(
3928       "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3929       "                      \\\n"
3930       "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3931       "\n"
3932       "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3933       "    aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
3934       format("  #define   ALooooooooooooooooooooooooooooooooooooooongMacro("
3935              "\\\n"
3936              "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3937              "  \n"
3938              "   AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3939              "  aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
3940 }
3941 
3942 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
3943   EXPECT_EQ("int\n"
3944             "#define A\n"
3945             "    a;",
3946             format("int\n#define A\na;"));
3947   verifyFormat("functionCallTo(\n"
3948                "    someOtherFunction(\n"
3949                "        withSomeParameters, whichInSequence,\n"
3950                "        areLongerThanALine(andAnotherCall,\n"
3951                "#define A B\n"
3952                "                           withMoreParamters,\n"
3953                "                           whichStronglyInfluenceTheLayout),\n"
3954                "        andMoreParameters),\n"
3955                "    trailing);",
3956                getLLVMStyleWithColumns(69));
3957   verifyFormat("Foo::Foo()\n"
3958                "#ifdef BAR\n"
3959                "    : baz(0)\n"
3960                "#endif\n"
3961                "{\n"
3962                "}");
3963   verifyFormat("void f() {\n"
3964                "  if (true)\n"
3965                "#ifdef A\n"
3966                "    f(42);\n"
3967                "  x();\n"
3968                "#else\n"
3969                "    g();\n"
3970                "  x();\n"
3971                "#endif\n"
3972                "}");
3973   verifyFormat("void f(param1, param2,\n"
3974                "       param3,\n"
3975                "#ifdef A\n"
3976                "       param4(param5,\n"
3977                "#ifdef A1\n"
3978                "              param6,\n"
3979                "#ifdef A2\n"
3980                "              param7),\n"
3981                "#else\n"
3982                "              param8),\n"
3983                "       param9,\n"
3984                "#endif\n"
3985                "       param10,\n"
3986                "#endif\n"
3987                "       param11)\n"
3988                "#else\n"
3989                "       param12)\n"
3990                "#endif\n"
3991                "{\n"
3992                "  x();\n"
3993                "}",
3994                getLLVMStyleWithColumns(28));
3995   verifyFormat("#if 1\n"
3996                "int i;");
3997   verifyFormat("#if 1\n"
3998                "#endif\n"
3999                "#if 1\n"
4000                "#else\n"
4001                "#endif\n");
4002   verifyFormat("DEBUG({\n"
4003                "  return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4004                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
4005                "});\n"
4006                "#if a\n"
4007                "#else\n"
4008                "#endif");
4009 
4010   verifyIncompleteFormat("void f(\n"
4011                          "#if A\n"
4012                          ");\n"
4013                          "#else\n"
4014                          "#endif");
4015 }
4016 
4017 TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
4018   verifyFormat("#endif\n"
4019                "#if B");
4020 }
4021 
4022 TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
4023   FormatStyle SingleLine = getLLVMStyle();
4024   SingleLine.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse;
4025   verifyFormat("#if 0\n"
4026                "#elif 1\n"
4027                "#endif\n"
4028                "void foo() {\n"
4029                "  if (test) foo2();\n"
4030                "}",
4031                SingleLine);
4032 }
4033 
4034 TEST_F(FormatTest, LayoutBlockInsideParens) {
4035   verifyFormat("functionCall({ int i; });");
4036   verifyFormat("functionCall({\n"
4037                "  int i;\n"
4038                "  int j;\n"
4039                "});");
4040   verifyFormat("functionCall(\n"
4041                "    {\n"
4042                "      int i;\n"
4043                "      int j;\n"
4044                "    },\n"
4045                "    aaaa, bbbb, cccc);");
4046   verifyFormat("functionA(functionB({\n"
4047                "            int i;\n"
4048                "            int j;\n"
4049                "          }),\n"
4050                "          aaaa, bbbb, cccc);");
4051   verifyFormat("functionCall(\n"
4052                "    {\n"
4053                "      int i;\n"
4054                "      int j;\n"
4055                "    },\n"
4056                "    aaaa, bbbb, // comment\n"
4057                "    cccc);");
4058   verifyFormat("functionA(functionB({\n"
4059                "            int i;\n"
4060                "            int j;\n"
4061                "          }),\n"
4062                "          aaaa, bbbb, // comment\n"
4063                "          cccc);");
4064   verifyFormat("functionCall(aaaa, bbbb, { int i; });");
4065   verifyFormat("functionCall(aaaa, bbbb, {\n"
4066                "  int i;\n"
4067                "  int j;\n"
4068                "});");
4069   verifyFormat(
4070       "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
4071       "    {\n"
4072       "      int i; // break\n"
4073       "    },\n"
4074       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
4075       "                                     ccccccccccccccccc));");
4076   verifyFormat("DEBUG({\n"
4077                "  if (a)\n"
4078                "    f();\n"
4079                "});");
4080 }
4081 
4082 TEST_F(FormatTest, LayoutBlockInsideStatement) {
4083   EXPECT_EQ("SOME_MACRO { int i; }\n"
4084             "int i;",
4085             format("  SOME_MACRO  {int i;}  int i;"));
4086 }
4087 
4088 TEST_F(FormatTest, LayoutNestedBlocks) {
4089   verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
4090                "  struct s {\n"
4091                "    int i;\n"
4092                "  };\n"
4093                "  s kBitsToOs[] = {{10}};\n"
4094                "  for (int i = 0; i < 10; ++i)\n"
4095                "    return;\n"
4096                "}");
4097   verifyFormat("call(parameter, {\n"
4098                "  something();\n"
4099                "  // Comment using all columns.\n"
4100                "  somethingelse();\n"
4101                "});",
4102                getLLVMStyleWithColumns(40));
4103   verifyFormat("DEBUG( //\n"
4104                "    { f(); }, a);");
4105   verifyFormat("DEBUG( //\n"
4106                "    {\n"
4107                "      f(); //\n"
4108                "    },\n"
4109                "    a);");
4110 
4111   EXPECT_EQ("call(parameter, {\n"
4112             "  something();\n"
4113             "  // Comment too\n"
4114             "  // looooooooooong.\n"
4115             "  somethingElse();\n"
4116             "});",
4117             format("call(parameter, {\n"
4118                    "  something();\n"
4119                    "  // Comment too looooooooooong.\n"
4120                    "  somethingElse();\n"
4121                    "});",
4122                    getLLVMStyleWithColumns(29)));
4123   EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int   i; });"));
4124   EXPECT_EQ("DEBUG({ // comment\n"
4125             "  int i;\n"
4126             "});",
4127             format("DEBUG({ // comment\n"
4128                    "int  i;\n"
4129                    "});"));
4130   EXPECT_EQ("DEBUG({\n"
4131             "  int i;\n"
4132             "\n"
4133             "  // comment\n"
4134             "  int j;\n"
4135             "});",
4136             format("DEBUG({\n"
4137                    "  int  i;\n"
4138                    "\n"
4139                    "  // comment\n"
4140                    "  int  j;\n"
4141                    "});"));
4142 
4143   verifyFormat("DEBUG({\n"
4144                "  if (a)\n"
4145                "    return;\n"
4146                "});");
4147   verifyGoogleFormat("DEBUG({\n"
4148                      "  if (a) return;\n"
4149                      "});");
4150   FormatStyle Style = getGoogleStyle();
4151   Style.ColumnLimit = 45;
4152   verifyFormat("Debug(\n"
4153                "    aaaaa,\n"
4154                "    {\n"
4155                "      if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
4156                "    },\n"
4157                "    a);",
4158                Style);
4159 
4160   verifyFormat("SomeFunction({MACRO({ return output; }), b});");
4161 
4162   verifyNoCrash("^{v^{a}}");
4163 }
4164 
4165 TEST_F(FormatTest, FormatNestedBlocksInMacros) {
4166   EXPECT_EQ("#define MACRO()                     \\\n"
4167             "  Debug(aaa, /* force line break */ \\\n"
4168             "        {                           \\\n"
4169             "          int i;                    \\\n"
4170             "          int j;                    \\\n"
4171             "        })",
4172             format("#define   MACRO()   Debug(aaa,  /* force line break */ \\\n"
4173                    "          {  int   i;  int  j;   })",
4174                    getGoogleStyle()));
4175 
4176   EXPECT_EQ("#define A                                       \\\n"
4177             "  [] {                                          \\\n"
4178             "    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(        \\\n"
4179             "        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
4180             "  }",
4181             format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
4182                    "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
4183                    getGoogleStyle()));
4184 }
4185 
4186 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
4187   EXPECT_EQ("{}", format("{}"));
4188   verifyFormat("enum E {};");
4189   verifyFormat("enum E {}");
4190   FormatStyle Style = getLLVMStyle();
4191   Style.SpaceInEmptyBlock = true;
4192   EXPECT_EQ("void f() { }", format("void f() {}", Style));
4193   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty;
4194   EXPECT_EQ("while (true) { }", format("while (true) {}", Style));
4195 }
4196 
4197 TEST_F(FormatTest, FormatBeginBlockEndMacros) {
4198   FormatStyle Style = getLLVMStyle();
4199   Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
4200   Style.MacroBlockEnd = "^[A-Z_]+_END$";
4201   verifyFormat("FOO_BEGIN\n"
4202                "  FOO_ENTRY\n"
4203                "FOO_END",
4204                Style);
4205   verifyFormat("FOO_BEGIN\n"
4206                "  NESTED_FOO_BEGIN\n"
4207                "    NESTED_FOO_ENTRY\n"
4208                "  NESTED_FOO_END\n"
4209                "FOO_END",
4210                Style);
4211   verifyFormat("FOO_BEGIN(Foo, Bar)\n"
4212                "  int x;\n"
4213                "  x = 1;\n"
4214                "FOO_END(Baz)",
4215                Style);
4216 }
4217 
4218 //===----------------------------------------------------------------------===//
4219 // Line break tests.
4220 //===----------------------------------------------------------------------===//
4221 
4222 TEST_F(FormatTest, PreventConfusingIndents) {
4223   verifyFormat(
4224       "void f() {\n"
4225       "  SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
4226       "                         parameter, parameter, parameter)),\n"
4227       "                     SecondLongCall(parameter));\n"
4228       "}");
4229   verifyFormat(
4230       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4231       "    aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4232       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4233       "    aaaaaaaaaaaaaaaaaaaaaaaa);");
4234   verifyFormat(
4235       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4236       "    [aaaaaaaaaaaaaaaaaaaaaaaa\n"
4237       "         [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
4238       "         [aaaaaaaaaaaaaaaaaaaaaaaa]];");
4239   verifyFormat(
4240       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
4241       "    aaaaaaaaaaaaaaaaaaaaaaaa<\n"
4242       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
4243       "    aaaaaaaaaaaaaaaaaaaaaaaa>;");
4244   verifyFormat("int a = bbbb && ccc &&\n"
4245                "        fffff(\n"
4246                "#define A Just forcing a new line\n"
4247                "            ddd);");
4248 }
4249 
4250 TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
4251   verifyFormat(
4252       "bool aaaaaaa =\n"
4253       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
4254       "    bbbbbbbb();");
4255   verifyFormat(
4256       "bool aaaaaaa =\n"
4257       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
4258       "    bbbbbbbb();");
4259 
4260   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
4261                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
4262                "    ccccccccc == ddddddddddd;");
4263   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
4264                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
4265                "    ccccccccc == ddddddddddd;");
4266   verifyFormat(
4267       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
4268       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
4269       "    ccccccccc == ddddddddddd;");
4270 
4271   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
4272                "                 aaaaaa) &&\n"
4273                "         bbbbbb && cccccc;");
4274   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
4275                "                 aaaaaa) >>\n"
4276                "         bbbbbb;");
4277   verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
4278                "    SourceMgr.getSpellingColumnNumber(\n"
4279                "        TheLine.Last->FormatTok.Tok.getLocation()) -\n"
4280                "    1);");
4281 
4282   verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4283                "     bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
4284                "    cccccc) {\n}");
4285   verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4286                "               bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
4287                "              cccccc) {\n}");
4288   verifyFormat("if CONSTEXPR ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4289                "               bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
4290                "              cccccc) {\n}");
4291   verifyFormat("b = a &&\n"
4292                "    // Comment\n"
4293                "    b.c && d;");
4294 
4295   // If the LHS of a comparison is not a binary expression itself, the
4296   // additional linebreak confuses many people.
4297   verifyFormat(
4298       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4299       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
4300       "}");
4301   verifyFormat(
4302       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4303       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
4304       "}");
4305   verifyFormat(
4306       "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
4307       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
4308       "}");
4309   verifyFormat(
4310       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4311       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n"
4312       "}");
4313   // Even explicit parentheses stress the precedence enough to make the
4314   // additional break unnecessary.
4315   verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4316                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
4317                "}");
4318   // This cases is borderline, but with the indentation it is still readable.
4319   verifyFormat(
4320       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4321       "        aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4322       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
4323       "}",
4324       getLLVMStyleWithColumns(75));
4325 
4326   // If the LHS is a binary expression, we should still use the additional break
4327   // as otherwise the formatting hides the operator precedence.
4328   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4329                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4330                "    5) {\n"
4331                "}");
4332   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4333                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n"
4334                "    5) {\n"
4335                "}");
4336 
4337   FormatStyle OnePerLine = getLLVMStyle();
4338   OnePerLine.BinPackParameters = false;
4339   verifyFormat(
4340       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4341       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4342       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
4343       OnePerLine);
4344 
4345   verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
4346                "                .aaa(aaaaaaaaaaaaa) *\n"
4347                "            aaaaaaa +\n"
4348                "        aaaaaaa;",
4349                getLLVMStyleWithColumns(40));
4350 }
4351 
4352 TEST_F(FormatTest, ExpressionIndentation) {
4353   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4354                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4355                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4356                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4357                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4358                "                     bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
4359                "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4360                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
4361                "                 ccccccccccccccccccccccccccccccccccccccccc;");
4362   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4363                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4364                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4365                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4366   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4367                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4368                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4369                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4370   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4371                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4372                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4373                "        bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4374   verifyFormat("if () {\n"
4375                "} else if (aaaaa && bbbbb > // break\n"
4376                "                        ccccc) {\n"
4377                "}");
4378   verifyFormat("if () {\n"
4379                "} else if constexpr (aaaaa && bbbbb > // break\n"
4380                "                                  ccccc) {\n"
4381                "}");
4382   verifyFormat("if () {\n"
4383                "} else if CONSTEXPR (aaaaa && bbbbb > // break\n"
4384                "                                  ccccc) {\n"
4385                "}");
4386   verifyFormat("if () {\n"
4387                "} else if (aaaaa &&\n"
4388                "           bbbbb > // break\n"
4389                "               ccccc &&\n"
4390                "           ddddd) {\n"
4391                "}");
4392 
4393   // Presence of a trailing comment used to change indentation of b.
4394   verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
4395                "       b;\n"
4396                "return aaaaaaaaaaaaaaaaaaa +\n"
4397                "       b; //",
4398                getLLVMStyleWithColumns(30));
4399 }
4400 
4401 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
4402   // Not sure what the best system is here. Like this, the LHS can be found
4403   // immediately above an operator (everything with the same or a higher
4404   // indent). The RHS is aligned right of the operator and so compasses
4405   // everything until something with the same indent as the operator is found.
4406   // FIXME: Is this a good system?
4407   FormatStyle Style = getLLVMStyle();
4408   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4409   verifyFormat(
4410       "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4411       "                     + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4412       "                     + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4413       "                 == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4414       "                            * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4415       "                        + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4416       "             && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4417       "                        * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4418       "                    > ccccccccccccccccccccccccccccccccccccccccc;",
4419       Style);
4420   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4421                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4422                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4423                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4424                Style);
4425   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4426                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4427                "              * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4428                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4429                Style);
4430   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4431                "    == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4432                "               * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4433                "           + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4434                Style);
4435   verifyFormat("if () {\n"
4436                "} else if (aaaaa\n"
4437                "           && bbbbb // break\n"
4438                "                  > ccccc) {\n"
4439                "}",
4440                Style);
4441   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4442                "       && bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
4443                Style);
4444   verifyFormat("return (a)\n"
4445                "       // comment\n"
4446                "       + b;",
4447                Style);
4448   verifyFormat(
4449       "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4450       "                 * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4451       "             + cc;",
4452       Style);
4453 
4454   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4455                "    = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4456                Style);
4457 
4458   // Forced by comments.
4459   verifyFormat(
4460       "unsigned ContentSize =\n"
4461       "    sizeof(int16_t)   // DWARF ARange version number\n"
4462       "    + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
4463       "    + sizeof(int8_t)  // Pointer Size (in bytes)\n"
4464       "    + sizeof(int8_t); // Segment Size (in bytes)");
4465 
4466   verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
4467                "       == boost::fusion::at_c<1>(iiii).second;",
4468                Style);
4469 
4470   Style.ColumnLimit = 60;
4471   verifyFormat("zzzzzzzzzz\n"
4472                "    = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4473                "      >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
4474                Style);
4475 
4476   Style.ColumnLimit = 80;
4477   Style.IndentWidth = 4;
4478   Style.TabWidth = 4;
4479   Style.UseTab = FormatStyle::UT_Always;
4480   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4481   Style.AlignOperands = FormatStyle::OAS_DontAlign;
4482   EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n"
4483             "\t&& (someOtherLongishConditionPart1\n"
4484             "\t\t|| someOtherEvenLongerNestedConditionPart2);",
4485             format("return someVeryVeryLongConditionThatBarelyFitsOnALine && "
4486                    "(someOtherLongishConditionPart1 || "
4487                    "someOtherEvenLongerNestedConditionPart2);",
4488                    Style));
4489 }
4490 
4491 TEST_F(FormatTest, ExpressionIndentationStrictAlign) {
4492   FormatStyle Style = getLLVMStyle();
4493   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4494   Style.AlignOperands = FormatStyle::OAS_AlignAfterOperator;
4495 
4496   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4497                "                   + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4498                "                   + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4499                "              == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4500                "                         * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4501                "                     + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4502                "          && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4503                "                     * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4504                "                 > ccccccccccccccccccccccccccccccccccccccccc;",
4505                Style);
4506   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4507                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4508                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4509                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4510                Style);
4511   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4512                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4513                "              * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4514                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4515                Style);
4516   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4517                "    == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4518                "               * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4519                "           + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4520                Style);
4521   verifyFormat("if () {\n"
4522                "} else if (aaaaa\n"
4523                "           && bbbbb // break\n"
4524                "                  > ccccc) {\n"
4525                "}",
4526                Style);
4527   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4528                "    && bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
4529                Style);
4530   verifyFormat("return (a)\n"
4531                "     // comment\n"
4532                "     + b;",
4533                Style);
4534   verifyFormat(
4535       "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4536       "               * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4537       "           + cc;",
4538       Style);
4539   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n"
4540                "     : bbbbbbbbbbbbbbbb ? 2222222222222222\n"
4541                "                        : 3333333333333333;",
4542                Style);
4543   verifyFormat(
4544       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaa    ? bbbbbbbbbbbbbbbbbb\n"
4545       "                           : ccccccccccccccc ? dddddddddddddddddd\n"
4546       "                                             : eeeeeeeeeeeeeeeeee)\n"
4547       "     : bbbbbbbbbbbbbbbb ? 2222222222222222\n"
4548       "                        : 3333333333333333;",
4549       Style);
4550   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4551                "    = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4552                Style);
4553 
4554   verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
4555                "    == boost::fusion::at_c<1>(iiii).second;",
4556                Style);
4557 
4558   Style.ColumnLimit = 60;
4559   verifyFormat("zzzzzzzzzzzzz\n"
4560                "    = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4561                "   >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
4562                Style);
4563 
4564   // Forced by comments.
4565   Style.ColumnLimit = 80;
4566   verifyFormat(
4567       "unsigned ContentSize\n"
4568       "    = sizeof(int16_t) // DWARF ARange version number\n"
4569       "    + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
4570       "    + sizeof(int8_t)  // Pointer Size (in bytes)\n"
4571       "    + sizeof(int8_t); // Segment Size (in bytes)",
4572       Style);
4573 
4574   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4575   verifyFormat(
4576       "unsigned ContentSize =\n"
4577       "    sizeof(int16_t)   // DWARF ARange version number\n"
4578       "    + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
4579       "    + sizeof(int8_t)  // Pointer Size (in bytes)\n"
4580       "    + sizeof(int8_t); // Segment Size (in bytes)",
4581       Style);
4582 
4583   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4584   verifyFormat(
4585       "unsigned ContentSize =\n"
4586       "    sizeof(int16_t)   // DWARF ARange version number\n"
4587       "    + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
4588       "    + sizeof(int8_t)  // Pointer Size (in bytes)\n"
4589       "    + sizeof(int8_t); // Segment Size (in bytes)",
4590       Style);
4591 }
4592 
4593 TEST_F(FormatTest, EnforcedOperatorWraps) {
4594   // Here we'd like to wrap after the || operators, but a comment is forcing an
4595   // earlier wrap.
4596   verifyFormat("bool x = aaaaa //\n"
4597                "         || bbbbb\n"
4598                "         //\n"
4599                "         || cccc;");
4600 }
4601 
4602 TEST_F(FormatTest, NoOperandAlignment) {
4603   FormatStyle Style = getLLVMStyle();
4604   Style.AlignOperands = FormatStyle::OAS_DontAlign;
4605   verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
4606                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4607                "                   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4608                Style);
4609   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4610   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4611                "            + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4612                "            + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4613                "        == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4614                "                * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4615                "            + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4616                "    && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4617                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4618                "        > ccccccccccccccccccccccccccccccccccccccccc;",
4619                Style);
4620 
4621   verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4622                "        * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4623                "    + cc;",
4624                Style);
4625   verifyFormat("int a = aa\n"
4626                "    + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4627                "        * cccccccccccccccccccccccccccccccccccc;\n",
4628                Style);
4629 
4630   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4631   verifyFormat("return (a > b\n"
4632                "    // comment1\n"
4633                "    // comment2\n"
4634                "    || c);",
4635                Style);
4636 }
4637 
4638 TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
4639   FormatStyle Style = getLLVMStyle();
4640   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4641   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4642                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4643                "    + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
4644                Style);
4645 }
4646 
4647 TEST_F(FormatTest, AllowBinPackingInsideArguments) {
4648   FormatStyle Style = getLLVMStyle();
4649   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4650   Style.BinPackArguments = false;
4651   Style.ColumnLimit = 40;
4652   verifyFormat("void test() {\n"
4653                "  someFunction(\n"
4654                "      this + argument + is + quite\n"
4655                "      + long + so + it + gets + wrapped\n"
4656                "      + but + remains + bin - packed);\n"
4657                "}",
4658                Style);
4659   verifyFormat("void test() {\n"
4660                "  someFunction(arg1,\n"
4661                "               this + argument + is\n"
4662                "                   + quite + long + so\n"
4663                "                   + it + gets + wrapped\n"
4664                "                   + but + remains + bin\n"
4665                "                   - packed,\n"
4666                "               arg3);\n"
4667                "}",
4668                Style);
4669   verifyFormat("void test() {\n"
4670                "  someFunction(\n"
4671                "      arg1,\n"
4672                "      this + argument + has\n"
4673                "          + anotherFunc(nested,\n"
4674                "                        calls + whose\n"
4675                "                            + arguments\n"
4676                "                            + are + also\n"
4677                "                            + wrapped,\n"
4678                "                        in + addition)\n"
4679                "          + to + being + bin - packed,\n"
4680                "      arg3);\n"
4681                "}",
4682                Style);
4683 
4684   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4685   verifyFormat("void test() {\n"
4686                "  someFunction(\n"
4687                "      arg1,\n"
4688                "      this + argument + has +\n"
4689                "          anotherFunc(nested,\n"
4690                "                      calls + whose +\n"
4691                "                          arguments +\n"
4692                "                          are + also +\n"
4693                "                          wrapped,\n"
4694                "                      in + addition) +\n"
4695                "          to + being + bin - packed,\n"
4696                "      arg3);\n"
4697                "}",
4698                Style);
4699 }
4700 
4701 TEST_F(FormatTest, ConstructorInitializers) {
4702   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
4703   verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
4704                getLLVMStyleWithColumns(45));
4705   verifyFormat("Constructor()\n"
4706                "    : Inttializer(FitsOnTheLine) {}",
4707                getLLVMStyleWithColumns(44));
4708   verifyFormat("Constructor()\n"
4709                "    : Inttializer(FitsOnTheLine) {}",
4710                getLLVMStyleWithColumns(43));
4711 
4712   verifyFormat("template <typename T>\n"
4713                "Constructor() : Initializer(FitsOnTheLine) {}",
4714                getLLVMStyleWithColumns(45));
4715 
4716   verifyFormat(
4717       "SomeClass::Constructor()\n"
4718       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
4719 
4720   verifyFormat(
4721       "SomeClass::Constructor()\n"
4722       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4723       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
4724   verifyFormat(
4725       "SomeClass::Constructor()\n"
4726       "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4727       "      aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
4728   verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4729                "            aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4730                "    : aaaaaaaaaa(aaaaaa) {}");
4731 
4732   verifyFormat("Constructor()\n"
4733                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4734                "      aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4735                "                               aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4736                "      aaaaaaaaaaaaaaaaaaaaaaa() {}");
4737 
4738   verifyFormat("Constructor()\n"
4739                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4740                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
4741 
4742   verifyFormat("Constructor(int Parameter = 0)\n"
4743                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
4744                "      aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
4745   verifyFormat("Constructor()\n"
4746                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
4747                "}",
4748                getLLVMStyleWithColumns(60));
4749   verifyFormat("Constructor()\n"
4750                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4751                "          aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
4752 
4753   // Here a line could be saved by splitting the second initializer onto two
4754   // lines, but that is not desirable.
4755   verifyFormat("Constructor()\n"
4756                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
4757                "      aaaaaaaaaaa(aaaaaaaaaaa),\n"
4758                "      aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
4759 
4760   FormatStyle OnePerLine = getLLVMStyle();
4761   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4762   OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
4763   verifyFormat("SomeClass::Constructor()\n"
4764                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4765                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4766                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4767                OnePerLine);
4768   verifyFormat("SomeClass::Constructor()\n"
4769                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
4770                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4771                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4772                OnePerLine);
4773   verifyFormat("MyClass::MyClass(int var)\n"
4774                "    : some_var_(var),            // 4 space indent\n"
4775                "      some_other_var_(var + 1) { // lined up\n"
4776                "}",
4777                OnePerLine);
4778   verifyFormat("Constructor()\n"
4779                "    : aaaaa(aaaaaa),\n"
4780                "      aaaaa(aaaaaa),\n"
4781                "      aaaaa(aaaaaa),\n"
4782                "      aaaaa(aaaaaa),\n"
4783                "      aaaaa(aaaaaa) {}",
4784                OnePerLine);
4785   verifyFormat("Constructor()\n"
4786                "    : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4787                "            aaaaaaaaaaaaaaaaaaaaaa) {}",
4788                OnePerLine);
4789   OnePerLine.BinPackParameters = false;
4790   verifyFormat(
4791       "Constructor()\n"
4792       "    : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4793       "          aaaaaaaaaaa().aaa(),\n"
4794       "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4795       OnePerLine);
4796   OnePerLine.ColumnLimit = 60;
4797   verifyFormat("Constructor()\n"
4798                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4799                "      bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
4800                OnePerLine);
4801 
4802   EXPECT_EQ("Constructor()\n"
4803             "    : // Comment forcing unwanted break.\n"
4804             "      aaaa(aaaa) {}",
4805             format("Constructor() :\n"
4806                    "    // Comment forcing unwanted break.\n"
4807                    "    aaaa(aaaa) {}"));
4808 }
4809 
4810 TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) {
4811   FormatStyle Style = getLLVMStyle();
4812   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4813   Style.ColumnLimit = 60;
4814   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4815   Style.AllowAllConstructorInitializersOnNextLine = true;
4816   Style.BinPackParameters = false;
4817 
4818   for (int i = 0; i < 4; ++i) {
4819     // Test all combinations of parameters that should not have an effect.
4820     Style.AllowAllParametersOfDeclarationOnNextLine = i & 1;
4821     Style.AllowAllArgumentsOnNextLine = i & 2;
4822 
4823     Style.AllowAllConstructorInitializersOnNextLine = true;
4824     Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4825     verifyFormat("Constructor()\n"
4826                  "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4827                  Style);
4828     verifyFormat("Constructor() : a(a), b(b) {}", Style);
4829 
4830     Style.AllowAllConstructorInitializersOnNextLine = false;
4831     verifyFormat("Constructor()\n"
4832                  "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4833                  "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4834                  Style);
4835     verifyFormat("Constructor() : a(a), b(b) {}", Style);
4836 
4837     Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
4838     Style.AllowAllConstructorInitializersOnNextLine = true;
4839     verifyFormat("Constructor()\n"
4840                  "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4841                  Style);
4842 
4843     Style.AllowAllConstructorInitializersOnNextLine = false;
4844     verifyFormat("Constructor()\n"
4845                  "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4846                  "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4847                  Style);
4848 
4849     Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4850     Style.AllowAllConstructorInitializersOnNextLine = true;
4851     verifyFormat("Constructor() :\n"
4852                  "    aaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4853                  Style);
4854 
4855     Style.AllowAllConstructorInitializersOnNextLine = false;
4856     verifyFormat("Constructor() :\n"
4857                  "    aaaaaaaaaaaaaaaaaa(a),\n"
4858                  "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4859                  Style);
4860   }
4861 
4862   // Test interactions between AllowAllParametersOfDeclarationOnNextLine and
4863   // AllowAllConstructorInitializersOnNextLine in all
4864   // BreakConstructorInitializers modes
4865   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4866   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4867   Style.AllowAllConstructorInitializersOnNextLine = false;
4868   verifyFormat("SomeClassWithALongName::Constructor(\n"
4869                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n"
4870                "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4871                "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4872                Style);
4873 
4874   Style.AllowAllConstructorInitializersOnNextLine = true;
4875   verifyFormat("SomeClassWithALongName::Constructor(\n"
4876                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4877                "    int bbbbbbbbbbbbb,\n"
4878                "    int cccccccccccccccc)\n"
4879                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4880                Style);
4881 
4882   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4883   Style.AllowAllConstructorInitializersOnNextLine = false;
4884   verifyFormat("SomeClassWithALongName::Constructor(\n"
4885                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4886                "    int bbbbbbbbbbbbb)\n"
4887                "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4888                "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4889                Style);
4890 
4891   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
4892 
4893   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4894   verifyFormat("SomeClassWithALongName::Constructor(\n"
4895                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n"
4896                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4897                "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4898                Style);
4899 
4900   Style.AllowAllConstructorInitializersOnNextLine = true;
4901   verifyFormat("SomeClassWithALongName::Constructor(\n"
4902                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4903                "    int bbbbbbbbbbbbb,\n"
4904                "    int cccccccccccccccc)\n"
4905                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4906                Style);
4907 
4908   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4909   Style.AllowAllConstructorInitializersOnNextLine = false;
4910   verifyFormat("SomeClassWithALongName::Constructor(\n"
4911                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4912                "    int bbbbbbbbbbbbb)\n"
4913                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4914                "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4915                Style);
4916 
4917   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4918   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4919   verifyFormat("SomeClassWithALongName::Constructor(\n"
4920                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb) :\n"
4921                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4922                "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4923                Style);
4924 
4925   Style.AllowAllConstructorInitializersOnNextLine = true;
4926   verifyFormat("SomeClassWithALongName::Constructor(\n"
4927                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4928                "    int bbbbbbbbbbbbb,\n"
4929                "    int cccccccccccccccc) :\n"
4930                "    aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4931                Style);
4932 
4933   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4934   Style.AllowAllConstructorInitializersOnNextLine = false;
4935   verifyFormat("SomeClassWithALongName::Constructor(\n"
4936                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4937                "    int bbbbbbbbbbbbb) :\n"
4938                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4939                "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4940                Style);
4941 }
4942 
4943 TEST_F(FormatTest, AllowAllArgumentsOnNextLine) {
4944   FormatStyle Style = getLLVMStyle();
4945   Style.ColumnLimit = 60;
4946   Style.BinPackArguments = false;
4947   for (int i = 0; i < 4; ++i) {
4948     // Test all combinations of parameters that should not have an effect.
4949     Style.AllowAllParametersOfDeclarationOnNextLine = i & 1;
4950     Style.AllowAllConstructorInitializersOnNextLine = i & 2;
4951 
4952     Style.AllowAllArgumentsOnNextLine = true;
4953     verifyFormat("void foo() {\n"
4954                  "  FunctionCallWithReallyLongName(\n"
4955                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb);\n"
4956                  "}",
4957                  Style);
4958     Style.AllowAllArgumentsOnNextLine = false;
4959     verifyFormat("void foo() {\n"
4960                  "  FunctionCallWithReallyLongName(\n"
4961                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4962                  "      bbbbbbbbbbbb);\n"
4963                  "}",
4964                  Style);
4965 
4966     Style.AllowAllArgumentsOnNextLine = true;
4967     verifyFormat("void foo() {\n"
4968                  "  auto VariableWithReallyLongName = {\n"
4969                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb};\n"
4970                  "}",
4971                  Style);
4972     Style.AllowAllArgumentsOnNextLine = false;
4973     verifyFormat("void foo() {\n"
4974                  "  auto VariableWithReallyLongName = {\n"
4975                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4976                  "      bbbbbbbbbbbb};\n"
4977                  "}",
4978                  Style);
4979   }
4980 
4981   // This parameter should not affect declarations.
4982   Style.BinPackParameters = false;
4983   Style.AllowAllArgumentsOnNextLine = false;
4984   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4985   verifyFormat("void FunctionCallWithReallyLongName(\n"
4986                "    int aaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbb);",
4987                Style);
4988   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4989   verifyFormat("void FunctionCallWithReallyLongName(\n"
4990                "    int aaaaaaaaaaaaaaaaaaaaaaa,\n"
4991                "    int bbbbbbbbbbbb);",
4992                Style);
4993 }
4994 
4995 TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
4996   FormatStyle Style = getLLVMStyle();
4997   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4998 
4999   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
5000   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
5001                getStyleWithColumns(Style, 45));
5002   verifyFormat("Constructor() :\n"
5003                "    Initializer(FitsOnTheLine) {}",
5004                getStyleWithColumns(Style, 44));
5005   verifyFormat("Constructor() :\n"
5006                "    Initializer(FitsOnTheLine) {}",
5007                getStyleWithColumns(Style, 43));
5008 
5009   verifyFormat("template <typename T>\n"
5010                "Constructor() : Initializer(FitsOnTheLine) {}",
5011                getStyleWithColumns(Style, 50));
5012   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
5013   verifyFormat(
5014       "SomeClass::Constructor() :\n"
5015       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
5016       Style);
5017 
5018   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = false;
5019   verifyFormat(
5020       "SomeClass::Constructor() :\n"
5021       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
5022       Style);
5023 
5024   verifyFormat(
5025       "SomeClass::Constructor() :\n"
5026       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
5027       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
5028       Style);
5029   verifyFormat(
5030       "SomeClass::Constructor() :\n"
5031       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5032       "    aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
5033       Style);
5034   verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5035                "            aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5036                "    aaaaaaaaaa(aaaaaa) {}",
5037                Style);
5038 
5039   verifyFormat("Constructor() :\n"
5040                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5041                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5042                "                             aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5043                "    aaaaaaaaaaaaaaaaaaaaaaa() {}",
5044                Style);
5045 
5046   verifyFormat("Constructor() :\n"
5047                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5048                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5049                Style);
5050 
5051   verifyFormat("Constructor(int Parameter = 0) :\n"
5052                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
5053                "    aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
5054                Style);
5055   verifyFormat("Constructor() :\n"
5056                "    aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
5057                "}",
5058                getStyleWithColumns(Style, 60));
5059   verifyFormat("Constructor() :\n"
5060                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5061                "        aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
5062                Style);
5063 
5064   // Here a line could be saved by splitting the second initializer onto two
5065   // lines, but that is not desirable.
5066   verifyFormat("Constructor() :\n"
5067                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
5068                "    aaaaaaaaaaa(aaaaaaaaaaa),\n"
5069                "    aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5070                Style);
5071 
5072   FormatStyle OnePerLine = Style;
5073   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
5074   OnePerLine.AllowAllConstructorInitializersOnNextLine = false;
5075   verifyFormat("SomeClass::Constructor() :\n"
5076                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
5077                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
5078                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
5079                OnePerLine);
5080   verifyFormat("SomeClass::Constructor() :\n"
5081                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
5082                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
5083                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
5084                OnePerLine);
5085   verifyFormat("MyClass::MyClass(int var) :\n"
5086                "    some_var_(var),            // 4 space indent\n"
5087                "    some_other_var_(var + 1) { // lined up\n"
5088                "}",
5089                OnePerLine);
5090   verifyFormat("Constructor() :\n"
5091                "    aaaaa(aaaaaa),\n"
5092                "    aaaaa(aaaaaa),\n"
5093                "    aaaaa(aaaaaa),\n"
5094                "    aaaaa(aaaaaa),\n"
5095                "    aaaaa(aaaaaa) {}",
5096                OnePerLine);
5097   verifyFormat("Constructor() :\n"
5098                "    aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5099                "          aaaaaaaaaaaaaaaaaaaaaa) {}",
5100                OnePerLine);
5101   OnePerLine.BinPackParameters = false;
5102   verifyFormat("Constructor() :\n"
5103                "    aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5104                "        aaaaaaaaaaa().aaa(),\n"
5105                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5106                OnePerLine);
5107   OnePerLine.ColumnLimit = 60;
5108   verifyFormat("Constructor() :\n"
5109                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
5110                "    bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
5111                OnePerLine);
5112 
5113   EXPECT_EQ("Constructor() :\n"
5114             "    // Comment forcing unwanted break.\n"
5115             "    aaaa(aaaa) {}",
5116             format("Constructor() :\n"
5117                    "    // Comment forcing unwanted break.\n"
5118                    "    aaaa(aaaa) {}",
5119                    Style));
5120 
5121   Style.ColumnLimit = 0;
5122   verifyFormat("SomeClass::Constructor() :\n"
5123                "    a(a) {}",
5124                Style);
5125   verifyFormat("SomeClass::Constructor() noexcept :\n"
5126                "    a(a) {}",
5127                Style);
5128   verifyFormat("SomeClass::Constructor() :\n"
5129                "    a(a), b(b), c(c) {}",
5130                Style);
5131   verifyFormat("SomeClass::Constructor() :\n"
5132                "    a(a) {\n"
5133                "  foo();\n"
5134                "  bar();\n"
5135                "}",
5136                Style);
5137 
5138   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
5139   verifyFormat("SomeClass::Constructor() :\n"
5140                "    a(a), b(b), c(c) {\n"
5141                "}",
5142                Style);
5143   verifyFormat("SomeClass::Constructor() :\n"
5144                "    a(a) {\n"
5145                "}",
5146                Style);
5147 
5148   Style.ColumnLimit = 80;
5149   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
5150   Style.ConstructorInitializerIndentWidth = 2;
5151   verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}", Style);
5152   verifyFormat("SomeClass::Constructor() :\n"
5153                "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5154                "  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
5155                Style);
5156 
5157   // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as
5158   // well
5159   Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
5160   verifyFormat(
5161       "class SomeClass\n"
5162       "  : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5163       "    public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
5164       Style);
5165   Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
5166   verifyFormat(
5167       "class SomeClass\n"
5168       "  : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5169       "  , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
5170       Style);
5171   Style.BreakInheritanceList = FormatStyle::BILS_AfterColon;
5172   verifyFormat(
5173       "class SomeClass :\n"
5174       "  public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5175       "  public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
5176       Style);
5177 }
5178 
5179 #ifndef EXPENSIVE_CHECKS
5180 // Expensive checks enables libstdc++ checking which includes validating the
5181 // state of ranges used in std::priority_queue - this blows out the
5182 // runtime/scalability of the function and makes this test unacceptably slow.
5183 TEST_F(FormatTest, MemoizationTests) {
5184   // This breaks if the memoization lookup does not take \c Indent and
5185   // \c LastSpace into account.
5186   verifyFormat(
5187       "extern CFRunLoopTimerRef\n"
5188       "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
5189       "                     CFTimeInterval interval, CFOptionFlags flags,\n"
5190       "                     CFIndex order, CFRunLoopTimerCallBack callout,\n"
5191       "                     CFRunLoopTimerContext *context) {}");
5192 
5193   // Deep nesting somewhat works around our memoization.
5194   verifyFormat(
5195       "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
5196       "    aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
5197       "        aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
5198       "            aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
5199       "                aaaaa())))))))))))))))))))))))))))))))))))))));",
5200       getLLVMStyleWithColumns(65));
5201   verifyFormat(
5202       "aaaaa(\n"
5203       "    aaaaa,\n"
5204       "    aaaaa(\n"
5205       "        aaaaa,\n"
5206       "        aaaaa(\n"
5207       "            aaaaa,\n"
5208       "            aaaaa(\n"
5209       "                aaaaa,\n"
5210       "                aaaaa(\n"
5211       "                    aaaaa,\n"
5212       "                    aaaaa(\n"
5213       "                        aaaaa,\n"
5214       "                        aaaaa(\n"
5215       "                            aaaaa,\n"
5216       "                            aaaaa(\n"
5217       "                                aaaaa,\n"
5218       "                                aaaaa(\n"
5219       "                                    aaaaa,\n"
5220       "                                    aaaaa(\n"
5221       "                                        aaaaa,\n"
5222       "                                        aaaaa(\n"
5223       "                                            aaaaa,\n"
5224       "                                            aaaaa(\n"
5225       "                                                aaaaa,\n"
5226       "                                                aaaaa))))))))))));",
5227       getLLVMStyleWithColumns(65));
5228   verifyFormat(
5229       "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"
5230       "                                  a),\n"
5231       "                                a),\n"
5232       "                              a),\n"
5233       "                            a),\n"
5234       "                          a),\n"
5235       "                        a),\n"
5236       "                      a),\n"
5237       "                    a),\n"
5238       "                  a),\n"
5239       "                a),\n"
5240       "              a),\n"
5241       "            a),\n"
5242       "          a),\n"
5243       "        a),\n"
5244       "      a),\n"
5245       "    a),\n"
5246       "  a)",
5247       getLLVMStyleWithColumns(65));
5248 
5249   // This test takes VERY long when memoization is broken.
5250   FormatStyle OnePerLine = getLLVMStyle();
5251   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
5252   OnePerLine.BinPackParameters = false;
5253   std::string input = "Constructor()\n"
5254                       "    : aaaa(a,\n";
5255   for (unsigned i = 0, e = 80; i != e; ++i) {
5256     input += "           a,\n";
5257   }
5258   input += "           a) {}";
5259   verifyFormat(input, OnePerLine);
5260 }
5261 #endif
5262 
5263 TEST_F(FormatTest, BreaksAsHighAsPossible) {
5264   verifyFormat(
5265       "void f() {\n"
5266       "  if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
5267       "      (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
5268       "    f();\n"
5269       "}");
5270   verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
5271                "    Intervals[i - 1].getRange().getLast()) {\n}");
5272 }
5273 
5274 TEST_F(FormatTest, BreaksFunctionDeclarations) {
5275   // Principially, we break function declarations in a certain order:
5276   // 1) break amongst arguments.
5277   verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
5278                "                              Cccccccccccccc cccccccccccccc);");
5279   verifyFormat("template <class TemplateIt>\n"
5280                "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
5281                "                            TemplateIt *stop) {}");
5282 
5283   // 2) break after return type.
5284   verifyFormat(
5285       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5286       "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
5287       getGoogleStyle());
5288 
5289   // 3) break after (.
5290   verifyFormat(
5291       "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
5292       "    Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
5293       getGoogleStyle());
5294 
5295   // 4) break before after nested name specifiers.
5296   verifyFormat(
5297       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5298       "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
5299       "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
5300       getGoogleStyle());
5301 
5302   // However, there are exceptions, if a sufficient amount of lines can be
5303   // saved.
5304   // FIXME: The precise cut-offs wrt. the number of saved lines might need some
5305   // more adjusting.
5306   verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
5307                "                                  Cccccccccccccc cccccccccc,\n"
5308                "                                  Cccccccccccccc cccccccccc,\n"
5309                "                                  Cccccccccccccc cccccccccc,\n"
5310                "                                  Cccccccccccccc cccccccccc);");
5311   verifyFormat(
5312       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5313       "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
5314       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
5315       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
5316       getGoogleStyle());
5317   verifyFormat(
5318       "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
5319       "                                          Cccccccccccccc cccccccccc,\n"
5320       "                                          Cccccccccccccc cccccccccc,\n"
5321       "                                          Cccccccccccccc cccccccccc,\n"
5322       "                                          Cccccccccccccc cccccccccc,\n"
5323       "                                          Cccccccccccccc cccccccccc,\n"
5324       "                                          Cccccccccccccc cccccccccc);");
5325   verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
5326                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
5327                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
5328                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
5329                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
5330 
5331   // Break after multi-line parameters.
5332   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5333                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5334                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5335                "    bbbb bbbb);");
5336   verifyFormat("void SomeLoooooooooooongFunction(\n"
5337                "    std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
5338                "        aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5339                "    int bbbbbbbbbbbbb);");
5340 
5341   // Treat overloaded operators like other functions.
5342   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
5343                "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
5344   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
5345                "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
5346   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
5347                "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
5348   verifyGoogleFormat(
5349       "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
5350       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
5351   verifyGoogleFormat(
5352       "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
5353       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
5354   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5355                "    int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
5356   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
5357                "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
5358   verifyGoogleFormat(
5359       "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
5360       "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5361       "    bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
5362   verifyGoogleFormat("template <typename T>\n"
5363                      "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5364                      "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
5365                      "    aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
5366 
5367   FormatStyle Style = getLLVMStyle();
5368   Style.PointerAlignment = FormatStyle::PAS_Left;
5369   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5370                "    aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
5371                Style);
5372   verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
5373                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5374                Style);
5375 }
5376 
5377 TEST_F(FormatTest, DontBreakBeforeQualifiedOperator) {
5378   // Regression test for https://bugs.llvm.org/show_bug.cgi?id=40516:
5379   // Prefer keeping `::` followed by `operator` together.
5380   EXPECT_EQ("const aaaa::bbbbbbb &\n"
5381             "ccccccccc::operator++() {\n"
5382             "  stuff();\n"
5383             "}",
5384             format("const aaaa::bbbbbbb\n"
5385                    "&ccccccccc::operator++() { stuff(); }",
5386                    getLLVMStyleWithColumns(40)));
5387 }
5388 
5389 TEST_F(FormatTest, TrailingReturnType) {
5390   verifyFormat("auto foo() -> int;\n");
5391   // correct trailing return type spacing
5392   verifyFormat("auto operator->() -> int;\n");
5393   verifyFormat("auto operator++(int) -> int;\n");
5394 
5395   verifyFormat("struct S {\n"
5396                "  auto bar() const -> int;\n"
5397                "};");
5398   verifyFormat("template <size_t Order, typename T>\n"
5399                "auto load_img(const std::string &filename)\n"
5400                "    -> alias::tensor<Order, T, mem::tag::cpu> {}");
5401   verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
5402                "    -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
5403   verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
5404   verifyFormat("template <typename T>\n"
5405                "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
5406                "    -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
5407 
5408   // Not trailing return types.
5409   verifyFormat("void f() { auto a = b->c(); }");
5410 }
5411 
5412 TEST_F(FormatTest, DeductionGuides) {
5413   verifyFormat("template <class T> A(const T &, const T &) -> A<T &>;");
5414   verifyFormat("template <class T> explicit A(T &, T &&) -> A<T>;");
5415   verifyFormat("template <class... Ts> S(Ts...) -> S<Ts...>;");
5416   verifyFormat(
5417       "template <class... T>\n"
5418       "array(T &&...t) -> array<std::common_type_t<T...>, sizeof...(T)>;");
5419   verifyFormat("template <class T> A() -> A<decltype(p->foo<3>())>;");
5420   verifyFormat("template <class T> A() -> A<decltype(foo<traits<1>>)>;");
5421   verifyFormat("template <class T> A() -> A<sizeof(p->foo<1>)>;");
5422   verifyFormat("template <class T> A() -> A<(3 < 2)>;");
5423   verifyFormat("template <class T> A() -> A<((3) < (2))>;");
5424   verifyFormat("template <class T> x() -> x<1>;");
5425   verifyFormat("template <class T> explicit x(T &) -> x<1>;");
5426 
5427   // Ensure not deduction guides.
5428   verifyFormat("c()->f<int>();");
5429   verifyFormat("x()->foo<1>;");
5430   verifyFormat("x = p->foo<3>();");
5431   verifyFormat("x()->x<1>();");
5432   verifyFormat("x()->x<1>;");
5433 }
5434 
5435 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
5436   // Avoid breaking before trailing 'const' or other trailing annotations, if
5437   // they are not function-like.
5438   FormatStyle Style = getGoogleStyle();
5439   Style.ColumnLimit = 47;
5440   verifyFormat("void someLongFunction(\n"
5441                "    int someLoooooooooooooongParameter) const {\n}",
5442                getLLVMStyleWithColumns(47));
5443   verifyFormat("LoooooongReturnType\n"
5444                "someLoooooooongFunction() const {}",
5445                getLLVMStyleWithColumns(47));
5446   verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
5447                "    const {}",
5448                Style);
5449   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
5450                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
5451   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
5452                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
5453   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
5454                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
5455   verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
5456                "                   aaaaaaaaaaa aaaaa) const override;");
5457   verifyGoogleFormat(
5458       "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5459       "    const override;");
5460 
5461   // Even if the first parameter has to be wrapped.
5462   verifyFormat("void someLongFunction(\n"
5463                "    int someLongParameter) const {}",
5464                getLLVMStyleWithColumns(46));
5465   verifyFormat("void someLongFunction(\n"
5466                "    int someLongParameter) const {}",
5467                Style);
5468   verifyFormat("void someLongFunction(\n"
5469                "    int someLongParameter) override {}",
5470                Style);
5471   verifyFormat("void someLongFunction(\n"
5472                "    int someLongParameter) OVERRIDE {}",
5473                Style);
5474   verifyFormat("void someLongFunction(\n"
5475                "    int someLongParameter) final {}",
5476                Style);
5477   verifyFormat("void someLongFunction(\n"
5478                "    int someLongParameter) FINAL {}",
5479                Style);
5480   verifyFormat("void someLongFunction(\n"
5481                "    int parameter) const override {}",
5482                Style);
5483 
5484   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
5485   verifyFormat("void someLongFunction(\n"
5486                "    int someLongParameter) const\n"
5487                "{\n"
5488                "}",
5489                Style);
5490 
5491   Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths;
5492   verifyFormat("void someLongFunction(\n"
5493                "    int someLongParameter) const\n"
5494                "  {\n"
5495                "  }",
5496                Style);
5497 
5498   // Unless these are unknown annotations.
5499   verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
5500                "                  aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5501                "    LONG_AND_UGLY_ANNOTATION;");
5502 
5503   // Breaking before function-like trailing annotations is fine to keep them
5504   // close to their arguments.
5505   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5506                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
5507   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
5508                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
5509   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
5510                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
5511   verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
5512                      "    AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
5513   verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
5514 
5515   verifyFormat(
5516       "void aaaaaaaaaaaaaaaaaa()\n"
5517       "    __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
5518       "                   aaaaaaaaaaaaaaaaaaaaaaaaa));");
5519   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5520                "    __attribute__((unused));");
5521   verifyGoogleFormat(
5522       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5523       "    GUARDED_BY(aaaaaaaaaaaa);");
5524   verifyGoogleFormat(
5525       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5526       "    GUARDED_BY(aaaaaaaaaaaa);");
5527   verifyGoogleFormat(
5528       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
5529       "    aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5530   verifyGoogleFormat(
5531       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
5532       "    aaaaaaaaaaaaaaaaaaaaaaaaa;");
5533 }
5534 
5535 TEST_F(FormatTest, FunctionAnnotations) {
5536   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
5537                "int OldFunction(const string &parameter) {}");
5538   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
5539                "string OldFunction(const string &parameter) {}");
5540   verifyFormat("template <typename T>\n"
5541                "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
5542                "string OldFunction(const string &parameter) {}");
5543 
5544   // Not function annotations.
5545   verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5546                "                << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
5547   verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
5548                "       ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
5549   verifyFormat("MACRO(abc).function() // wrap\n"
5550                "    << abc;");
5551   verifyFormat("MACRO(abc)->function() // wrap\n"
5552                "    << abc;");
5553   verifyFormat("MACRO(abc)::function() // wrap\n"
5554                "    << abc;");
5555 }
5556 
5557 TEST_F(FormatTest, BreaksDesireably) {
5558   verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
5559                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
5560                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
5561   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5562                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
5563                "}");
5564 
5565   verifyFormat(
5566       "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5567       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
5568 
5569   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5570                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5571                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
5572 
5573   verifyFormat(
5574       "aaaaaaaa(aaaaaaaaaaaaa,\n"
5575       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5576       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
5577       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5578       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
5579 
5580   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
5581                "    (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5582 
5583   verifyFormat(
5584       "void f() {\n"
5585       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
5586       "                                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5587       "}");
5588   verifyFormat(
5589       "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5590       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
5591   verifyFormat(
5592       "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5593       "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
5594   verifyFormat(
5595       "aaaaaa(aaa,\n"
5596       "       new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5597       "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5598       "       aaaa);");
5599   verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5600                "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5601                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5602 
5603   // Indent consistently independent of call expression and unary operator.
5604   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
5605                "    dddddddddddddddddddddddddddddd));");
5606   verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
5607                "    dddddddddddddddddddddddddddddd));");
5608   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
5609                "    dddddddddddddddddddddddddddddd));");
5610 
5611   // This test case breaks on an incorrect memoization, i.e. an optimization not
5612   // taking into account the StopAt value.
5613   verifyFormat(
5614       "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
5615       "       aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
5616       "       aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
5617       "       (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5618 
5619   verifyFormat("{\n  {\n    {\n"
5620                "      Annotation.SpaceRequiredBefore =\n"
5621                "          Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
5622                "          Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
5623                "    }\n  }\n}");
5624 
5625   // Break on an outer level if there was a break on an inner level.
5626   EXPECT_EQ("f(g(h(a, // comment\n"
5627             "      b, c),\n"
5628             "    d, e),\n"
5629             "  x, y);",
5630             format("f(g(h(a, // comment\n"
5631                    "    b, c), d, e), x, y);"));
5632 
5633   // Prefer breaking similar line breaks.
5634   verifyFormat(
5635       "const int kTrackingOptions = NSTrackingMouseMoved |\n"
5636       "                             NSTrackingMouseEnteredAndExited |\n"
5637       "                             NSTrackingActiveAlways;");
5638 }
5639 
5640 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
5641   FormatStyle NoBinPacking = getGoogleStyle();
5642   NoBinPacking.BinPackParameters = false;
5643   NoBinPacking.BinPackArguments = true;
5644   verifyFormat("void f() {\n"
5645                "  f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
5646                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5647                "}",
5648                NoBinPacking);
5649   verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
5650                "       int aaaaaaaaaaaaaaaaaaaa,\n"
5651                "       int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5652                NoBinPacking);
5653 
5654   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
5655   verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5656                "                        vector<int> bbbbbbbbbbbbbbb);",
5657                NoBinPacking);
5658   // FIXME: This behavior difference is probably not wanted. However, currently
5659   // we cannot distinguish BreakBeforeParameter being set because of the wrapped
5660   // template arguments from BreakBeforeParameter being set because of the
5661   // one-per-line formatting.
5662   verifyFormat(
5663       "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
5664       "                                             aaaaaaaaaa> aaaaaaaaaa);",
5665       NoBinPacking);
5666   verifyFormat(
5667       "void fffffffffff(\n"
5668       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
5669       "        aaaaaaaaaa);");
5670 }
5671 
5672 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
5673   FormatStyle NoBinPacking = getGoogleStyle();
5674   NoBinPacking.BinPackParameters = false;
5675   NoBinPacking.BinPackArguments = false;
5676   verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
5677                "  aaaaaaaaaaaaaaaaaaaa,\n"
5678                "  aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
5679                NoBinPacking);
5680   verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
5681                "        aaaaaaaaaaaaa,\n"
5682                "        aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
5683                NoBinPacking);
5684   verifyFormat(
5685       "aaaaaaaa(aaaaaaaaaaaaa,\n"
5686       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5687       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
5688       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5689       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
5690       NoBinPacking);
5691   verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
5692                "    .aaaaaaaaaaaaaaaaaa();",
5693                NoBinPacking);
5694   verifyFormat("void f() {\n"
5695                "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5696                "      aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
5697                "}",
5698                NoBinPacking);
5699 
5700   verifyFormat(
5701       "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5702       "             aaaaaaaaaaaa,\n"
5703       "             aaaaaaaaaaaa);",
5704       NoBinPacking);
5705   verifyFormat(
5706       "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
5707       "                               ddddddddddddddddddddddddddddd),\n"
5708       "             test);",
5709       NoBinPacking);
5710 
5711   verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
5712                "            aaaaaaaaaaaaaaaaaaaaaaa,\n"
5713                "            aaaaaaaaaaaaaaaaaaaaaaa>\n"
5714                "    aaaaaaaaaaaaaaaaaa;",
5715                NoBinPacking);
5716   verifyFormat("a(\"a\"\n"
5717                "  \"a\",\n"
5718                "  a);");
5719 
5720   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
5721   verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
5722                "                aaaaaaaaa,\n"
5723                "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5724                NoBinPacking);
5725   verifyFormat(
5726       "void f() {\n"
5727       "  aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
5728       "      .aaaaaaa();\n"
5729       "}",
5730       NoBinPacking);
5731   verifyFormat(
5732       "template <class SomeType, class SomeOtherType>\n"
5733       "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
5734       NoBinPacking);
5735 }
5736 
5737 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
5738   FormatStyle Style = getLLVMStyleWithColumns(15);
5739   Style.ExperimentalAutoDetectBinPacking = true;
5740   EXPECT_EQ("aaa(aaaa,\n"
5741             "    aaaa,\n"
5742             "    aaaa);\n"
5743             "aaa(aaaa,\n"
5744             "    aaaa,\n"
5745             "    aaaa);",
5746             format("aaa(aaaa,\n" // one-per-line
5747                    "  aaaa,\n"
5748                    "    aaaa  );\n"
5749                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
5750                    Style));
5751   EXPECT_EQ("aaa(aaaa, aaaa,\n"
5752             "    aaaa);\n"
5753             "aaa(aaaa, aaaa,\n"
5754             "    aaaa);",
5755             format("aaa(aaaa,  aaaa,\n" // bin-packed
5756                    "    aaaa  );\n"
5757                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
5758                    Style));
5759 }
5760 
5761 TEST_F(FormatTest, FormatsBuilderPattern) {
5762   verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
5763                "    .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
5764                "    .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
5765                "    .StartsWith(\".init\", ORDER_INIT)\n"
5766                "    .StartsWith(\".fini\", ORDER_FINI)\n"
5767                "    .StartsWith(\".hash\", ORDER_HASH)\n"
5768                "    .Default(ORDER_TEXT);\n");
5769 
5770   verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
5771                "       aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
5772   verifyFormat("aaaaaaa->aaaaaaa\n"
5773                "    ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5774                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5775                "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
5776   verifyFormat(
5777       "aaaaaaa->aaaaaaa\n"
5778       "    ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5779       "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
5780   verifyFormat(
5781       "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
5782       "    aaaaaaaaaaaaaa);");
5783   verifyFormat(
5784       "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
5785       "    aaaaaa->aaaaaaaaaaaa()\n"
5786       "        ->aaaaaaaaaaaaaaaa(\n"
5787       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5788       "        ->aaaaaaaaaaaaaaaaa();");
5789   verifyGoogleFormat(
5790       "void f() {\n"
5791       "  someo->Add((new util::filetools::Handler(dir))\n"
5792       "                 ->OnEvent1(NewPermanentCallback(\n"
5793       "                     this, &HandlerHolderClass::EventHandlerCBA))\n"
5794       "                 ->OnEvent2(NewPermanentCallback(\n"
5795       "                     this, &HandlerHolderClass::EventHandlerCBB))\n"
5796       "                 ->OnEvent3(NewPermanentCallback(\n"
5797       "                     this, &HandlerHolderClass::EventHandlerCBC))\n"
5798       "                 ->OnEvent5(NewPermanentCallback(\n"
5799       "                     this, &HandlerHolderClass::EventHandlerCBD))\n"
5800       "                 ->OnEvent6(NewPermanentCallback(\n"
5801       "                     this, &HandlerHolderClass::EventHandlerCBE)));\n"
5802       "}");
5803 
5804   verifyFormat(
5805       "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
5806   verifyFormat("aaaaaaaaaaaaaaa()\n"
5807                "    .aaaaaaaaaaaaaaa()\n"
5808                "    .aaaaaaaaaaaaaaa()\n"
5809                "    .aaaaaaaaaaaaaaa()\n"
5810                "    .aaaaaaaaaaaaaaa();");
5811   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
5812                "    .aaaaaaaaaaaaaaa()\n"
5813                "    .aaaaaaaaaaaaaaa()\n"
5814                "    .aaaaaaaaaaaaaaa();");
5815   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
5816                "    .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
5817                "    .aaaaaaaaaaaaaaa();");
5818   verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
5819                "    ->aaaaaaaaaaaaaae(0)\n"
5820                "    ->aaaaaaaaaaaaaaa();");
5821 
5822   // Don't linewrap after very short segments.
5823   verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5824                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5825                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5826   verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5827                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5828                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5829   verifyFormat("aaa()\n"
5830                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5831                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5832                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5833 
5834   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
5835                "    .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5836                "    .has<bbbbbbbbbbbbbbbbbbbbb>();");
5837   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
5838                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
5839                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
5840 
5841   // Prefer not to break after empty parentheses.
5842   verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
5843                "    First->LastNewlineOffset);");
5844 
5845   // Prefer not to create "hanging" indents.
5846   verifyFormat(
5847       "return !soooooooooooooome_map\n"
5848       "            .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5849       "            .second;");
5850   verifyFormat(
5851       "return aaaaaaaaaaaaaaaa\n"
5852       "    .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
5853       "    .aaaa(aaaaaaaaaaaaaa);");
5854   // No hanging indent here.
5855   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
5856                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5857   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
5858                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5859   verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
5860                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5861                getLLVMStyleWithColumns(60));
5862   verifyFormat("aaaaaaaaaaaaaaaaaa\n"
5863                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
5864                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5865                getLLVMStyleWithColumns(59));
5866   verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5867                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5868                "    .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5869 
5870   // Dont break if only closing statements before member call
5871   verifyFormat("test() {\n"
5872                "  ([]() -> {\n"
5873                "    int b = 32;\n"
5874                "    return 3;\n"
5875                "  }).foo();\n"
5876                "}");
5877   verifyFormat("test() {\n"
5878                "  (\n"
5879                "      []() -> {\n"
5880                "        int b = 32;\n"
5881                "        return 3;\n"
5882                "      },\n"
5883                "      foo, bar)\n"
5884                "      .foo();\n"
5885                "}");
5886   verifyFormat("test() {\n"
5887                "  ([]() -> {\n"
5888                "    int b = 32;\n"
5889                "    return 3;\n"
5890                "  })\n"
5891                "      .foo()\n"
5892                "      .bar();\n"
5893                "}");
5894   verifyFormat("test() {\n"
5895                "  ([]() -> {\n"
5896                "    int b = 32;\n"
5897                "    return 3;\n"
5898                "  })\n"
5899                "      .foo(\"aaaaaaaaaaaaaaaaa\"\n"
5900                "           \"bbbb\");\n"
5901                "}",
5902                getLLVMStyleWithColumns(30));
5903 }
5904 
5905 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
5906   verifyFormat(
5907       "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
5908       "    bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
5909   verifyFormat(
5910       "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
5911       "    bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
5912 
5913   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
5914                "    ccccccccccccccccccccccccc) {\n}");
5915   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
5916                "    ccccccccccccccccccccccccc) {\n}");
5917 
5918   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
5919                "    ccccccccccccccccccccccccc) {\n}");
5920   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
5921                "    ccccccccccccccccccccccccc) {\n}");
5922 
5923   verifyFormat(
5924       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
5925       "    ccccccccccccccccccccccccc) {\n}");
5926   verifyFormat(
5927       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
5928       "    ccccccccccccccccccccccccc) {\n}");
5929 
5930   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
5931                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
5932                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
5933                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
5934   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
5935                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
5936                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
5937                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
5938 
5939   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
5940                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
5941                "    aaaaaaaaaaaaaaa != aa) {\n}");
5942   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
5943                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
5944                "    aaaaaaaaaaaaaaa != aa) {\n}");
5945 }
5946 
5947 TEST_F(FormatTest, BreaksAfterAssignments) {
5948   verifyFormat(
5949       "unsigned Cost =\n"
5950       "    TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
5951       "                        SI->getPointerAddressSpaceee());\n");
5952   verifyFormat(
5953       "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
5954       "    Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
5955 
5956   verifyFormat(
5957       "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
5958       "    aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
5959   verifyFormat("unsigned OriginalStartColumn =\n"
5960                "    SourceMgr.getSpellingColumnNumber(\n"
5961                "        Current.FormatTok.getStartOfNonWhitespace()) -\n"
5962                "    1;");
5963 }
5964 
5965 TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
5966   FormatStyle Style = getLLVMStyle();
5967   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5968                "    bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
5969                Style);
5970 
5971   Style.PenaltyBreakAssignment = 20;
5972   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
5973                "                                 cccccccccccccccccccccccccc;",
5974                Style);
5975 }
5976 
5977 TEST_F(FormatTest, AlignsAfterAssignments) {
5978   verifyFormat(
5979       "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5980       "             aaaaaaaaaaaaaaaaaaaaaaaaa;");
5981   verifyFormat(
5982       "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5983       "          aaaaaaaaaaaaaaaaaaaaaaaaa;");
5984   verifyFormat(
5985       "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5986       "           aaaaaaaaaaaaaaaaaaaaaaaaa;");
5987   verifyFormat(
5988       "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5989       "              aaaaaaaaaaaaaaaaaaaaaaaaa);");
5990   verifyFormat(
5991       "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5992       "                                            aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5993       "                                            aaaaaaaaaaaaaaaaaaaaaaaa;");
5994 }
5995 
5996 TEST_F(FormatTest, AlignsAfterReturn) {
5997   verifyFormat(
5998       "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5999       "       aaaaaaaaaaaaaaaaaaaaaaaaa;");
6000   verifyFormat(
6001       "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
6002       "        aaaaaaaaaaaaaaaaaaaaaaaaa);");
6003   verifyFormat(
6004       "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
6005       "       aaaaaaaaaaaaaaaaaaaaaa();");
6006   verifyFormat(
6007       "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
6008       "        aaaaaaaaaaaaaaaaaaaaaa());");
6009   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6010                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6011   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6012                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
6013                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6014   verifyFormat("return\n"
6015                "    // true if code is one of a or b.\n"
6016                "    code == a || code == b;");
6017 }
6018 
6019 TEST_F(FormatTest, AlignsAfterOpenBracket) {
6020   verifyFormat(
6021       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
6022       "                                                aaaaaaaaa aaaaaaa) {}");
6023   verifyFormat(
6024       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
6025       "                                               aaaaaaaaaaa aaaaaaaaa);");
6026   verifyFormat(
6027       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
6028       "                                             aaaaaaaaaaaaaaaaaaaaa));");
6029   FormatStyle Style = getLLVMStyle();
6030   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
6031   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6032                "    aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
6033                Style);
6034   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
6035                "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
6036                Style);
6037   verifyFormat("SomeLongVariableName->someFunction(\n"
6038                "    foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
6039                Style);
6040   verifyFormat(
6041       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
6042       "    aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
6043       Style);
6044   verifyFormat(
6045       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
6046       "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6047       Style);
6048   verifyFormat(
6049       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
6050       "    aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
6051       Style);
6052 
6053   verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
6054                "    ccccccc(aaaaaaaaaaaaaaaaa,         //\n"
6055                "        b));",
6056                Style);
6057 
6058   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
6059   Style.BinPackArguments = false;
6060   Style.BinPackParameters = false;
6061   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6062                "    aaaaaaaaaaa aaaaaaaa,\n"
6063                "    aaaaaaaaa aaaaaaa,\n"
6064                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
6065                Style);
6066   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
6067                "    aaaaaaaaaaa aaaaaaaaa,\n"
6068                "    aaaaaaaaaaa aaaaaaaaa,\n"
6069                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6070                Style);
6071   verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
6072                "    aaaaaaaaaaaaaaa,\n"
6073                "    aaaaaaaaaaaaaaaaaaaaa,\n"
6074                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
6075                Style);
6076   verifyFormat(
6077       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
6078       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
6079       Style);
6080   verifyFormat(
6081       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
6082       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
6083       Style);
6084   verifyFormat(
6085       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
6086       "    aaaaaaaaaaaaaaaaaaaaa(\n"
6087       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
6088       "    aaaaaaaaaaaaaaaa);",
6089       Style);
6090   verifyFormat(
6091       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
6092       "    aaaaaaaaaaaaaaaaaaaaa(\n"
6093       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
6094       "    aaaaaaaaaaaaaaaa);",
6095       Style);
6096 }
6097 
6098 TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
6099   FormatStyle Style = getLLVMStyleWithColumns(40);
6100   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
6101                "          bbbbbbbbbbbbbbbbbbbbbb);",
6102                Style);
6103   Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
6104   Style.AlignOperands = FormatStyle::OAS_DontAlign;
6105   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
6106                "          bbbbbbbbbbbbbbbbbbbbbb);",
6107                Style);
6108   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
6109   Style.AlignOperands = FormatStyle::OAS_Align;
6110   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
6111                "          bbbbbbbbbbbbbbbbbbbbbb);",
6112                Style);
6113   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
6114   Style.AlignOperands = FormatStyle::OAS_DontAlign;
6115   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
6116                "    bbbbbbbbbbbbbbbbbbbbbb);",
6117                Style);
6118 }
6119 
6120 TEST_F(FormatTest, BreaksConditionalExpressions) {
6121   verifyFormat(
6122       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6123       "                               ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6124       "                               : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6125   verifyFormat(
6126       "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
6127       "     aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6128       "                                : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6129   verifyFormat(
6130       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6131       "                                   : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6132   verifyFormat("aaaa(aaaaaaaaa, aaaaaaaaa,\n"
6133                "     aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6134                "             : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6135   verifyFormat(
6136       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
6137       "                                                    : aaaaaaaaaaaaa);");
6138   verifyFormat(
6139       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6140       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6141       "                                    : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6142       "                   aaaaaaaaaaaaa);");
6143   verifyFormat(
6144       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6145       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6146       "                   aaaaaaaaaaaaa);");
6147   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6148                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6149                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6150                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6151                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6152   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6153                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6154                "           ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6155                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6156                "           : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6157                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
6158                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6159   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6160                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6161                "           ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6162                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
6163                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6164   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6165                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6166                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6167   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
6168                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6169                "        ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6170                "        : aaaaaaaaaaaaaaaa;");
6171   verifyFormat(
6172       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6173       "    ? aaaaaaaaaaaaaaa\n"
6174       "    : aaaaaaaaaaaaaaa;");
6175   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
6176                "          aaaaaaaaa\n"
6177                "      ? b\n"
6178                "      : c);");
6179   verifyFormat("return aaaa == bbbb\n"
6180                "           // comment\n"
6181                "           ? aaaa\n"
6182                "           : bbbb;");
6183   verifyFormat("unsigned Indent =\n"
6184                "    format(TheLine.First,\n"
6185                "           IndentForLevel[TheLine.Level] >= 0\n"
6186                "               ? IndentForLevel[TheLine.Level]\n"
6187                "               : TheLine * 2,\n"
6188                "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
6189                getLLVMStyleWithColumns(60));
6190   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
6191                "                  ? aaaaaaaaaaaaaaa\n"
6192                "                  : bbbbbbbbbbbbbbb //\n"
6193                "                        ? ccccccccccccccc\n"
6194                "                        : ddddddddddddddd;");
6195   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
6196                "                  ? aaaaaaaaaaaaaaa\n"
6197                "                  : (bbbbbbbbbbbbbbb //\n"
6198                "                         ? ccccccccccccccc\n"
6199                "                         : ddddddddddddddd);");
6200   verifyFormat(
6201       "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6202       "                                      ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
6203       "                                            aaaaaaaaaaaaaaaaaaaaa +\n"
6204       "                                            aaaaaaaaaaaaaaaaaaaaa\n"
6205       "                                      : aaaaaaaaaa;");
6206   verifyFormat(
6207       "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6208       "                                   : aaaaaaaaaaaaaaaaaaaaaa\n"
6209       "                      : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6210 
6211   FormatStyle NoBinPacking = getLLVMStyle();
6212   NoBinPacking.BinPackArguments = false;
6213   verifyFormat(
6214       "void f() {\n"
6215       "  g(aaa,\n"
6216       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
6217       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6218       "        ? aaaaaaaaaaaaaaa\n"
6219       "        : aaaaaaaaaaaaaaa);\n"
6220       "}",
6221       NoBinPacking);
6222   verifyFormat(
6223       "void f() {\n"
6224       "  g(aaa,\n"
6225       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
6226       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6227       "        ?: aaaaaaaaaaaaaaa);\n"
6228       "}",
6229       NoBinPacking);
6230 
6231   verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
6232                "             // comment.\n"
6233                "             ccccccccccccccccccccccccccccccccccccccc\n"
6234                "                 ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6235                "                 : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
6236 
6237   // Assignments in conditional expressions. Apparently not uncommon :-(.
6238   verifyFormat("return a != b\n"
6239                "           // comment\n"
6240                "           ? a = b\n"
6241                "           : a = b;");
6242   verifyFormat("return a != b\n"
6243                "           // comment\n"
6244                "           ? a = a != b\n"
6245                "                     // comment\n"
6246                "                     ? a = b\n"
6247                "                     : a\n"
6248                "           : a;\n");
6249   verifyFormat("return a != b\n"
6250                "           // comment\n"
6251                "           ? a\n"
6252                "           : a = a != b\n"
6253                "                     // comment\n"
6254                "                     ? a = b\n"
6255                "                     : a;");
6256 
6257   // Chained conditionals
6258   FormatStyle Style = getLLVMStyle();
6259   Style.ColumnLimit = 70;
6260   Style.AlignOperands = FormatStyle::OAS_Align;
6261   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n"
6262                "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6263                "                        : 3333333333333333;",
6264                Style);
6265   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n"
6266                "       : bbbbbbbbbb     ? 2222222222222222\n"
6267                "                        : 3333333333333333;",
6268                Style);
6269   verifyFormat("return aaaaaaaaaa         ? 1111111111111111\n"
6270                "       : bbbbbbbbbbbbbbbb ? 2222222222222222\n"
6271                "                          : 3333333333333333;",
6272                Style);
6273   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n"
6274                "       : bbbbbbbbbbbbbb ? 222222\n"
6275                "                        : 333333;",
6276                Style);
6277   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n"
6278                "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6279                "       : cccccccccccccc ? 3333333333333333\n"
6280                "                        : 4444444444444444;",
6281                Style);
6282   verifyFormat("return aaaaaaaaaaaaaaaa ? (aaa ? bbb : ccc)\n"
6283                "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6284                "                        : 3333333333333333;",
6285                Style);
6286   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n"
6287                "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6288                "                        : (aaa ? bbb : ccc);",
6289                Style);
6290   verifyFormat(
6291       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6292       "                                             : cccccccccccccccccc)\n"
6293       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6294       "                        : 3333333333333333;",
6295       Style);
6296   verifyFormat(
6297       "return aaaaaaaaa        ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6298       "                                             : cccccccccccccccccc)\n"
6299       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6300       "                        : 3333333333333333;",
6301       Style);
6302   verifyFormat(
6303       "return aaaaaaaaa        ? a = (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6304       "                                             : dddddddddddddddddd)\n"
6305       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6306       "                        : 3333333333333333;",
6307       Style);
6308   verifyFormat(
6309       "return aaaaaaaaa        ? a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6310       "                                             : dddddddddddddddddd)\n"
6311       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6312       "                        : 3333333333333333;",
6313       Style);
6314   verifyFormat(
6315       "return aaaaaaaaa        ? 1111111111111111\n"
6316       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6317       "                        : a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6318       "                                             : dddddddddddddddddd)\n",
6319       Style);
6320   verifyFormat(
6321       "return aaaaaaaaaaaaaaaa ? 1111111111111111\n"
6322       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6323       "                        : (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6324       "                                             : cccccccccccccccccc);",
6325       Style);
6326   verifyFormat(
6327       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6328       "                           : ccccccccccccccc ? dddddddddddddddddd\n"
6329       "                                             : eeeeeeeeeeeeeeeeee)\n"
6330       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6331       "                        : 3333333333333333;",
6332       Style);
6333   verifyFormat(
6334       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaa    ? bbbbbbbbbbbbbbbbbb\n"
6335       "                           : ccccccccccccccc ? dddddddddddddddddd\n"
6336       "                                             : eeeeeeeeeeeeeeeeee)\n"
6337       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6338       "                        : 3333333333333333;",
6339       Style);
6340   verifyFormat(
6341       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6342       "                           : cccccccccccc    ? dddddddddddddddddd\n"
6343       "                                             : eeeeeeeeeeeeeeeeee)\n"
6344       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6345       "                        : 3333333333333333;",
6346       Style);
6347   verifyFormat(
6348       "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6349       "                                             : cccccccccccccccccc\n"
6350       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6351       "                        : 3333333333333333;",
6352       Style);
6353   verifyFormat(
6354       "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6355       "                          : cccccccccccccccc ? dddddddddddddddddd\n"
6356       "                                             : eeeeeeeeeeeeeeeeee\n"
6357       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6358       "                        : 3333333333333333;",
6359       Style);
6360   verifyFormat("return aaaaaaaaaaaaaaaaaaaaa\n"
6361                "           ? (aaaaaaaaaaaaaaaaaa   ? bbbbbbbbbbbbbbbbbb\n"
6362                "              : cccccccccccccccccc ? dddddddddddddddddd\n"
6363                "                                   : eeeeeeeeeeeeeeeeee)\n"
6364                "       : bbbbbbbbbbbbbbbbbbb ? 2222222222222222\n"
6365                "                             : 3333333333333333;",
6366                Style);
6367   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaa\n"
6368                "           ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6369                "             : cccccccccccccccc ? dddddddddddddddddd\n"
6370                "                                : eeeeeeeeeeeeeeeeee\n"
6371                "       : bbbbbbbbbbbbbbbbbbbbbbb ? 2222222222222222\n"
6372                "                                 : 3333333333333333;",
6373                Style);
6374 
6375   Style.AlignOperands = FormatStyle::OAS_DontAlign;
6376   Style.BreakBeforeTernaryOperators = false;
6377   // FIXME: Aligning the question marks is weird given DontAlign.
6378   // Consider disabling this alignment in this case. Also check whether this
6379   // will render the adjustment from https://reviews.llvm.org/D82199
6380   // unnecessary.
6381   verifyFormat("int x = aaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa :\n"
6382                "    bbbb                ? cccccccccccccccccc :\n"
6383                "                          ddddd;\n",
6384                Style);
6385 }
6386 
6387 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
6388   FormatStyle Style = getLLVMStyle();
6389   Style.BreakBeforeTernaryOperators = false;
6390   Style.ColumnLimit = 70;
6391   verifyFormat(
6392       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6393       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6394       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6395       Style);
6396   verifyFormat(
6397       "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
6398       "     aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6399       "                                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6400       Style);
6401   verifyFormat(
6402       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6403       "                                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6404       Style);
6405   verifyFormat("aaaa(aaaaaaaa, aaaaaaaaaa,\n"
6406                "     aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6407                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6408                Style);
6409   verifyFormat(
6410       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
6411       "                                                      aaaaaaaaaaaaa);",
6412       Style);
6413   verifyFormat(
6414       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6415       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6416       "                                      aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6417       "                   aaaaaaaaaaaaa);",
6418       Style);
6419   verifyFormat(
6420       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6421       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6422       "                   aaaaaaaaaaaaa);",
6423       Style);
6424   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6425                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6426                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
6427                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6428                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6429                Style);
6430   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6431                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6432                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6433                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
6434                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6435                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
6436                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6437                Style);
6438   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6439                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
6440                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6441                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
6442                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6443                Style);
6444   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6445                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6446                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
6447                Style);
6448   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
6449                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6450                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6451                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
6452                Style);
6453   verifyFormat(
6454       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6455       "    aaaaaaaaaaaaaaa :\n"
6456       "    aaaaaaaaaaaaaaa;",
6457       Style);
6458   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
6459                "          aaaaaaaaa ?\n"
6460                "      b :\n"
6461                "      c);",
6462                Style);
6463   verifyFormat("unsigned Indent =\n"
6464                "    format(TheLine.First,\n"
6465                "           IndentForLevel[TheLine.Level] >= 0 ?\n"
6466                "               IndentForLevel[TheLine.Level] :\n"
6467                "               TheLine * 2,\n"
6468                "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
6469                Style);
6470   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
6471                "                  aaaaaaaaaaaaaaa :\n"
6472                "                  bbbbbbbbbbbbbbb ? //\n"
6473                "                      ccccccccccccccc :\n"
6474                "                      ddddddddddddddd;",
6475                Style);
6476   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
6477                "                  aaaaaaaaaaaaaaa :\n"
6478                "                  (bbbbbbbbbbbbbbb ? //\n"
6479                "                       ccccccccccccccc :\n"
6480                "                       ddddddddddddddd);",
6481                Style);
6482   verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6483                "            /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
6484                "            ccccccccccccccccccccccccccc;",
6485                Style);
6486   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6487                "           aaaaa :\n"
6488                "           bbbbbbbbbbbbbbb + cccccccccccccccc;",
6489                Style);
6490 
6491   // Chained conditionals
6492   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n"
6493                "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6494                "                          3333333333333333;",
6495                Style);
6496   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n"
6497                "       bbbbbbbbbb       ? 2222222222222222 :\n"
6498                "                          3333333333333333;",
6499                Style);
6500   verifyFormat("return aaaaaaaaaa       ? 1111111111111111 :\n"
6501                "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6502                "                          3333333333333333;",
6503                Style);
6504   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n"
6505                "       bbbbbbbbbbbbbbbb ? 222222 :\n"
6506                "                          333333;",
6507                Style);
6508   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n"
6509                "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6510                "       cccccccccccccccc ? 3333333333333333 :\n"
6511                "                          4444444444444444;",
6512                Style);
6513   verifyFormat("return aaaaaaaaaaaaaaaa ? (aaa ? bbb : ccc) :\n"
6514                "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6515                "                          3333333333333333;",
6516                Style);
6517   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n"
6518                "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6519                "                          (aaa ? bbb : ccc);",
6520                Style);
6521   verifyFormat(
6522       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6523       "                                               cccccccccccccccccc) :\n"
6524       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6525       "                          3333333333333333;",
6526       Style);
6527   verifyFormat(
6528       "return aaaaaaaaa        ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6529       "                                               cccccccccccccccccc) :\n"
6530       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6531       "                          3333333333333333;",
6532       Style);
6533   verifyFormat(
6534       "return aaaaaaaaa        ? a = (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6535       "                                               dddddddddddddddddd) :\n"
6536       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6537       "                          3333333333333333;",
6538       Style);
6539   verifyFormat(
6540       "return aaaaaaaaa        ? a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6541       "                                               dddddddddddddddddd) :\n"
6542       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6543       "                          3333333333333333;",
6544       Style);
6545   verifyFormat(
6546       "return aaaaaaaaa        ? 1111111111111111 :\n"
6547       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6548       "                          a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6549       "                                               dddddddddddddddddd)\n",
6550       Style);
6551   verifyFormat(
6552       "return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n"
6553       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6554       "                          (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6555       "                                               cccccccccccccccccc);",
6556       Style);
6557   verifyFormat(
6558       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6559       "                           ccccccccccccccccc ? dddddddddddddddddd :\n"
6560       "                                               eeeeeeeeeeeeeeeeee) :\n"
6561       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6562       "                          3333333333333333;",
6563       Style);
6564   verifyFormat(
6565       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6566       "                           ccccccccccccc     ? dddddddddddddddddd :\n"
6567       "                                               eeeeeeeeeeeeeeeeee) :\n"
6568       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6569       "                          3333333333333333;",
6570       Style);
6571   verifyFormat(
6572       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaa     ? bbbbbbbbbbbbbbbbbb :\n"
6573       "                           ccccccccccccccccc ? dddddddddddddddddd :\n"
6574       "                                               eeeeeeeeeeeeeeeeee) :\n"
6575       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6576       "                          3333333333333333;",
6577       Style);
6578   verifyFormat(
6579       "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6580       "                                               cccccccccccccccccc :\n"
6581       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6582       "                          3333333333333333;",
6583       Style);
6584   verifyFormat(
6585       "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6586       "                          cccccccccccccccccc ? dddddddddddddddddd :\n"
6587       "                                               eeeeeeeeeeeeeeeeee :\n"
6588       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6589       "                          3333333333333333;",
6590       Style);
6591   verifyFormat("return aaaaaaaaaaaaaaaaaaaaa ?\n"
6592                "           (aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6593                "            cccccccccccccccccc ? dddddddddddddddddd :\n"
6594                "                                 eeeeeeeeeeeeeeeeee) :\n"
6595                "       bbbbbbbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6596                "                               3333333333333333;",
6597                Style);
6598   verifyFormat("return aaaaaaaaaaaaaaaaaaaaa ?\n"
6599                "           aaaaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6600                "           cccccccccccccccccccc ? dddddddddddddddddd :\n"
6601                "                                  eeeeeeeeeeeeeeeeee :\n"
6602                "       bbbbbbbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6603                "                               3333333333333333;",
6604                Style);
6605 }
6606 
6607 TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
6608   verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
6609                "     aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
6610   verifyFormat("bool a = true, b = false;");
6611 
6612   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6613                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
6614                "     bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
6615                "         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
6616   verifyFormat(
6617       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
6618       "         bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
6619       "     d = e && f;");
6620   verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
6621                "          c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
6622   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
6623                "          *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
6624   verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
6625                "          ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
6626 
6627   FormatStyle Style = getGoogleStyle();
6628   Style.PointerAlignment = FormatStyle::PAS_Left;
6629   Style.DerivePointerAlignment = false;
6630   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6631                "    *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
6632                "    *b = bbbbbbbbbbbbbbbbbbb;",
6633                Style);
6634   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
6635                "          *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
6636                Style);
6637   verifyFormat("vector<int*> a, b;", Style);
6638   verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
6639 }
6640 
6641 TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
6642   verifyFormat("arr[foo ? bar : baz];");
6643   verifyFormat("f()[foo ? bar : baz];");
6644   verifyFormat("(a + b)[foo ? bar : baz];");
6645   verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
6646 }
6647 
6648 TEST_F(FormatTest, AlignsStringLiterals) {
6649   verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
6650                "                                      \"short literal\");");
6651   verifyFormat(
6652       "looooooooooooooooooooooooongFunction(\n"
6653       "    \"short literal\"\n"
6654       "    \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
6655   verifyFormat("someFunction(\"Always break between multi-line\"\n"
6656                "             \" string literals\",\n"
6657                "             and, other, parameters);");
6658   EXPECT_EQ("fun + \"1243\" /* comment */\n"
6659             "      \"5678\";",
6660             format("fun + \"1243\" /* comment */\n"
6661                    "    \"5678\";",
6662                    getLLVMStyleWithColumns(28)));
6663   EXPECT_EQ(
6664       "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6665       "         \"aaaaaaaaaaaaaaaaaaaaa\"\n"
6666       "         \"aaaaaaaaaaaaaaaa\";",
6667       format("aaaaaa ="
6668              "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
6669              "aaaaaaaaaaaaaaaaaaaaa\" "
6670              "\"aaaaaaaaaaaaaaaa\";"));
6671   verifyFormat("a = a + \"a\"\n"
6672                "        \"a\"\n"
6673                "        \"a\";");
6674   verifyFormat("f(\"a\", \"b\"\n"
6675                "       \"c\");");
6676 
6677   verifyFormat(
6678       "#define LL_FORMAT \"ll\"\n"
6679       "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
6680       "       \"d, ddddddddd: %\" LL_FORMAT \"d\");");
6681 
6682   verifyFormat("#define A(X)          \\\n"
6683                "  \"aaaaa\" #X \"bbbbbb\" \\\n"
6684                "  \"ccccc\"",
6685                getLLVMStyleWithColumns(23));
6686   verifyFormat("#define A \"def\"\n"
6687                "f(\"abc\" A \"ghi\"\n"
6688                "  \"jkl\");");
6689 
6690   verifyFormat("f(L\"a\"\n"
6691                "  L\"b\");");
6692   verifyFormat("#define A(X)            \\\n"
6693                "  L\"aaaaa\" #X L\"bbbbbb\" \\\n"
6694                "  L\"ccccc\"",
6695                getLLVMStyleWithColumns(25));
6696 
6697   verifyFormat("f(@\"a\"\n"
6698                "  @\"b\");");
6699   verifyFormat("NSString s = @\"a\"\n"
6700                "             @\"b\"\n"
6701                "             @\"c\";");
6702   verifyFormat("NSString s = @\"a\"\n"
6703                "              \"b\"\n"
6704                "              \"c\";");
6705 }
6706 
6707 TEST_F(FormatTest, ReturnTypeBreakingStyle) {
6708   FormatStyle Style = getLLVMStyle();
6709   // No declarations or definitions should be moved to own line.
6710   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
6711   verifyFormat("class A {\n"
6712                "  int f() { return 1; }\n"
6713                "  int g();\n"
6714                "};\n"
6715                "int f() { return 1; }\n"
6716                "int g();\n",
6717                Style);
6718 
6719   // All declarations and definitions should have the return type moved to its
6720   // own line.
6721   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
6722   Style.TypenameMacros = {"LIST"};
6723   verifyFormat("SomeType\n"
6724                "funcdecl(LIST(uint64_t));",
6725                Style);
6726   verifyFormat("class E {\n"
6727                "  int\n"
6728                "  f() {\n"
6729                "    return 1;\n"
6730                "  }\n"
6731                "  int\n"
6732                "  g();\n"
6733                "};\n"
6734                "int\n"
6735                "f() {\n"
6736                "  return 1;\n"
6737                "}\n"
6738                "int\n"
6739                "g();\n",
6740                Style);
6741 
6742   // Top-level definitions, and no kinds of declarations should have the
6743   // return type moved to its own line.
6744   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
6745   verifyFormat("class B {\n"
6746                "  int f() { return 1; }\n"
6747                "  int g();\n"
6748                "};\n"
6749                "int\n"
6750                "f() {\n"
6751                "  return 1;\n"
6752                "}\n"
6753                "int g();\n",
6754                Style);
6755 
6756   // Top-level definitions and declarations should have the return type moved
6757   // to its own line.
6758   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
6759   verifyFormat("class C {\n"
6760                "  int f() { return 1; }\n"
6761                "  int g();\n"
6762                "};\n"
6763                "int\n"
6764                "f() {\n"
6765                "  return 1;\n"
6766                "}\n"
6767                "int\n"
6768                "g();\n",
6769                Style);
6770 
6771   // All definitions should have the return type moved to its own line, but no
6772   // kinds of declarations.
6773   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
6774   verifyFormat("class D {\n"
6775                "  int\n"
6776                "  f() {\n"
6777                "    return 1;\n"
6778                "  }\n"
6779                "  int g();\n"
6780                "};\n"
6781                "int\n"
6782                "f() {\n"
6783                "  return 1;\n"
6784                "}\n"
6785                "int g();\n",
6786                Style);
6787   verifyFormat("const char *\n"
6788                "f(void) {\n" // Break here.
6789                "  return \"\";\n"
6790                "}\n"
6791                "const char *bar(void);\n", // No break here.
6792                Style);
6793   verifyFormat("template <class T>\n"
6794                "T *\n"
6795                "f(T &c) {\n" // Break here.
6796                "  return NULL;\n"
6797                "}\n"
6798                "template <class T> T *f(T &c);\n", // No break here.
6799                Style);
6800   verifyFormat("class C {\n"
6801                "  int\n"
6802                "  operator+() {\n"
6803                "    return 1;\n"
6804                "  }\n"
6805                "  int\n"
6806                "  operator()() {\n"
6807                "    return 1;\n"
6808                "  }\n"
6809                "};\n",
6810                Style);
6811   verifyFormat("void\n"
6812                "A::operator()() {}\n"
6813                "void\n"
6814                "A::operator>>() {}\n"
6815                "void\n"
6816                "A::operator+() {}\n"
6817                "void\n"
6818                "A::operator*() {}\n"
6819                "void\n"
6820                "A::operator->() {}\n"
6821                "void\n"
6822                "A::operator void *() {}\n"
6823                "void\n"
6824                "A::operator void &() {}\n"
6825                "void\n"
6826                "A::operator void &&() {}\n"
6827                "void\n"
6828                "A::operator char *() {}\n"
6829                "void\n"
6830                "A::operator[]() {}\n"
6831                "void\n"
6832                "A::operator!() {}\n"
6833                "void\n"
6834                "A::operator**() {}\n"
6835                "void\n"
6836                "A::operator<Foo> *() {}\n"
6837                "void\n"
6838                "A::operator<Foo> **() {}\n"
6839                "void\n"
6840                "A::operator<Foo> &() {}\n"
6841                "void\n"
6842                "A::operator void **() {}\n",
6843                Style);
6844   verifyFormat("constexpr auto\n"
6845                "operator()() const -> reference {}\n"
6846                "constexpr auto\n"
6847                "operator>>() const -> reference {}\n"
6848                "constexpr auto\n"
6849                "operator+() const -> reference {}\n"
6850                "constexpr auto\n"
6851                "operator*() const -> reference {}\n"
6852                "constexpr auto\n"
6853                "operator->() const -> reference {}\n"
6854                "constexpr auto\n"
6855                "operator++() const -> reference {}\n"
6856                "constexpr auto\n"
6857                "operator void *() const -> reference {}\n"
6858                "constexpr auto\n"
6859                "operator void **() const -> reference {}\n"
6860                "constexpr auto\n"
6861                "operator void *() const -> reference {}\n"
6862                "constexpr auto\n"
6863                "operator void &() const -> reference {}\n"
6864                "constexpr auto\n"
6865                "operator void &&() const -> reference {}\n"
6866                "constexpr auto\n"
6867                "operator char *() const -> reference {}\n"
6868                "constexpr auto\n"
6869                "operator!() const -> reference {}\n"
6870                "constexpr auto\n"
6871                "operator[]() const -> reference {}\n",
6872                Style);
6873   verifyFormat("void *operator new(std::size_t s);", // No break here.
6874                Style);
6875   verifyFormat("void *\n"
6876                "operator new(std::size_t s) {}",
6877                Style);
6878   verifyFormat("void *\n"
6879                "operator delete[](void *ptr) {}",
6880                Style);
6881   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
6882   verifyFormat("const char *\n"
6883                "f(void)\n" // Break here.
6884                "{\n"
6885                "  return \"\";\n"
6886                "}\n"
6887                "const char *bar(void);\n", // No break here.
6888                Style);
6889   verifyFormat("template <class T>\n"
6890                "T *\n"     // Problem here: no line break
6891                "f(T &c)\n" // Break here.
6892                "{\n"
6893                "  return NULL;\n"
6894                "}\n"
6895                "template <class T> T *f(T &c);\n", // No break here.
6896                Style);
6897   verifyFormat("int\n"
6898                "foo(A<bool> a)\n"
6899                "{\n"
6900                "  return a;\n"
6901                "}\n",
6902                Style);
6903   verifyFormat("int\n"
6904                "foo(A<8> a)\n"
6905                "{\n"
6906                "  return a;\n"
6907                "}\n",
6908                Style);
6909   verifyFormat("int\n"
6910                "foo(A<B<bool>, 8> a)\n"
6911                "{\n"
6912                "  return a;\n"
6913                "}\n",
6914                Style);
6915   verifyFormat("int\n"
6916                "foo(A<B<8>, bool> a)\n"
6917                "{\n"
6918                "  return a;\n"
6919                "}\n",
6920                Style);
6921   verifyFormat("int\n"
6922                "foo(A<B<bool>, bool> a)\n"
6923                "{\n"
6924                "  return a;\n"
6925                "}\n",
6926                Style);
6927   verifyFormat("int\n"
6928                "foo(A<B<8>, 8> a)\n"
6929                "{\n"
6930                "  return a;\n"
6931                "}\n",
6932                Style);
6933 
6934   Style = getGNUStyle();
6935 
6936   // Test for comments at the end of function declarations.
6937   verifyFormat("void\n"
6938                "foo (int a, /*abc*/ int b) // def\n"
6939                "{\n"
6940                "}\n",
6941                Style);
6942 
6943   verifyFormat("void\n"
6944                "foo (int a, /* abc */ int b) /* def */\n"
6945                "{\n"
6946                "}\n",
6947                Style);
6948 
6949   // Definitions that should not break after return type
6950   verifyFormat("void foo (int a, int b); // def\n", Style);
6951   verifyFormat("void foo (int a, int b); /* def */\n", Style);
6952   verifyFormat("void foo (int a, int b);\n", Style);
6953 }
6954 
6955 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
6956   FormatStyle NoBreak = getLLVMStyle();
6957   NoBreak.AlwaysBreakBeforeMultilineStrings = false;
6958   FormatStyle Break = getLLVMStyle();
6959   Break.AlwaysBreakBeforeMultilineStrings = true;
6960   verifyFormat("aaaa = \"bbbb\"\n"
6961                "       \"cccc\";",
6962                NoBreak);
6963   verifyFormat("aaaa =\n"
6964                "    \"bbbb\"\n"
6965                "    \"cccc\";",
6966                Break);
6967   verifyFormat("aaaa(\"bbbb\"\n"
6968                "     \"cccc\");",
6969                NoBreak);
6970   verifyFormat("aaaa(\n"
6971                "    \"bbbb\"\n"
6972                "    \"cccc\");",
6973                Break);
6974   verifyFormat("aaaa(qqq, \"bbbb\"\n"
6975                "          \"cccc\");",
6976                NoBreak);
6977   verifyFormat("aaaa(qqq,\n"
6978                "     \"bbbb\"\n"
6979                "     \"cccc\");",
6980                Break);
6981   verifyFormat("aaaa(qqq,\n"
6982                "     L\"bbbb\"\n"
6983                "     L\"cccc\");",
6984                Break);
6985   verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
6986                "                      \"bbbb\"));",
6987                Break);
6988   verifyFormat("string s = someFunction(\n"
6989                "    \"abc\"\n"
6990                "    \"abc\");",
6991                Break);
6992 
6993   // As we break before unary operators, breaking right after them is bad.
6994   verifyFormat("string foo = abc ? \"x\"\n"
6995                "                   \"blah blah blah blah blah blah\"\n"
6996                "                 : \"y\";",
6997                Break);
6998 
6999   // Don't break if there is no column gain.
7000   verifyFormat("f(\"aaaa\"\n"
7001                "  \"bbbb\");",
7002                Break);
7003 
7004   // Treat literals with escaped newlines like multi-line string literals.
7005   EXPECT_EQ("x = \"a\\\n"
7006             "b\\\n"
7007             "c\";",
7008             format("x = \"a\\\n"
7009                    "b\\\n"
7010                    "c\";",
7011                    NoBreak));
7012   EXPECT_EQ("xxxx =\n"
7013             "    \"a\\\n"
7014             "b\\\n"
7015             "c\";",
7016             format("xxxx = \"a\\\n"
7017                    "b\\\n"
7018                    "c\";",
7019                    Break));
7020 
7021   EXPECT_EQ("NSString *const kString =\n"
7022             "    @\"aaaa\"\n"
7023             "    @\"bbbb\";",
7024             format("NSString *const kString = @\"aaaa\"\n"
7025                    "@\"bbbb\";",
7026                    Break));
7027 
7028   Break.ColumnLimit = 0;
7029   verifyFormat("const char *hello = \"hello llvm\";", Break);
7030 }
7031 
7032 TEST_F(FormatTest, AlignsPipes) {
7033   verifyFormat(
7034       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7035       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7036       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7037   verifyFormat(
7038       "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
7039       "                     << aaaaaaaaaaaaaaaaaaaa;");
7040   verifyFormat(
7041       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7042       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7043   verifyFormat(
7044       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
7045       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7046   verifyFormat(
7047       "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
7048       "                \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
7049       "             << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
7050   verifyFormat(
7051       "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7052       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
7053       "         << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7054   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7055                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7056                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
7057                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
7058   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
7059                "             << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
7060   verifyFormat(
7061       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7062       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7063   verifyFormat(
7064       "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
7065       "                                       aaaaaaaaaaaaaaaaaaaaaaaaaa);");
7066 
7067   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
7068                "             << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
7069   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7070                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7071                "                    aaaaaaaaaaaaaaaaaaaaa)\n"
7072                "             << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
7073   verifyFormat("LOG_IF(aaa == //\n"
7074                "       bbb)\n"
7075                "    << a << b;");
7076 
7077   // But sometimes, breaking before the first "<<" is desirable.
7078   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
7079                "    << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
7080   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
7081                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7082                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7083   verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
7084                "    << BEF << IsTemplate << Description << E->getType();");
7085   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
7086                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7087                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7088   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
7089                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7090                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
7091                "    << aaa;");
7092 
7093   verifyFormat(
7094       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7095       "                    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
7096 
7097   // Incomplete string literal.
7098   EXPECT_EQ("llvm::errs() << \"\n"
7099             "             << a;",
7100             format("llvm::errs() << \"\n<<a;"));
7101 
7102   verifyFormat("void f() {\n"
7103                "  CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
7104                "      << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
7105                "}");
7106 
7107   // Handle 'endl'.
7108   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
7109                "             << bbbbbbbbbbbbbbbbbbbbbb << endl;");
7110   verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
7111 
7112   // Handle '\n'.
7113   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
7114                "             << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
7115   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
7116                "             << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
7117   verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
7118                "             << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
7119   verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
7120 }
7121 
7122 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
7123   verifyFormat("return out << \"somepacket = {\\n\"\n"
7124                "           << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
7125                "           << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
7126                "           << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
7127                "           << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
7128                "           << \"}\";");
7129 
7130   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
7131                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
7132                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
7133   verifyFormat(
7134       "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
7135       "             << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
7136       "             << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
7137       "             << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
7138       "             << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
7139   verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
7140                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
7141   verifyFormat(
7142       "void f() {\n"
7143       "  llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
7144       "               << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
7145       "}");
7146 
7147   // Breaking before the first "<<" is generally not desirable.
7148   verifyFormat(
7149       "llvm::errs()\n"
7150       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7151       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7152       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7153       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
7154       getLLVMStyleWithColumns(70));
7155   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
7156                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7157                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
7158                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7159                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
7160                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
7161                getLLVMStyleWithColumns(70));
7162 
7163   verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
7164                "           \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
7165                "           \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
7166   verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
7167                "                  \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
7168                "                  \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
7169   verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
7170                "           (aaaa + aaaa);",
7171                getLLVMStyleWithColumns(40));
7172   verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
7173                "                  (aaaaaaa + aaaaa));",
7174                getLLVMStyleWithColumns(40));
7175   verifyFormat(
7176       "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
7177       "                  SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
7178       "                  bbbbbbbbbbbbbbbbbbbbbbb);");
7179 }
7180 
7181 TEST_F(FormatTest, UnderstandsEquals) {
7182   verifyFormat(
7183       "aaaaaaaaaaaaaaaaa =\n"
7184       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7185   verifyFormat(
7186       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7187       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
7188   verifyFormat(
7189       "if (a) {\n"
7190       "  f();\n"
7191       "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7192       "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
7193       "}");
7194 
7195   verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7196                "        100000000 + 10000000) {\n}");
7197 }
7198 
7199 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
7200   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
7201                "    .looooooooooooooooooooooooooooooooooooooongFunction();");
7202 
7203   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
7204                "    ->looooooooooooooooooooooooooooooooooooooongFunction();");
7205 
7206   verifyFormat(
7207       "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
7208       "                                                          Parameter2);");
7209 
7210   verifyFormat(
7211       "ShortObject->shortFunction(\n"
7212       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
7213       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
7214 
7215   verifyFormat("loooooooooooooongFunction(\n"
7216                "    LoooooooooooooongObject->looooooooooooooooongFunction());");
7217 
7218   verifyFormat(
7219       "function(LoooooooooooooooooooooooooooooooooooongObject\n"
7220       "             ->loooooooooooooooooooooooooooooooooooooooongFunction());");
7221 
7222   verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
7223                "    .WillRepeatedly(Return(SomeValue));");
7224   verifyFormat("void f() {\n"
7225                "  EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
7226                "      .Times(2)\n"
7227                "      .WillRepeatedly(Return(SomeValue));\n"
7228                "}");
7229   verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
7230                "    ccccccccccccccccccccccc);");
7231   verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7232                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
7233                "          .aaaaa(aaaaa),\n"
7234                "      aaaaaaaaaaaaaaaaaaaaa);");
7235   verifyFormat("void f() {\n"
7236                "  aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7237                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
7238                "}");
7239   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7240                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
7241                "    .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7242                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7243                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
7244   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7245                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7246                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7247                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
7248                "}");
7249 
7250   // Here, it is not necessary to wrap at "." or "->".
7251   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
7252                "    aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
7253   verifyFormat(
7254       "aaaaaaaaaaa->aaaaaaaaa(\n"
7255       "    aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7256       "    aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
7257 
7258   verifyFormat(
7259       "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7260       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
7261   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
7262                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
7263   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
7264                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
7265 
7266   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7267                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
7268                "    .a();");
7269 
7270   FormatStyle NoBinPacking = getLLVMStyle();
7271   NoBinPacking.BinPackParameters = false;
7272   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
7273                "    .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
7274                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
7275                "                         aaaaaaaaaaaaaaaaaaa,\n"
7276                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
7277                NoBinPacking);
7278 
7279   // If there is a subsequent call, change to hanging indentation.
7280   verifyFormat(
7281       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7282       "                         aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
7283       "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
7284   verifyFormat(
7285       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7286       "    aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
7287   verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7288                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
7289                "                 .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
7290   verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7291                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
7292                "               .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
7293 }
7294 
7295 TEST_F(FormatTest, WrapsTemplateDeclarations) {
7296   verifyFormat("template <typename T>\n"
7297                "virtual void loooooooooooongFunction(int Param1, int Param2);");
7298   verifyFormat("template <typename T>\n"
7299                "// T should be one of {A, B}.\n"
7300                "virtual void loooooooooooongFunction(int Param1, int Param2);");
7301   verifyFormat(
7302       "template <typename T>\n"
7303       "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
7304   verifyFormat("template <typename T>\n"
7305                "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
7306                "       int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
7307   verifyFormat(
7308       "template <typename T>\n"
7309       "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
7310       "                                      int Paaaaaaaaaaaaaaaaaaaaram2);");
7311   verifyFormat(
7312       "template <typename T>\n"
7313       "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
7314       "                    aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
7315       "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7316   verifyFormat("template <typename T>\n"
7317                "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7318                "    int aaaaaaaaaaaaaaaaaaaaaa);");
7319   verifyFormat(
7320       "template <typename T1, typename T2 = char, typename T3 = char,\n"
7321       "          typename T4 = char>\n"
7322       "void f();");
7323   verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
7324                "          template <typename> class cccccccccccccccccccccc,\n"
7325                "          typename ddddddddddddd>\n"
7326                "class C {};");
7327   verifyFormat(
7328       "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
7329       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7330 
7331   verifyFormat("void f() {\n"
7332                "  a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
7333                "      a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
7334                "}");
7335 
7336   verifyFormat("template <typename T> class C {};");
7337   verifyFormat("template <typename T> void f();");
7338   verifyFormat("template <typename T> void f() {}");
7339   verifyFormat(
7340       "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
7341       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7342       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
7343       "    new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
7344       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7345       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
7346       "        bbbbbbbbbbbbbbbbbbbbbbbb);",
7347       getLLVMStyleWithColumns(72));
7348   EXPECT_EQ("static_cast<A< //\n"
7349             "    B> *>(\n"
7350             "\n"
7351             ");",
7352             format("static_cast<A<//\n"
7353                    "    B>*>(\n"
7354                    "\n"
7355                    "    );"));
7356   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7357                "    const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
7358 
7359   FormatStyle AlwaysBreak = getLLVMStyle();
7360   AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
7361   verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
7362   verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
7363   verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
7364   verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7365                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
7366                "    ccccccccccccccccccccccccccccccccccccccccccccccc);");
7367   verifyFormat("template <template <typename> class Fooooooo,\n"
7368                "          template <typename> class Baaaaaaar>\n"
7369                "struct C {};",
7370                AlwaysBreak);
7371   verifyFormat("template <typename T> // T can be A, B or C.\n"
7372                "struct C {};",
7373                AlwaysBreak);
7374   verifyFormat("template <enum E> class A {\n"
7375                "public:\n"
7376                "  E *f();\n"
7377                "};");
7378 
7379   FormatStyle NeverBreak = getLLVMStyle();
7380   NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No;
7381   verifyFormat("template <typename T> class C {};", NeverBreak);
7382   verifyFormat("template <typename T> void f();", NeverBreak);
7383   verifyFormat("template <typename T> void f() {}", NeverBreak);
7384   verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa "
7385                "bbbbbbbbbbbbbbbbbbbb) {}",
7386                NeverBreak);
7387   verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7388                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
7389                "    ccccccccccccccccccccccccccccccccccccccccccccccc);",
7390                NeverBreak);
7391   verifyFormat("template <template <typename> class Fooooooo,\n"
7392                "          template <typename> class Baaaaaaar>\n"
7393                "struct C {};",
7394                NeverBreak);
7395   verifyFormat("template <typename T> // T can be A, B or C.\n"
7396                "struct C {};",
7397                NeverBreak);
7398   verifyFormat("template <enum E> class A {\n"
7399                "public:\n"
7400                "  E *f();\n"
7401                "};",
7402                NeverBreak);
7403   NeverBreak.PenaltyBreakTemplateDeclaration = 100;
7404   verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa "
7405                "bbbbbbbbbbbbbbbbbbbb) {}",
7406                NeverBreak);
7407 }
7408 
7409 TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) {
7410   FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
7411   Style.ColumnLimit = 60;
7412   EXPECT_EQ("// Baseline - no comments.\n"
7413             "template <\n"
7414             "    typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
7415             "void f() {}",
7416             format("// Baseline - no comments.\n"
7417                    "template <\n"
7418                    "    typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
7419                    "void f() {}",
7420                    Style));
7421 
7422   EXPECT_EQ("template <\n"
7423             "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  // trailing\n"
7424             "void f() {}",
7425             format("template <\n"
7426                    "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
7427                    "void f() {}",
7428                    Style));
7429 
7430   EXPECT_EQ(
7431       "template <\n"
7432       "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n"
7433       "void f() {}",
7434       format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  /* line */\n"
7435              "void f() {}",
7436              Style));
7437 
7438   EXPECT_EQ(
7439       "template <\n"
7440       "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  // trailing\n"
7441       "                                               // multiline\n"
7442       "void f() {}",
7443       format("template <\n"
7444              "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
7445              "                                              // multiline\n"
7446              "void f() {}",
7447              Style));
7448 
7449   EXPECT_EQ(
7450       "template <typename aaaaaaaaaa<\n"
7451       "    bbbbbbbbbbbb>::value>  // trailing loooong\n"
7452       "void f() {}",
7453       format(
7454           "template <\n"
7455           "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n"
7456           "void f() {}",
7457           Style));
7458 }
7459 
7460 TEST_F(FormatTest, WrapsTemplateParameters) {
7461   FormatStyle Style = getLLVMStyle();
7462   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
7463   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
7464   verifyFormat(
7465       "template <typename... a> struct q {};\n"
7466       "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
7467       "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
7468       "    y;",
7469       Style);
7470   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
7471   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
7472   verifyFormat(
7473       "template <typename... a> struct r {};\n"
7474       "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
7475       "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
7476       "    y;",
7477       Style);
7478   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
7479   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
7480   verifyFormat("template <typename... a> struct s {};\n"
7481                "extern s<\n"
7482                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
7483                "aaaaaaaaaaaaaaaaaaaaaa,\n"
7484                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
7485                "aaaaaaaaaaaaaaaaaaaaaa>\n"
7486                "    y;",
7487                Style);
7488   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
7489   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
7490   verifyFormat("template <typename... a> struct t {};\n"
7491                "extern t<\n"
7492                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
7493                "aaaaaaaaaaaaaaaaaaaaaa,\n"
7494                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
7495                "aaaaaaaaaaaaaaaaaaaaaa>\n"
7496                "    y;",
7497                Style);
7498 }
7499 
7500 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
7501   verifyFormat(
7502       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
7503       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
7504   verifyFormat(
7505       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
7506       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7507       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
7508 
7509   // FIXME: Should we have the extra indent after the second break?
7510   verifyFormat(
7511       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
7512       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
7513       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
7514 
7515   verifyFormat(
7516       "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
7517       "                    cccccccccccccccccccccccccccccccccccccccccccccc());");
7518 
7519   // Breaking at nested name specifiers is generally not desirable.
7520   verifyFormat(
7521       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7522       "    aaaaaaaaaaaaaaaaaaaaaaa);");
7523 
7524   verifyFormat("aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
7525                "                   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
7526                "                       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7527                "                   aaaaaaaaaaaaaaaaaaaaa);",
7528                getLLVMStyleWithColumns(74));
7529 
7530   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
7531                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7532                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
7533 }
7534 
7535 TEST_F(FormatTest, UnderstandsTemplateParameters) {
7536   verifyFormat("A<int> a;");
7537   verifyFormat("A<A<A<int>>> a;");
7538   verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
7539   verifyFormat("bool x = a < 1 || 2 > a;");
7540   verifyFormat("bool x = 5 < f<int>();");
7541   verifyFormat("bool x = f<int>() > 5;");
7542   verifyFormat("bool x = 5 < a<int>::x;");
7543   verifyFormat("bool x = a < 4 ? a > 2 : false;");
7544   verifyFormat("bool x = f() ? a < 2 : a > 2;");
7545 
7546   verifyGoogleFormat("A<A<int>> a;");
7547   verifyGoogleFormat("A<A<A<int>>> a;");
7548   verifyGoogleFormat("A<A<A<A<int>>>> a;");
7549   verifyGoogleFormat("A<A<int> > a;");
7550   verifyGoogleFormat("A<A<A<int> > > a;");
7551   verifyGoogleFormat("A<A<A<A<int> > > > a;");
7552   verifyGoogleFormat("A<::A<int>> a;");
7553   verifyGoogleFormat("A<::A> a;");
7554   verifyGoogleFormat("A< ::A> a;");
7555   verifyGoogleFormat("A< ::A<int> > a;");
7556   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
7557   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
7558   EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
7559   EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
7560   EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
7561             format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
7562 
7563   verifyFormat("A<A<int>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
7564 
7565   // template closer followed by a token that starts with > or =
7566   verifyFormat("bool b = a<1> > 1;");
7567   verifyFormat("bool b = a<1> >= 1;");
7568   verifyFormat("int i = a<1> >> 1;");
7569   FormatStyle Style = getLLVMStyle();
7570   Style.SpaceBeforeAssignmentOperators = false;
7571   verifyFormat("bool b= a<1> == 1;", Style);
7572   verifyFormat("a<int> = 1;", Style);
7573   verifyFormat("a<int> >>= 1;", Style);
7574 
7575   verifyFormat("test >> a >> b;");
7576   verifyFormat("test << a >> b;");
7577 
7578   verifyFormat("f<int>();");
7579   verifyFormat("template <typename T> void f() {}");
7580   verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
7581   verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
7582                "sizeof(char)>::type>;");
7583   verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
7584   verifyFormat("f(a.operator()<A>());");
7585   verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7586                "      .template operator()<A>());",
7587                getLLVMStyleWithColumns(35));
7588 
7589   // Not template parameters.
7590   verifyFormat("return a < b && c > d;");
7591   verifyFormat("void f() {\n"
7592                "  while (a < b && c > d) {\n"
7593                "  }\n"
7594                "}");
7595   verifyFormat("template <typename... Types>\n"
7596                "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
7597 
7598   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7599                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
7600                getLLVMStyleWithColumns(60));
7601   verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
7602   verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
7603   verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
7604   verifyFormat("some_templated_type<decltype([](int i) { return i; })>");
7605 }
7606 
7607 TEST_F(FormatTest, UnderstandsShiftOperators) {
7608   verifyFormat("if (i < x >> 1)");
7609   verifyFormat("while (i < x >> 1)");
7610   verifyFormat("for (unsigned i = 0; i < i; ++i, v = v >> 1)");
7611   verifyFormat("for (unsigned i = 0; i < x >> 1; ++i, v = v >> 1)");
7612   verifyFormat(
7613       "for (std::vector<int>::iterator i = 0; i < x >> 1; ++i, v = v >> 1)");
7614   verifyFormat("Foo.call<Bar<Function>>()");
7615   verifyFormat("if (Foo.call<Bar<Function>>() == 0)");
7616   verifyFormat("for (std::vector<std::pair<int>>::iterator i = 0; i < x >> 1; "
7617                "++i, v = v >> 1)");
7618   verifyFormat("if (w<u<v<x>>, 1>::t)");
7619 }
7620 
7621 TEST_F(FormatTest, BitshiftOperatorWidth) {
7622   EXPECT_EQ("int a = 1 << 2; /* foo\n"
7623             "                   bar */",
7624             format("int    a=1<<2;  /* foo\n"
7625                    "                   bar */"));
7626 
7627   EXPECT_EQ("int b = 256 >> 1; /* foo\n"
7628             "                     bar */",
7629             format("int  b  =256>>1 ;  /* foo\n"
7630                    "                      bar */"));
7631 }
7632 
7633 TEST_F(FormatTest, UnderstandsBinaryOperators) {
7634   verifyFormat("COMPARE(a, ==, b);");
7635   verifyFormat("auto s = sizeof...(Ts) - 1;");
7636 }
7637 
7638 TEST_F(FormatTest, UnderstandsPointersToMembers) {
7639   verifyFormat("int A::*x;");
7640   verifyFormat("int (S::*func)(void *);");
7641   verifyFormat("void f() { int (S::*func)(void *); }");
7642   verifyFormat("typedef bool *(Class::*Member)() const;");
7643   verifyFormat("void f() {\n"
7644                "  (a->*f)();\n"
7645                "  a->*x;\n"
7646                "  (a.*f)();\n"
7647                "  ((*a).*f)();\n"
7648                "  a.*x;\n"
7649                "}");
7650   verifyFormat("void f() {\n"
7651                "  (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
7652                "      aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
7653                "}");
7654   verifyFormat(
7655       "(aaaaaaaaaa->*bbbbbbb)(\n"
7656       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
7657   FormatStyle Style = getLLVMStyle();
7658   Style.PointerAlignment = FormatStyle::PAS_Left;
7659   verifyFormat("typedef bool* (Class::*Member)() const;", Style);
7660 }
7661 
7662 TEST_F(FormatTest, UnderstandsUnaryOperators) {
7663   verifyFormat("int a = -2;");
7664   verifyFormat("f(-1, -2, -3);");
7665   verifyFormat("a[-1] = 5;");
7666   verifyFormat("int a = 5 + -2;");
7667   verifyFormat("if (i == -1) {\n}");
7668   verifyFormat("if (i != -1) {\n}");
7669   verifyFormat("if (i > -1) {\n}");
7670   verifyFormat("if (i < -1) {\n}");
7671   verifyFormat("++(a->f());");
7672   verifyFormat("--(a->f());");
7673   verifyFormat("(a->f())++;");
7674   verifyFormat("a[42]++;");
7675   verifyFormat("if (!(a->f())) {\n}");
7676   verifyFormat("if (!+i) {\n}");
7677   verifyFormat("~&a;");
7678 
7679   verifyFormat("a-- > b;");
7680   verifyFormat("b ? -a : c;");
7681   verifyFormat("n * sizeof char16;");
7682   verifyFormat("n * alignof char16;", getGoogleStyle());
7683   verifyFormat("sizeof(char);");
7684   verifyFormat("alignof(char);", getGoogleStyle());
7685 
7686   verifyFormat("return -1;");
7687   verifyFormat("throw -1;");
7688   verifyFormat("switch (a) {\n"
7689                "case -1:\n"
7690                "  break;\n"
7691                "}");
7692   verifyFormat("#define X -1");
7693   verifyFormat("#define X -kConstant");
7694 
7695   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
7696   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
7697 
7698   verifyFormat("int a = /* confusing comment */ -1;");
7699   // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
7700   verifyFormat("int a = i /* confusing comment */++;");
7701 
7702   verifyFormat("co_yield -1;");
7703   verifyFormat("co_return -1;");
7704 }
7705 
7706 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
7707   verifyFormat("if (!aaaaaaaaaa( // break\n"
7708                "        aaaaa)) {\n"
7709                "}");
7710   verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
7711                "    aaaaa));");
7712   verifyFormat("*aaa = aaaaaaa( // break\n"
7713                "    bbbbbb);");
7714 }
7715 
7716 TEST_F(FormatTest, UnderstandsOverloadedOperators) {
7717   verifyFormat("bool operator<();");
7718   verifyFormat("bool operator>();");
7719   verifyFormat("bool operator=();");
7720   verifyFormat("bool operator==();");
7721   verifyFormat("bool operator!=();");
7722   verifyFormat("int operator+();");
7723   verifyFormat("int operator++();");
7724   verifyFormat("int operator++(int) volatile noexcept;");
7725   verifyFormat("bool operator,();");
7726   verifyFormat("bool operator();");
7727   verifyFormat("bool operator()();");
7728   verifyFormat("bool operator[]();");
7729   verifyFormat("operator bool();");
7730   verifyFormat("operator int();");
7731   verifyFormat("operator void *();");
7732   verifyFormat("operator SomeType<int>();");
7733   verifyFormat("operator SomeType<int, int>();");
7734   verifyFormat("operator SomeType<SomeType<int>>();");
7735   verifyFormat("void *operator new(std::size_t size);");
7736   verifyFormat("void *operator new[](std::size_t size);");
7737   verifyFormat("void operator delete(void *ptr);");
7738   verifyFormat("void operator delete[](void *ptr);");
7739   verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
7740                "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
7741   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
7742                "    aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
7743 
7744   verifyFormat(
7745       "ostream &operator<<(ostream &OutputStream,\n"
7746       "                    SomeReallyLongType WithSomeReallyLongValue);");
7747   verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
7748                "               const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
7749                "  return left.group < right.group;\n"
7750                "}");
7751   verifyFormat("SomeType &operator=(const SomeType &S);");
7752   verifyFormat("f.template operator()<int>();");
7753 
7754   verifyGoogleFormat("operator void*();");
7755   verifyGoogleFormat("operator SomeType<SomeType<int>>();");
7756   verifyGoogleFormat("operator ::A();");
7757 
7758   verifyFormat("using A::operator+;");
7759   verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
7760                "int i;");
7761 }
7762 
7763 TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
7764   verifyFormat("Deleted &operator=(const Deleted &) & = default;");
7765   verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
7766   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
7767   verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
7768   verifyFormat("Deleted &operator=(const Deleted &) &;");
7769   verifyFormat("Deleted &operator=(const Deleted &) &&;");
7770   verifyFormat("SomeType MemberFunction(const Deleted &) &;");
7771   verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
7772   verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
7773   verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
7774   verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
7775   verifyFormat("void Fn(T const &) const &;");
7776   verifyFormat("void Fn(T const volatile &&) const volatile &&;");
7777   verifyFormat("template <typename T>\n"
7778                "void F(T) && = delete;",
7779                getGoogleStyle());
7780 
7781   FormatStyle AlignLeft = getLLVMStyle();
7782   AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
7783   verifyFormat("void A::b() && {}", AlignLeft);
7784   verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
7785   verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
7786                AlignLeft);
7787   verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
7788   verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
7789   verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
7790   verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
7791   verifyFormat("auto Function(T) & -> void {}", AlignLeft);
7792   verifyFormat("auto Function(T) & -> void;", AlignLeft);
7793   verifyFormat("void Fn(T const&) const&;", AlignLeft);
7794   verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
7795 
7796   FormatStyle Spaces = getLLVMStyle();
7797   Spaces.SpacesInCStyleCastParentheses = true;
7798   verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
7799   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
7800   verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
7801   verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
7802 
7803   Spaces.SpacesInCStyleCastParentheses = false;
7804   Spaces.SpacesInParentheses = true;
7805   verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
7806   verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;",
7807                Spaces);
7808   verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
7809   verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
7810 
7811   FormatStyle BreakTemplate = getLLVMStyle();
7812   BreakTemplate.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
7813 
7814   verifyFormat("struct f {\n"
7815                "  template <class T>\n"
7816                "  int &foo(const std::string &str) &noexcept {}\n"
7817                "};",
7818                BreakTemplate);
7819 
7820   verifyFormat("struct f {\n"
7821                "  template <class T>\n"
7822                "  int &foo(const std::string &str) &&noexcept {}\n"
7823                "};",
7824                BreakTemplate);
7825 
7826   verifyFormat("struct f {\n"
7827                "  template <class T>\n"
7828                "  int &foo(const std::string &str) const &noexcept {}\n"
7829                "};",
7830                BreakTemplate);
7831 
7832   verifyFormat("struct f {\n"
7833                "  template <class T>\n"
7834                "  int &foo(const std::string &str) const &noexcept {}\n"
7835                "};",
7836                BreakTemplate);
7837 
7838   verifyFormat("struct f {\n"
7839                "  template <class T>\n"
7840                "  auto foo(const std::string &str) &&noexcept -> int & {}\n"
7841                "};",
7842                BreakTemplate);
7843 
7844   FormatStyle AlignLeftBreakTemplate = getLLVMStyle();
7845   AlignLeftBreakTemplate.AlwaysBreakTemplateDeclarations =
7846       FormatStyle::BTDS_Yes;
7847   AlignLeftBreakTemplate.PointerAlignment = FormatStyle::PAS_Left;
7848 
7849   verifyFormat("struct f {\n"
7850                "  template <class T>\n"
7851                "  int& foo(const std::string& str) & noexcept {}\n"
7852                "};",
7853                AlignLeftBreakTemplate);
7854 
7855   verifyFormat("struct f {\n"
7856                "  template <class T>\n"
7857                "  int& foo(const std::string& str) && noexcept {}\n"
7858                "};",
7859                AlignLeftBreakTemplate);
7860 
7861   verifyFormat("struct f {\n"
7862                "  template <class T>\n"
7863                "  int& foo(const std::string& str) const& noexcept {}\n"
7864                "};",
7865                AlignLeftBreakTemplate);
7866 
7867   verifyFormat("struct f {\n"
7868                "  template <class T>\n"
7869                "  int& foo(const std::string& str) const&& noexcept {}\n"
7870                "};",
7871                AlignLeftBreakTemplate);
7872 
7873   verifyFormat("struct f {\n"
7874                "  template <class T>\n"
7875                "  auto foo(const std::string& str) && noexcept -> int& {}\n"
7876                "};",
7877                AlignLeftBreakTemplate);
7878 
7879   // The `&` in `Type&` should not be confused with a trailing `&` of
7880   // DEPRECATED(reason) member function.
7881   verifyFormat("struct f {\n"
7882                "  template <class T>\n"
7883                "  DEPRECATED(reason)\n"
7884                "  Type &foo(arguments) {}\n"
7885                "};",
7886                BreakTemplate);
7887 
7888   verifyFormat("struct f {\n"
7889                "  template <class T>\n"
7890                "  DEPRECATED(reason)\n"
7891                "  Type& foo(arguments) {}\n"
7892                "};",
7893                AlignLeftBreakTemplate);
7894 
7895   verifyFormat("void (*foopt)(int) = &func;");
7896 }
7897 
7898 TEST_F(FormatTest, UnderstandsNewAndDelete) {
7899   verifyFormat("void f() {\n"
7900                "  A *a = new A;\n"
7901                "  A *a = new (placement) A;\n"
7902                "  delete a;\n"
7903                "  delete (A *)a;\n"
7904                "}");
7905   verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
7906                "    typename aaaaaaaaaaaaaaaaaaaaaaaa();");
7907   verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7908                "    new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
7909                "        typename aaaaaaaaaaaaaaaaaaaaaaaa();");
7910   verifyFormat("delete[] h->p;");
7911 }
7912 
7913 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
7914   verifyFormat("int *f(int *a) {}");
7915   verifyFormat("int main(int argc, char **argv) {}");
7916   verifyFormat("Test::Test(int b) : a(b * b) {}");
7917   verifyIndependentOfContext("f(a, *a);");
7918   verifyFormat("void g() { f(*a); }");
7919   verifyIndependentOfContext("int a = b * 10;");
7920   verifyIndependentOfContext("int a = 10 * b;");
7921   verifyIndependentOfContext("int a = b * c;");
7922   verifyIndependentOfContext("int a += b * c;");
7923   verifyIndependentOfContext("int a -= b * c;");
7924   verifyIndependentOfContext("int a *= b * c;");
7925   verifyIndependentOfContext("int a /= b * c;");
7926   verifyIndependentOfContext("int a = *b;");
7927   verifyIndependentOfContext("int a = *b * c;");
7928   verifyIndependentOfContext("int a = b * *c;");
7929   verifyIndependentOfContext("int a = b * (10);");
7930   verifyIndependentOfContext("S << b * (10);");
7931   verifyIndependentOfContext("return 10 * b;");
7932   verifyIndependentOfContext("return *b * *c;");
7933   verifyIndependentOfContext("return a & ~b;");
7934   verifyIndependentOfContext("f(b ? *c : *d);");
7935   verifyIndependentOfContext("int a = b ? *c : *d;");
7936   verifyIndependentOfContext("*b = a;");
7937   verifyIndependentOfContext("a * ~b;");
7938   verifyIndependentOfContext("a * !b;");
7939   verifyIndependentOfContext("a * +b;");
7940   verifyIndependentOfContext("a * -b;");
7941   verifyIndependentOfContext("a * ++b;");
7942   verifyIndependentOfContext("a * --b;");
7943   verifyIndependentOfContext("a[4] * b;");
7944   verifyIndependentOfContext("a[a * a] = 1;");
7945   verifyIndependentOfContext("f() * b;");
7946   verifyIndependentOfContext("a * [self dostuff];");
7947   verifyIndependentOfContext("int x = a * (a + b);");
7948   verifyIndependentOfContext("(a *)(a + b);");
7949   verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
7950   verifyIndependentOfContext("int *pa = (int *)&a;");
7951   verifyIndependentOfContext("return sizeof(int **);");
7952   verifyIndependentOfContext("return sizeof(int ******);");
7953   verifyIndependentOfContext("return (int **&)a;");
7954   verifyIndependentOfContext("f((*PointerToArray)[10]);");
7955   verifyFormat("void f(Type (*parameter)[10]) {}");
7956   verifyFormat("void f(Type (&parameter)[10]) {}");
7957   verifyGoogleFormat("return sizeof(int**);");
7958   verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
7959   verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
7960   verifyFormat("auto a = [](int **&, int ***) {};");
7961   verifyFormat("auto PointerBinding = [](const char *S) {};");
7962   verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
7963   verifyFormat("[](const decltype(*a) &value) {}");
7964   verifyFormat("[](const typeof(*a) &value) {}");
7965   verifyFormat("[](const _Atomic(a *) &value) {}");
7966   verifyFormat("[](const __underlying_type(a) &value) {}");
7967   verifyFormat("decltype(a * b) F();");
7968   verifyFormat("typeof(a * b) F();");
7969   verifyFormat("#define MACRO() [](A *a) { return 1; }");
7970   verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
7971   verifyIndependentOfContext("typedef void (*f)(int *a);");
7972   verifyIndependentOfContext("int i{a * b};");
7973   verifyIndependentOfContext("aaa && aaa->f();");
7974   verifyIndependentOfContext("int x = ~*p;");
7975   verifyFormat("Constructor() : a(a), area(width * height) {}");
7976   verifyFormat("Constructor() : a(a), area(a, width * height) {}");
7977   verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
7978   verifyFormat("void f() { f(a, c * d); }");
7979   verifyFormat("void f() { f(new a(), c * d); }");
7980   verifyFormat("void f(const MyOverride &override);");
7981   verifyFormat("void f(const MyFinal &final);");
7982   verifyIndependentOfContext("bool a = f() && override.f();");
7983   verifyIndependentOfContext("bool a = f() && final.f();");
7984 
7985   verifyIndependentOfContext("InvalidRegions[*R] = 0;");
7986 
7987   verifyIndependentOfContext("A<int *> a;");
7988   verifyIndependentOfContext("A<int **> a;");
7989   verifyIndependentOfContext("A<int *, int *> a;");
7990   verifyIndependentOfContext("A<int *[]> a;");
7991   verifyIndependentOfContext(
7992       "const char *const p = reinterpret_cast<const char *const>(q);");
7993   verifyIndependentOfContext("A<int **, int **> a;");
7994   verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
7995   verifyFormat("for (char **a = b; *a; ++a) {\n}");
7996   verifyFormat("for (; a && b;) {\n}");
7997   verifyFormat("bool foo = true && [] { return false; }();");
7998 
7999   verifyFormat(
8000       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
8001       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
8002 
8003   verifyGoogleFormat("int const* a = &b;");
8004   verifyGoogleFormat("**outparam = 1;");
8005   verifyGoogleFormat("*outparam = a * b;");
8006   verifyGoogleFormat("int main(int argc, char** argv) {}");
8007   verifyGoogleFormat("A<int*> a;");
8008   verifyGoogleFormat("A<int**> a;");
8009   verifyGoogleFormat("A<int*, int*> a;");
8010   verifyGoogleFormat("A<int**, int**> a;");
8011   verifyGoogleFormat("f(b ? *c : *d);");
8012   verifyGoogleFormat("int a = b ? *c : *d;");
8013   verifyGoogleFormat("Type* t = **x;");
8014   verifyGoogleFormat("Type* t = *++*x;");
8015   verifyGoogleFormat("*++*x;");
8016   verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
8017   verifyGoogleFormat("Type* t = x++ * y;");
8018   verifyGoogleFormat(
8019       "const char* const p = reinterpret_cast<const char* const>(q);");
8020   verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
8021   verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
8022   verifyGoogleFormat("template <typename T>\n"
8023                      "void f(int i = 0, SomeType** temps = NULL);");
8024 
8025   FormatStyle Left = getLLVMStyle();
8026   Left.PointerAlignment = FormatStyle::PAS_Left;
8027   verifyFormat("x = *a(x) = *a(y);", Left);
8028   verifyFormat("for (;; *a = b) {\n}", Left);
8029   verifyFormat("return *this += 1;", Left);
8030   verifyFormat("throw *x;", Left);
8031   verifyFormat("delete *x;", Left);
8032   verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
8033   verifyFormat("[](const decltype(*a)* ptr) {}", Left);
8034   verifyFormat("[](const typeof(*a)* ptr) {}", Left);
8035   verifyFormat("[](const _Atomic(a*)* ptr) {}", Left);
8036   verifyFormat("[](const __underlying_type(a)* ptr) {}", Left);
8037   verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
8038   verifyFormat("auto x(A&&, B&&, C&&) -> D;", Left);
8039   verifyFormat("auto x = [](A&&, B&&, C&&) -> D {};", Left);
8040   verifyFormat("template <class T> X(T&&, T&&, T&&) -> X<T>;", Left);
8041 
8042   verifyIndependentOfContext("a = *(x + y);");
8043   verifyIndependentOfContext("a = &(x + y);");
8044   verifyIndependentOfContext("*(x + y).call();");
8045   verifyIndependentOfContext("&(x + y)->call();");
8046   verifyFormat("void f() { &(*I).first; }");
8047 
8048   verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
8049   verifyFormat(
8050       "int *MyValues = {\n"
8051       "    *A, // Operator detection might be confused by the '{'\n"
8052       "    *BB // Operator detection might be confused by previous comment\n"
8053       "};");
8054 
8055   verifyIndependentOfContext("if (int *a = &b)");
8056   verifyIndependentOfContext("if (int &a = *b)");
8057   verifyIndependentOfContext("if (a & b[i])");
8058   verifyIndependentOfContext("if constexpr (a & b[i])");
8059   verifyIndependentOfContext("if CONSTEXPR (a & b[i])");
8060   verifyIndependentOfContext("if (a * (b * c))");
8061   verifyIndependentOfContext("if constexpr (a * (b * c))");
8062   verifyIndependentOfContext("if CONSTEXPR (a * (b * c))");
8063   verifyIndependentOfContext("if (a::b::c::d & b[i])");
8064   verifyIndependentOfContext("if (*b[i])");
8065   verifyIndependentOfContext("if (int *a = (&b))");
8066   verifyIndependentOfContext("while (int *a = &b)");
8067   verifyIndependentOfContext("while (a * (b * c))");
8068   verifyIndependentOfContext("size = sizeof *a;");
8069   verifyIndependentOfContext("if (a && (b = c))");
8070   verifyFormat("void f() {\n"
8071                "  for (const int &v : Values) {\n"
8072                "  }\n"
8073                "}");
8074   verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
8075   verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
8076   verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
8077 
8078   verifyFormat("#define A (!a * b)");
8079   verifyFormat("#define MACRO     \\\n"
8080                "  int *i = a * b; \\\n"
8081                "  void f(a *b);",
8082                getLLVMStyleWithColumns(19));
8083 
8084   verifyIndependentOfContext("A = new SomeType *[Length];");
8085   verifyIndependentOfContext("A = new SomeType *[Length]();");
8086   verifyIndependentOfContext("T **t = new T *;");
8087   verifyIndependentOfContext("T **t = new T *();");
8088   verifyGoogleFormat("A = new SomeType*[Length]();");
8089   verifyGoogleFormat("A = new SomeType*[Length];");
8090   verifyGoogleFormat("T** t = new T*;");
8091   verifyGoogleFormat("T** t = new T*();");
8092 
8093   verifyFormat("STATIC_ASSERT((a & b) == 0);");
8094   verifyFormat("STATIC_ASSERT(0 == (a & b));");
8095   verifyFormat("template <bool a, bool b> "
8096                "typename t::if<x && y>::type f() {}");
8097   verifyFormat("template <int *y> f() {}");
8098   verifyFormat("vector<int *> v;");
8099   verifyFormat("vector<int *const> v;");
8100   verifyFormat("vector<int *const **const *> v;");
8101   verifyFormat("vector<int *volatile> v;");
8102   verifyFormat("vector<a *_Nonnull> v;");
8103   verifyFormat("vector<a *_Nullable> v;");
8104   verifyFormat("vector<a *_Null_unspecified> v;");
8105   verifyFormat("vector<a *__ptr32> v;");
8106   verifyFormat("vector<a *__ptr64> v;");
8107   verifyFormat("vector<a *__capability> v;");
8108   FormatStyle TypeMacros = getLLVMStyle();
8109   TypeMacros.TypenameMacros = {"LIST"};
8110   verifyFormat("vector<LIST(uint64_t)> v;", TypeMacros);
8111   verifyFormat("vector<LIST(uint64_t) *> v;", TypeMacros);
8112   verifyFormat("vector<LIST(uint64_t) **> v;", TypeMacros);
8113   verifyFormat("vector<LIST(uint64_t) *attr> v;", TypeMacros);
8114   verifyFormat("vector<A(uint64_t) * attr> v;", TypeMacros); // multiplication
8115 
8116   FormatStyle CustomQualifier = getLLVMStyle();
8117   // Add indentifers that should not be parsed as a qualifier by default.
8118   CustomQualifier.AttributeMacros.push_back("__my_qualifier");
8119   CustomQualifier.AttributeMacros.push_back("_My_qualifier");
8120   CustomQualifier.AttributeMacros.push_back("my_other_qualifier");
8121   verifyFormat("vector<a * __my_qualifier> parse_as_multiply;");
8122   verifyFormat("vector<a *__my_qualifier> v;", CustomQualifier);
8123   verifyFormat("vector<a * _My_qualifier> parse_as_multiply;");
8124   verifyFormat("vector<a *_My_qualifier> v;", CustomQualifier);
8125   verifyFormat("vector<a * my_other_qualifier> parse_as_multiply;");
8126   verifyFormat("vector<a *my_other_qualifier> v;", CustomQualifier);
8127   verifyFormat("vector<a * _NotAQualifier> v;");
8128   verifyFormat("vector<a * __not_a_qualifier> v;");
8129   verifyFormat("vector<a * b> v;");
8130   verifyFormat("foo<b && false>();");
8131   verifyFormat("foo<b & 1>();");
8132   verifyFormat("decltype(*::std::declval<const T &>()) void F();");
8133   verifyFormat("typeof(*::std::declval<const T &>()) void F();");
8134   verifyFormat("_Atomic(*::std::declval<const T &>()) void F();");
8135   verifyFormat("__underlying_type(*::std::declval<const T &>()) void F();");
8136   verifyFormat(
8137       "template <class T, class = typename std::enable_if<\n"
8138       "                       std::is_integral<T>::value &&\n"
8139       "                       (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
8140       "void F();",
8141       getLLVMStyleWithColumns(70));
8142   verifyFormat("template <class T,\n"
8143                "          class = typename std::enable_if<\n"
8144                "              std::is_integral<T>::value &&\n"
8145                "              (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
8146                "          class U>\n"
8147                "void F();",
8148                getLLVMStyleWithColumns(70));
8149   verifyFormat(
8150       "template <class T,\n"
8151       "          class = typename ::std::enable_if<\n"
8152       "              ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
8153       "void F();",
8154       getGoogleStyleWithColumns(68));
8155 
8156   verifyIndependentOfContext("MACRO(int *i);");
8157   verifyIndependentOfContext("MACRO(auto *a);");
8158   verifyIndependentOfContext("MACRO(const A *a);");
8159   verifyIndependentOfContext("MACRO(_Atomic(A) *a);");
8160   verifyIndependentOfContext("MACRO(decltype(A) *a);");
8161   verifyIndependentOfContext("MACRO(typeof(A) *a);");
8162   verifyIndependentOfContext("MACRO(__underlying_type(A) *a);");
8163   verifyIndependentOfContext("MACRO(A *const a);");
8164   verifyIndependentOfContext("MACRO(A *restrict a);");
8165   verifyIndependentOfContext("MACRO(A *__restrict__ a);");
8166   verifyIndependentOfContext("MACRO(A *__restrict a);");
8167   verifyIndependentOfContext("MACRO(A *volatile a);");
8168   verifyIndependentOfContext("MACRO(A *__volatile a);");
8169   verifyIndependentOfContext("MACRO(A *__volatile__ a);");
8170   verifyIndependentOfContext("MACRO(A *_Nonnull a);");
8171   verifyIndependentOfContext("MACRO(A *_Nullable a);");
8172   verifyIndependentOfContext("MACRO(A *_Null_unspecified a);");
8173   verifyIndependentOfContext("MACRO(A *__attribute__((foo)) a);");
8174   verifyIndependentOfContext("MACRO(A *__attribute((foo)) a);");
8175   verifyIndependentOfContext("MACRO(A *[[clang::attr]] a);");
8176   verifyIndependentOfContext("MACRO(A *[[clang::attr(\"foo\")]] a);");
8177   verifyIndependentOfContext("MACRO(A *__ptr32 a);");
8178   verifyIndependentOfContext("MACRO(A *__ptr64 a);");
8179   verifyIndependentOfContext("MACRO(A *__capability);");
8180   verifyIndependentOfContext("MACRO(A &__capability);");
8181   verifyFormat("MACRO(A *__my_qualifier);");               // type declaration
8182   verifyFormat("void f() { MACRO(A * __my_qualifier); }"); // multiplication
8183   // If we add __my_qualifier to AttributeMacros it should always be parsed as
8184   // a type declaration:
8185   verifyFormat("MACRO(A *__my_qualifier);", CustomQualifier);
8186   verifyFormat("void f() { MACRO(A *__my_qualifier); }", CustomQualifier);
8187   // Also check that TypenameMacros prevents parsing it as multiplication:
8188   verifyIndependentOfContext("MACRO(LIST(uint64_t) * a);"); // multiplication
8189   verifyIndependentOfContext("MACRO(LIST(uint64_t) *a);", TypeMacros); // type
8190 
8191   verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
8192   verifyFormat("void f() { f(float{1}, a * a); }");
8193   // FIXME: Is there a way to make this work?
8194   // verifyIndependentOfContext("MACRO(A *a);");
8195   verifyFormat("MACRO(A &B);");
8196   verifyFormat("MACRO(A *B);");
8197   verifyFormat("void f() { MACRO(A * B); }");
8198   verifyFormat("void f() { MACRO(A & B); }");
8199 
8200   // This lambda was mis-formatted after D88956 (treating it as a binop):
8201   verifyFormat("auto x = [](const decltype(x) &ptr) {};");
8202   verifyFormat("auto x = [](const decltype(x) *ptr) {};");
8203   verifyFormat("#define lambda [](const decltype(x) &ptr) {}");
8204   verifyFormat("#define lambda [](const decltype(x) *ptr) {}");
8205 
8206   verifyFormat("DatumHandle const *operator->() const { return input_; }");
8207   verifyFormat("return options != nullptr && operator==(*options);");
8208 
8209   EXPECT_EQ("#define OP(x)                                    \\\n"
8210             "  ostream &operator<<(ostream &s, const A &a) {  \\\n"
8211             "    return s << a.DebugString();                 \\\n"
8212             "  }",
8213             format("#define OP(x) \\\n"
8214                    "  ostream &operator<<(ostream &s, const A &a) { \\\n"
8215                    "    return s << a.DebugString(); \\\n"
8216                    "  }",
8217                    getLLVMStyleWithColumns(50)));
8218 
8219   // FIXME: We cannot handle this case yet; we might be able to figure out that
8220   // foo<x> d > v; doesn't make sense.
8221   verifyFormat("foo<a<b && c> d> v;");
8222 
8223   FormatStyle PointerMiddle = getLLVMStyle();
8224   PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
8225   verifyFormat("delete *x;", PointerMiddle);
8226   verifyFormat("int * x;", PointerMiddle);
8227   verifyFormat("int *[] x;", PointerMiddle);
8228   verifyFormat("template <int * y> f() {}", PointerMiddle);
8229   verifyFormat("int * f(int * a) {}", PointerMiddle);
8230   verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
8231   verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
8232   verifyFormat("A<int *> a;", PointerMiddle);
8233   verifyFormat("A<int **> a;", PointerMiddle);
8234   verifyFormat("A<int *, int *> a;", PointerMiddle);
8235   verifyFormat("A<int *[]> a;", PointerMiddle);
8236   verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
8237   verifyFormat("A = new SomeType *[Length];", PointerMiddle);
8238   verifyFormat("T ** t = new T *;", PointerMiddle);
8239 
8240   // Member function reference qualifiers aren't binary operators.
8241   verifyFormat("string // break\n"
8242                "operator()() & {}");
8243   verifyFormat("string // break\n"
8244                "operator()() && {}");
8245   verifyGoogleFormat("template <typename T>\n"
8246                      "auto x() & -> int {}");
8247 }
8248 
8249 TEST_F(FormatTest, UnderstandsAttributes) {
8250   verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
8251   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
8252                "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
8253   FormatStyle AfterType = getLLVMStyle();
8254   AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
8255   verifyFormat("__attribute__((nodebug)) void\n"
8256                "foo() {}\n",
8257                AfterType);
8258   verifyFormat("__unused void\n"
8259                "foo() {}",
8260                AfterType);
8261 
8262   FormatStyle CustomAttrs = getLLVMStyle();
8263   CustomAttrs.AttributeMacros.push_back("__unused");
8264   CustomAttrs.AttributeMacros.push_back("__attr1");
8265   CustomAttrs.AttributeMacros.push_back("__attr2");
8266   CustomAttrs.AttributeMacros.push_back("no_underscore_attr");
8267   verifyFormat("vector<SomeType *__attribute((foo))> v;");
8268   verifyFormat("vector<SomeType *__attribute__((foo))> v;");
8269   verifyFormat("vector<SomeType * __not_attribute__((foo))> v;");
8270   // Check that it is parsed as a multiplication without AttributeMacros and
8271   // as a pointer qualifier when we add __attr1/__attr2 to AttributeMacros.
8272   verifyFormat("vector<SomeType * __attr1> v;");
8273   verifyFormat("vector<SomeType __attr1 *> v;");
8274   verifyFormat("vector<SomeType __attr1 *const> v;");
8275   verifyFormat("vector<SomeType __attr1 * __attr2> v;");
8276   verifyFormat("vector<SomeType *__attr1> v;", CustomAttrs);
8277   verifyFormat("vector<SomeType *__attr2> v;", CustomAttrs);
8278   verifyFormat("vector<SomeType *no_underscore_attr> v;", CustomAttrs);
8279   verifyFormat("vector<SomeType __attr1 *> v;", CustomAttrs);
8280   verifyFormat("vector<SomeType __attr1 *const> v;", CustomAttrs);
8281   verifyFormat("vector<SomeType __attr1 *__attr2> v;", CustomAttrs);
8282   verifyFormat("vector<SomeType __attr1 *no_underscore_attr> v;", CustomAttrs);
8283 
8284   // Check that these are not parsed as function declarations:
8285   CustomAttrs.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
8286   CustomAttrs.BreakBeforeBraces = FormatStyle::BS_Allman;
8287   verifyFormat("SomeType s(InitValue);", CustomAttrs);
8288   verifyFormat("SomeType s{InitValue};", CustomAttrs);
8289   verifyFormat("SomeType *__unused s(InitValue);", CustomAttrs);
8290   verifyFormat("SomeType *__unused s{InitValue};", CustomAttrs);
8291   verifyFormat("SomeType s __unused(InitValue);", CustomAttrs);
8292   verifyFormat("SomeType s __unused{InitValue};", CustomAttrs);
8293   verifyFormat("SomeType *__capability s(InitValue);", CustomAttrs);
8294   verifyFormat("SomeType *__capability s{InitValue};", CustomAttrs);
8295 }
8296 
8297 TEST_F(FormatTest, UnderstandsPointerQualifiersInCast) {
8298   // Check that qualifiers on pointers don't break parsing of casts.
8299   verifyFormat("x = (foo *const)*v;");
8300   verifyFormat("x = (foo *volatile)*v;");
8301   verifyFormat("x = (foo *restrict)*v;");
8302   verifyFormat("x = (foo *__attribute__((foo)))*v;");
8303   verifyFormat("x = (foo *_Nonnull)*v;");
8304   verifyFormat("x = (foo *_Nullable)*v;");
8305   verifyFormat("x = (foo *_Null_unspecified)*v;");
8306   verifyFormat("x = (foo *_Nonnull)*v;");
8307   verifyFormat("x = (foo *[[clang::attr]])*v;");
8308   verifyFormat("x = (foo *[[clang::attr(\"foo\")]])*v;");
8309   verifyFormat("x = (foo *__ptr32)*v;");
8310   verifyFormat("x = (foo *__ptr64)*v;");
8311   verifyFormat("x = (foo *__capability)*v;");
8312 
8313   // Check that we handle multiple trailing qualifiers and skip them all to
8314   // determine that the expression is a cast to a pointer type.
8315   FormatStyle LongPointerRight = getLLVMStyleWithColumns(999);
8316   FormatStyle LongPointerLeft = getLLVMStyleWithColumns(999);
8317   LongPointerLeft.PointerAlignment = FormatStyle::PAS_Left;
8318   StringRef AllQualifiers =
8319       "const volatile restrict __attribute__((foo)) _Nonnull _Null_unspecified "
8320       "_Nonnull [[clang::attr]] __ptr32 __ptr64 __capability";
8321   verifyFormat(("x = (foo *" + AllQualifiers + ")*v;").str(), LongPointerRight);
8322   verifyFormat(("x = (foo* " + AllQualifiers + ")*v;").str(), LongPointerLeft);
8323 
8324   // Also check that address-of is not parsed as a binary bitwise-and:
8325   verifyFormat("x = (foo *const)&v;");
8326   verifyFormat(("x = (foo *" + AllQualifiers + ")&v;").str(), LongPointerRight);
8327   verifyFormat(("x = (foo* " + AllQualifiers + ")&v;").str(), LongPointerLeft);
8328 
8329   // Check custom qualifiers:
8330   FormatStyle CustomQualifier = getLLVMStyleWithColumns(999);
8331   CustomQualifier.AttributeMacros.push_back("__my_qualifier");
8332   verifyFormat("x = (foo * __my_qualifier) * v;"); // not parsed as qualifier.
8333   verifyFormat("x = (foo *__my_qualifier)*v;", CustomQualifier);
8334   verifyFormat(("x = (foo *" + AllQualifiers + " __my_qualifier)*v;").str(),
8335                CustomQualifier);
8336   verifyFormat(("x = (foo *" + AllQualifiers + " __my_qualifier)&v;").str(),
8337                CustomQualifier);
8338 
8339   // Check that unknown identifiers result in binary operator parsing:
8340   verifyFormat("x = (foo * __unknown_qualifier) * v;");
8341   verifyFormat("x = (foo * __unknown_qualifier) & v;");
8342 }
8343 
8344 TEST_F(FormatTest, UnderstandsSquareAttributes) {
8345   verifyFormat("SomeType s [[unused]] (InitValue);");
8346   verifyFormat("SomeType s [[gnu::unused]] (InitValue);");
8347   verifyFormat("SomeType s [[using gnu: unused]] (InitValue);");
8348   verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}");
8349   verifyFormat("void f() [[deprecated(\"so sorry\")]];");
8350   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8351                "    [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);");
8352   verifyFormat("[[nodiscard]] bool f() { return false; }");
8353   verifyFormat("class [[nodiscard]] f {\npublic:\n  f() {}\n}");
8354   verifyFormat("class [[deprecated(\"so sorry\")]] f {\npublic:\n  f() {}\n}");
8355   verifyFormat("class [[gnu::unused]] f {\npublic:\n  f() {}\n}");
8356 
8357   // Make sure we do not mistake attributes for array subscripts.
8358   verifyFormat("int a() {}\n"
8359                "[[unused]] int b() {}\n");
8360   verifyFormat("NSArray *arr;\n"
8361                "arr[[Foo() bar]];");
8362 
8363   // On the other hand, we still need to correctly find array subscripts.
8364   verifyFormat("int a = std::vector<int>{1, 2, 3}[0];");
8365 
8366   // Make sure that we do not mistake Objective-C method inside array literals
8367   // as attributes, even if those method names are also keywords.
8368   verifyFormat("@[ [foo bar] ];");
8369   verifyFormat("@[ [NSArray class] ];");
8370   verifyFormat("@[ [foo enum] ];");
8371 
8372   verifyFormat("template <typename T> [[nodiscard]] int a() { return 1; }");
8373 
8374   // Make sure we do not parse attributes as lambda introducers.
8375   FormatStyle MultiLineFunctions = getLLVMStyle();
8376   MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
8377   verifyFormat("[[unused]] int b() {\n"
8378                "  return 42;\n"
8379                "}\n",
8380                MultiLineFunctions);
8381 }
8382 
8383 TEST_F(FormatTest, AttributeClass) {
8384   FormatStyle Style = getChromiumStyle(FormatStyle::LK_Cpp);
8385   verifyFormat("class S {\n"
8386                "  S(S&&) = default;\n"
8387                "};",
8388                Style);
8389   verifyFormat("class [[nodiscard]] S {\n"
8390                "  S(S&&) = default;\n"
8391                "};",
8392                Style);
8393   verifyFormat("class __attribute((maybeunused)) S {\n"
8394                "  S(S&&) = default;\n"
8395                "};",
8396                Style);
8397   verifyFormat("struct S {\n"
8398                "  S(S&&) = default;\n"
8399                "};",
8400                Style);
8401   verifyFormat("struct [[nodiscard]] S {\n"
8402                "  S(S&&) = default;\n"
8403                "};",
8404                Style);
8405 }
8406 
8407 TEST_F(FormatTest, AttributesAfterMacro) {
8408   FormatStyle Style = getLLVMStyle();
8409   verifyFormat("MACRO;\n"
8410                "__attribute__((maybe_unused)) int foo() {\n"
8411                "  //...\n"
8412                "}");
8413 
8414   verifyFormat("MACRO;\n"
8415                "[[nodiscard]] int foo() {\n"
8416                "  //...\n"
8417                "}");
8418 
8419   EXPECT_EQ("MACRO\n\n"
8420             "__attribute__((maybe_unused)) int foo() {\n"
8421             "  //...\n"
8422             "}",
8423             format("MACRO\n\n"
8424                    "__attribute__((maybe_unused)) int foo() {\n"
8425                    "  //...\n"
8426                    "}"));
8427 
8428   EXPECT_EQ("MACRO\n\n"
8429             "[[nodiscard]] int foo() {\n"
8430             "  //...\n"
8431             "}",
8432             format("MACRO\n\n"
8433                    "[[nodiscard]] int foo() {\n"
8434                    "  //...\n"
8435                    "}"));
8436 }
8437 
8438 TEST_F(FormatTest, AttributePenaltyBreaking) {
8439   FormatStyle Style = getLLVMStyle();
8440   verifyFormat("void ABCDEFGH::ABCDEFGHIJKLMN(\n"
8441                "    [[maybe_unused]] const shared_ptr<ALongTypeName> &C d) {}",
8442                Style);
8443   verifyFormat("void ABCDEFGH::ABCDEFGHIJK(\n"
8444                "    [[maybe_unused]] const shared_ptr<ALongTypeName> &C d) {}",
8445                Style);
8446   verifyFormat("void ABCDEFGH::ABCDEFGH([[maybe_unused]] const "
8447                "shared_ptr<ALongTypeName> &C d) {\n}",
8448                Style);
8449 }
8450 
8451 TEST_F(FormatTest, UnderstandsEllipsis) {
8452   FormatStyle Style = getLLVMStyle();
8453   verifyFormat("int printf(const char *fmt, ...);");
8454   verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
8455   verifyFormat("template <class... Ts> void Foo(Ts *...ts) {}");
8456 
8457   verifyFormat("template <int *...PP> a;", Style);
8458 
8459   Style.PointerAlignment = FormatStyle::PAS_Left;
8460   verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", Style);
8461 
8462   verifyFormat("template <int*... PP> a;", Style);
8463 
8464   Style.PointerAlignment = FormatStyle::PAS_Middle;
8465   verifyFormat("template <int *... PP> a;", Style);
8466 }
8467 
8468 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
8469   EXPECT_EQ("int *a;\n"
8470             "int *a;\n"
8471             "int *a;",
8472             format("int *a;\n"
8473                    "int* a;\n"
8474                    "int *a;",
8475                    getGoogleStyle()));
8476   EXPECT_EQ("int* a;\n"
8477             "int* a;\n"
8478             "int* a;",
8479             format("int* a;\n"
8480                    "int* a;\n"
8481                    "int *a;",
8482                    getGoogleStyle()));
8483   EXPECT_EQ("int *a;\n"
8484             "int *a;\n"
8485             "int *a;",
8486             format("int *a;\n"
8487                    "int * a;\n"
8488                    "int *  a;",
8489                    getGoogleStyle()));
8490   EXPECT_EQ("auto x = [] {\n"
8491             "  int *a;\n"
8492             "  int *a;\n"
8493             "  int *a;\n"
8494             "};",
8495             format("auto x=[]{int *a;\n"
8496                    "int * a;\n"
8497                    "int *  a;};",
8498                    getGoogleStyle()));
8499 }
8500 
8501 TEST_F(FormatTest, UnderstandsRvalueReferences) {
8502   verifyFormat("int f(int &&a) {}");
8503   verifyFormat("int f(int a, char &&b) {}");
8504   verifyFormat("void f() { int &&a = b; }");
8505   verifyGoogleFormat("int f(int a, char&& b) {}");
8506   verifyGoogleFormat("void f() { int&& a = b; }");
8507 
8508   verifyIndependentOfContext("A<int &&> a;");
8509   verifyIndependentOfContext("A<int &&, int &&> a;");
8510   verifyGoogleFormat("A<int&&> a;");
8511   verifyGoogleFormat("A<int&&, int&&> a;");
8512 
8513   // Not rvalue references:
8514   verifyFormat("template <bool B, bool C> class A {\n"
8515                "  static_assert(B && C, \"Something is wrong\");\n"
8516                "};");
8517   verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
8518   verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
8519   verifyFormat("#define A(a, b) (a && b)");
8520 }
8521 
8522 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
8523   verifyFormat("void f() {\n"
8524                "  x[aaaaaaaaa -\n"
8525                "    b] = 23;\n"
8526                "}",
8527                getLLVMStyleWithColumns(15));
8528 }
8529 
8530 TEST_F(FormatTest, FormatsCasts) {
8531   verifyFormat("Type *A = static_cast<Type *>(P);");
8532   verifyFormat("Type *A = (Type *)P;");
8533   verifyFormat("Type *A = (vector<Type *, int *>)P;");
8534   verifyFormat("int a = (int)(2.0f);");
8535   verifyFormat("int a = (int)2.0f;");
8536   verifyFormat("x[(int32)y];");
8537   verifyFormat("x = (int32)y;");
8538   verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
8539   verifyFormat("int a = (int)*b;");
8540   verifyFormat("int a = (int)2.0f;");
8541   verifyFormat("int a = (int)~0;");
8542   verifyFormat("int a = (int)++a;");
8543   verifyFormat("int a = (int)sizeof(int);");
8544   verifyFormat("int a = (int)+2;");
8545   verifyFormat("my_int a = (my_int)2.0f;");
8546   verifyFormat("my_int a = (my_int)sizeof(int);");
8547   verifyFormat("return (my_int)aaa;");
8548   verifyFormat("#define x ((int)-1)");
8549   verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
8550   verifyFormat("#define p(q) ((int *)&q)");
8551   verifyFormat("fn(a)(b) + 1;");
8552 
8553   verifyFormat("void f() { my_int a = (my_int)*b; }");
8554   verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
8555   verifyFormat("my_int a = (my_int)~0;");
8556   verifyFormat("my_int a = (my_int)++a;");
8557   verifyFormat("my_int a = (my_int)-2;");
8558   verifyFormat("my_int a = (my_int)1;");
8559   verifyFormat("my_int a = (my_int *)1;");
8560   verifyFormat("my_int a = (const my_int)-1;");
8561   verifyFormat("my_int a = (const my_int *)-1;");
8562   verifyFormat("my_int a = (my_int)(my_int)-1;");
8563   verifyFormat("my_int a = (ns::my_int)-2;");
8564   verifyFormat("case (my_int)ONE:");
8565   verifyFormat("auto x = (X)this;");
8566   // Casts in Obj-C style calls used to not be recognized as such.
8567   verifyFormat("int a = [(type*)[((type*)val) arg] arg];", getGoogleStyle());
8568 
8569   // FIXME: single value wrapped with paren will be treated as cast.
8570   verifyFormat("void f(int i = (kValue)*kMask) {}");
8571 
8572   verifyFormat("{ (void)F; }");
8573 
8574   // Don't break after a cast's
8575   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
8576                "    (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
8577                "                                   bbbbbbbbbbbbbbbbbbbbbb);");
8578 
8579   // These are not casts.
8580   verifyFormat("void f(int *) {}");
8581   verifyFormat("f(foo)->b;");
8582   verifyFormat("f(foo).b;");
8583   verifyFormat("f(foo)(b);");
8584   verifyFormat("f(foo)[b];");
8585   verifyFormat("[](foo) { return 4; }(bar);");
8586   verifyFormat("(*funptr)(foo)[4];");
8587   verifyFormat("funptrs[4](foo)[4];");
8588   verifyFormat("void f(int *);");
8589   verifyFormat("void f(int *) = 0;");
8590   verifyFormat("void f(SmallVector<int>) {}");
8591   verifyFormat("void f(SmallVector<int>);");
8592   verifyFormat("void f(SmallVector<int>) = 0;");
8593   verifyFormat("void f(int i = (kA * kB) & kMask) {}");
8594   verifyFormat("int a = sizeof(int) * b;");
8595   verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
8596   verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
8597   verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
8598   verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
8599 
8600   // These are not casts, but at some point were confused with casts.
8601   verifyFormat("virtual void foo(int *) override;");
8602   verifyFormat("virtual void foo(char &) const;");
8603   verifyFormat("virtual void foo(int *a, char *) const;");
8604   verifyFormat("int a = sizeof(int *) + b;");
8605   verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
8606   verifyFormat("bool b = f(g<int>) && c;");
8607   verifyFormat("typedef void (*f)(int i) func;");
8608   verifyFormat("void operator++(int) noexcept;");
8609   verifyFormat("void operator++(int &) noexcept;");
8610   verifyFormat("void operator delete(void *, std::size_t, const std::nothrow_t "
8611                "&) noexcept;");
8612   verifyFormat(
8613       "void operator delete(std::size_t, const std::nothrow_t &) noexcept;");
8614   verifyFormat("void operator delete(const std::nothrow_t &) noexcept;");
8615   verifyFormat("void operator delete(std::nothrow_t &) noexcept;");
8616   verifyFormat("void operator delete(nothrow_t &) noexcept;");
8617   verifyFormat("void operator delete(foo &) noexcept;");
8618   verifyFormat("void operator delete(foo) noexcept;");
8619   verifyFormat("void operator delete(int) noexcept;");
8620   verifyFormat("void operator delete(int &) noexcept;");
8621   verifyFormat("void operator delete(int &) volatile noexcept;");
8622   verifyFormat("void operator delete(int &) const");
8623   verifyFormat("void operator delete(int &) = default");
8624   verifyFormat("void operator delete(int &) = delete");
8625   verifyFormat("void operator delete(int &) [[noreturn]]");
8626   verifyFormat("void operator delete(int &) throw();");
8627   verifyFormat("void operator delete(int &) throw(int);");
8628   verifyFormat("auto operator delete(int &) -> int;");
8629   verifyFormat("auto operator delete(int &) override");
8630   verifyFormat("auto operator delete(int &) final");
8631 
8632   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
8633                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
8634   // FIXME: The indentation here is not ideal.
8635   verifyFormat(
8636       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8637       "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
8638       "        [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
8639 }
8640 
8641 TEST_F(FormatTest, FormatsFunctionTypes) {
8642   verifyFormat("A<bool()> a;");
8643   verifyFormat("A<SomeType()> a;");
8644   verifyFormat("A<void (*)(int, std::string)> a;");
8645   verifyFormat("A<void *(int)>;");
8646   verifyFormat("void *(*a)(int *, SomeType *);");
8647   verifyFormat("int (*func)(void *);");
8648   verifyFormat("void f() { int (*func)(void *); }");
8649   verifyFormat("template <class CallbackClass>\n"
8650                "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
8651 
8652   verifyGoogleFormat("A<void*(int*, SomeType*)>;");
8653   verifyGoogleFormat("void* (*a)(int);");
8654   verifyGoogleFormat(
8655       "template <class CallbackClass>\n"
8656       "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
8657 
8658   // Other constructs can look somewhat like function types:
8659   verifyFormat("A<sizeof(*x)> a;");
8660   verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
8661   verifyFormat("some_var = function(*some_pointer_var)[0];");
8662   verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
8663   verifyFormat("int x = f(&h)();");
8664   verifyFormat("returnsFunction(&param1, &param2)(param);");
8665   verifyFormat("std::function<\n"
8666                "    LooooooooooongTemplatedType<\n"
8667                "        SomeType>*(\n"
8668                "        LooooooooooooooooongType type)>\n"
8669                "    function;",
8670                getGoogleStyleWithColumns(40));
8671 }
8672 
8673 TEST_F(FormatTest, FormatsPointersToArrayTypes) {
8674   verifyFormat("A (*foo_)[6];");
8675   verifyFormat("vector<int> (*foo_)[6];");
8676 }
8677 
8678 TEST_F(FormatTest, BreaksLongVariableDeclarations) {
8679   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
8680                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
8681   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
8682                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
8683   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
8684                "    *LoooooooooooooooooooooooooooooooooooooooongVariable;");
8685 
8686   // Different ways of ()-initializiation.
8687   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
8688                "    LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
8689   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
8690                "    LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
8691   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
8692                "    LoooooooooooooooooooooooooooooooooooooooongVariable({});");
8693   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
8694                "    LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
8695 
8696   // Lambdas should not confuse the variable declaration heuristic.
8697   verifyFormat("LooooooooooooooooongType\n"
8698                "    variable(nullptr, [](A *a) {});",
8699                getLLVMStyleWithColumns(40));
8700 }
8701 
8702 TEST_F(FormatTest, BreaksLongDeclarations) {
8703   verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
8704                "    AnotherNameForTheLongType;");
8705   verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
8706                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
8707   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
8708                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
8709   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
8710                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
8711   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
8712                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
8713   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
8714                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
8715   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
8716                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
8717   verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
8718                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
8719   verifyFormat("typeof(LoooooooooooooooooooooooooooooooooooooooooongName)\n"
8720                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
8721   verifyFormat("_Atomic(LooooooooooooooooooooooooooooooooooooooooongName)\n"
8722                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
8723   verifyFormat("__underlying_type(LooooooooooooooooooooooooooooooongName)\n"
8724                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
8725   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
8726                "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
8727   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
8728                "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
8729   FormatStyle Indented = getLLVMStyle();
8730   Indented.IndentWrappedFunctionNames = true;
8731   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
8732                "    LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
8733                Indented);
8734   verifyFormat(
8735       "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
8736       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
8737       Indented);
8738   verifyFormat(
8739       "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
8740       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
8741       Indented);
8742   verifyFormat(
8743       "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
8744       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
8745       Indented);
8746 
8747   // FIXME: Without the comment, this breaks after "(".
8748   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType  // break\n"
8749                "    (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
8750                getGoogleStyle());
8751 
8752   verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
8753                "                  int LoooooooooooooooooooongParam2) {}");
8754   verifyFormat(
8755       "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
8756       "                                   SourceLocation L, IdentifierIn *II,\n"
8757       "                                   Type *T) {}");
8758   verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
8759                "ReallyReaaallyLongFunctionName(\n"
8760                "    const std::string &SomeParameter,\n"
8761                "    const SomeType<string, SomeOtherTemplateParameter>\n"
8762                "        &ReallyReallyLongParameterName,\n"
8763                "    const SomeType<string, SomeOtherTemplateParameter>\n"
8764                "        &AnotherLongParameterName) {}");
8765   verifyFormat("template <typename A>\n"
8766                "SomeLoooooooooooooooooooooongType<\n"
8767                "    typename some_namespace::SomeOtherType<A>::Type>\n"
8768                "Function() {}");
8769 
8770   verifyGoogleFormat(
8771       "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
8772       "    aaaaaaaaaaaaaaaaaaaaaaa;");
8773   verifyGoogleFormat(
8774       "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
8775       "                                   SourceLocation L) {}");
8776   verifyGoogleFormat(
8777       "some_namespace::LongReturnType\n"
8778       "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
8779       "    int first_long_parameter, int second_parameter) {}");
8780 
8781   verifyGoogleFormat("template <typename T>\n"
8782                      "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
8783                      "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
8784   verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8785                      "                   int aaaaaaaaaaaaaaaaaaaaaaa);");
8786 
8787   verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
8788                "    const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8789                "        *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
8790   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
8791                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
8792                "        aaaaaaaaaaaaaaaaaaaaaaaa);");
8793   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
8794                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
8795                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
8796                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
8797 
8798   verifyFormat("template <typename T> // Templates on own line.\n"
8799                "static int            // Some comment.\n"
8800                "MyFunction(int a);",
8801                getLLVMStyle());
8802 }
8803 
8804 TEST_F(FormatTest, FormatsArrays) {
8805   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
8806                "                         [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
8807   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
8808                "                         [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
8809   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
8810                "    aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
8811   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8812                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
8813   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8814                "    [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
8815   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8816                "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
8817                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
8818   verifyFormat(
8819       "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
8820       "             << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
8821       "                                  [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
8822   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
8823                "    .aaaaaaaaaaaaaaaaaaaaaa();");
8824 
8825   verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
8826                      "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
8827   verifyFormat(
8828       "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
8829       "                                  .aaaaaaa[0]\n"
8830       "                                  .aaaaaaaaaaaaaaaaaaaaaa();");
8831   verifyFormat("a[::b::c];");
8832 
8833   verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
8834 
8835   FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
8836   verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
8837 }
8838 
8839 TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
8840   verifyFormat("(a)->b();");
8841   verifyFormat("--a;");
8842 }
8843 
8844 TEST_F(FormatTest, HandlesIncludeDirectives) {
8845   verifyFormat("#include <string>\n"
8846                "#include <a/b/c.h>\n"
8847                "#include \"a/b/string\"\n"
8848                "#include \"string.h\"\n"
8849                "#include \"string.h\"\n"
8850                "#include <a-a>\n"
8851                "#include < path with space >\n"
8852                "#include_next <test.h>"
8853                "#include \"abc.h\" // this is included for ABC\n"
8854                "#include \"some long include\" // with a comment\n"
8855                "#include \"some very long include path\"\n"
8856                "#include <some/very/long/include/path>\n",
8857                getLLVMStyleWithColumns(35));
8858   EXPECT_EQ("#include \"a.h\"", format("#include  \"a.h\""));
8859   EXPECT_EQ("#include <a>", format("#include<a>"));
8860 
8861   verifyFormat("#import <string>");
8862   verifyFormat("#import <a/b/c.h>");
8863   verifyFormat("#import \"a/b/string\"");
8864   verifyFormat("#import \"string.h\"");
8865   verifyFormat("#import \"string.h\"");
8866   verifyFormat("#if __has_include(<strstream>)\n"
8867                "#include <strstream>\n"
8868                "#endif");
8869 
8870   verifyFormat("#define MY_IMPORT <a/b>");
8871 
8872   verifyFormat("#if __has_include(<a/b>)");
8873   verifyFormat("#if __has_include_next(<a/b>)");
8874   verifyFormat("#define F __has_include(<a/b>)");
8875   verifyFormat("#define F __has_include_next(<a/b>)");
8876 
8877   // Protocol buffer definition or missing "#".
8878   verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
8879                getLLVMStyleWithColumns(30));
8880 
8881   FormatStyle Style = getLLVMStyle();
8882   Style.AlwaysBreakBeforeMultilineStrings = true;
8883   Style.ColumnLimit = 0;
8884   verifyFormat("#import \"abc.h\"", Style);
8885 
8886   // But 'import' might also be a regular C++ namespace.
8887   verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8888                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
8889 }
8890 
8891 //===----------------------------------------------------------------------===//
8892 // Error recovery tests.
8893 //===----------------------------------------------------------------------===//
8894 
8895 TEST_F(FormatTest, IncompleteParameterLists) {
8896   FormatStyle NoBinPacking = getLLVMStyle();
8897   NoBinPacking.BinPackParameters = false;
8898   verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
8899                "                        double *min_x,\n"
8900                "                        double *max_x,\n"
8901                "                        double *min_y,\n"
8902                "                        double *max_y,\n"
8903                "                        double *min_z,\n"
8904                "                        double *max_z, ) {}",
8905                NoBinPacking);
8906 }
8907 
8908 TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
8909   verifyFormat("void f() { return; }\n42");
8910   verifyFormat("void f() {\n"
8911                "  if (0)\n"
8912                "    return;\n"
8913                "}\n"
8914                "42");
8915   verifyFormat("void f() { return }\n42");
8916   verifyFormat("void f() {\n"
8917                "  if (0)\n"
8918                "    return\n"
8919                "}\n"
8920                "42");
8921 }
8922 
8923 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
8924   EXPECT_EQ("void f() { return }", format("void  f ( )  {  return  }"));
8925   EXPECT_EQ("void f() {\n"
8926             "  if (a)\n"
8927             "    return\n"
8928             "}",
8929             format("void  f  (  )  {  if  ( a )  return  }"));
8930   EXPECT_EQ("namespace N {\n"
8931             "void f()\n"
8932             "}",
8933             format("namespace  N  {  void f()  }"));
8934   EXPECT_EQ("namespace N {\n"
8935             "void f() {}\n"
8936             "void g()\n"
8937             "} // namespace N",
8938             format("namespace N  { void f( ) { } void g( ) }"));
8939 }
8940 
8941 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
8942   verifyFormat("int aaaaaaaa =\n"
8943                "    // Overlylongcomment\n"
8944                "    b;",
8945                getLLVMStyleWithColumns(20));
8946   verifyFormat("function(\n"
8947                "    ShortArgument,\n"
8948                "    LoooooooooooongArgument);\n",
8949                getLLVMStyleWithColumns(20));
8950 }
8951 
8952 TEST_F(FormatTest, IncorrectAccessSpecifier) {
8953   verifyFormat("public:");
8954   verifyFormat("class A {\n"
8955                "public\n"
8956                "  void f() {}\n"
8957                "};");
8958   verifyFormat("public\n"
8959                "int qwerty;");
8960   verifyFormat("public\n"
8961                "B {}");
8962   verifyFormat("public\n"
8963                "{}");
8964   verifyFormat("public\n"
8965                "B { int x; }");
8966 }
8967 
8968 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
8969   verifyFormat("{");
8970   verifyFormat("#})");
8971   verifyNoCrash("(/**/[:!] ?[).");
8972 }
8973 
8974 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) {
8975   // Found by oss-fuzz:
8976   // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212
8977   FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
8978   Style.ColumnLimit = 60;
8979   verifyNoCrash(
8980       "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20"
8981       "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20"
8982       "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a",
8983       Style);
8984 }
8985 
8986 TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
8987   verifyFormat("do {\n}");
8988   verifyFormat("do {\n}\n"
8989                "f();");
8990   verifyFormat("do {\n}\n"
8991                "wheeee(fun);");
8992   verifyFormat("do {\n"
8993                "  f();\n"
8994                "}");
8995 }
8996 
8997 TEST_F(FormatTest, IncorrectCodeMissingParens) {
8998   verifyFormat("if {\n  foo;\n  foo();\n}");
8999   verifyFormat("switch {\n  foo;\n  foo();\n}");
9000   verifyIncompleteFormat("for {\n  foo;\n  foo();\n}");
9001   verifyFormat("while {\n  foo;\n  foo();\n}");
9002   verifyFormat("do {\n  foo;\n  foo();\n} while;");
9003 }
9004 
9005 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
9006   verifyIncompleteFormat("namespace {\n"
9007                          "class Foo { Foo (\n"
9008                          "};\n"
9009                          "} // namespace");
9010 }
9011 
9012 TEST_F(FormatTest, IncorrectCodeErrorDetection) {
9013   EXPECT_EQ("{\n  {}\n", format("{\n{\n}\n"));
9014   EXPECT_EQ("{\n  {}\n", format("{\n  {\n}\n"));
9015   EXPECT_EQ("{\n  {}\n", format("{\n  {\n  }\n"));
9016   EXPECT_EQ("{\n  {}\n}\n}\n", format("{\n  {\n    }\n  }\n}\n"));
9017 
9018   EXPECT_EQ("{\n"
9019             "  {\n"
9020             "    breakme(\n"
9021             "        qwe);\n"
9022             "  }\n",
9023             format("{\n"
9024                    "    {\n"
9025                    " breakme(qwe);\n"
9026                    "}\n",
9027                    getLLVMStyleWithColumns(10)));
9028 }
9029 
9030 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
9031   verifyFormat("int x = {\n"
9032                "    avariable,\n"
9033                "    b(alongervariable)};",
9034                getLLVMStyleWithColumns(25));
9035 }
9036 
9037 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
9038   verifyFormat("return (a)(b){1, 2, 3};");
9039 }
9040 
9041 TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
9042   verifyFormat("vector<int> x{1, 2, 3, 4};");
9043   verifyFormat("vector<int> x{\n"
9044                "    1,\n"
9045                "    2,\n"
9046                "    3,\n"
9047                "    4,\n"
9048                "};");
9049   verifyFormat("vector<T> x{{}, {}, {}, {}};");
9050   verifyFormat("f({1, 2});");
9051   verifyFormat("auto v = Foo{-1};");
9052   verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
9053   verifyFormat("Class::Class : member{1, 2, 3} {}");
9054   verifyFormat("new vector<int>{1, 2, 3};");
9055   verifyFormat("new int[3]{1, 2, 3};");
9056   verifyFormat("new int{1};");
9057   verifyFormat("return {arg1, arg2};");
9058   verifyFormat("return {arg1, SomeType{parameter}};");
9059   verifyFormat("int count = set<int>{f(), g(), h()}.size();");
9060   verifyFormat("new T{arg1, arg2};");
9061   verifyFormat("f(MyMap[{composite, key}]);");
9062   verifyFormat("class Class {\n"
9063                "  T member = {arg1, arg2};\n"
9064                "};");
9065   verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
9066   verifyFormat("const struct A a = {.a = 1, .b = 2};");
9067   verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
9068   verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
9069   verifyFormat("int a = std::is_integral<int>{} + 0;");
9070 
9071   verifyFormat("int foo(int i) { return fo1{}(i); }");
9072   verifyFormat("int foo(int i) { return fo1{}(i); }");
9073   verifyFormat("auto i = decltype(x){};");
9074   verifyFormat("auto i = typeof(x){};");
9075   verifyFormat("auto i = _Atomic(x){};");
9076   verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
9077   verifyFormat("Node n{1, Node{1000}, //\n"
9078                "       2};");
9079   verifyFormat("Aaaa aaaaaaa{\n"
9080                "    {\n"
9081                "        aaaa,\n"
9082                "    },\n"
9083                "};");
9084   verifyFormat("class C : public D {\n"
9085                "  SomeClass SC{2};\n"
9086                "};");
9087   verifyFormat("class C : public A {\n"
9088                "  class D : public B {\n"
9089                "    void f() { int i{2}; }\n"
9090                "  };\n"
9091                "};");
9092   verifyFormat("#define A {a, a},");
9093 
9094   // Avoid breaking between equal sign and opening brace
9095   FormatStyle AvoidBreakingFirstArgument = getLLVMStyle();
9096   AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200;
9097   verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n"
9098                "    {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n"
9099                "     {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n"
9100                "     {\"ccccccccccccccccccccc\", 2}};",
9101                AvoidBreakingFirstArgument);
9102 
9103   // Binpacking only if there is no trailing comma
9104   verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
9105                "                      cccccccccc, dddddddddd};",
9106                getLLVMStyleWithColumns(50));
9107   verifyFormat("const Aaaaaa aaaaa = {\n"
9108                "    aaaaaaaaaaa,\n"
9109                "    bbbbbbbbbbb,\n"
9110                "    ccccccccccc,\n"
9111                "    ddddddddddd,\n"
9112                "};",
9113                getLLVMStyleWithColumns(50));
9114 
9115   // Cases where distinguising braced lists and blocks is hard.
9116   verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
9117   verifyFormat("void f() {\n"
9118                "  return; // comment\n"
9119                "}\n"
9120                "SomeType t;");
9121   verifyFormat("void f() {\n"
9122                "  if (a) {\n"
9123                "    f();\n"
9124                "  }\n"
9125                "}\n"
9126                "SomeType t;");
9127 
9128   // In combination with BinPackArguments = false.
9129   FormatStyle NoBinPacking = getLLVMStyle();
9130   NoBinPacking.BinPackArguments = false;
9131   verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
9132                "                      bbbbb,\n"
9133                "                      ccccc,\n"
9134                "                      ddddd,\n"
9135                "                      eeeee,\n"
9136                "                      ffffff,\n"
9137                "                      ggggg,\n"
9138                "                      hhhhhh,\n"
9139                "                      iiiiii,\n"
9140                "                      jjjjjj,\n"
9141                "                      kkkkkk};",
9142                NoBinPacking);
9143   verifyFormat("const Aaaaaa aaaaa = {\n"
9144                "    aaaaa,\n"
9145                "    bbbbb,\n"
9146                "    ccccc,\n"
9147                "    ddddd,\n"
9148                "    eeeee,\n"
9149                "    ffffff,\n"
9150                "    ggggg,\n"
9151                "    hhhhhh,\n"
9152                "    iiiiii,\n"
9153                "    jjjjjj,\n"
9154                "    kkkkkk,\n"
9155                "};",
9156                NoBinPacking);
9157   verifyFormat(
9158       "const Aaaaaa aaaaa = {\n"
9159       "    aaaaa,  bbbbb,  ccccc,  ddddd,  eeeee,  ffffff, ggggg, hhhhhh,\n"
9160       "    iiiiii, jjjjjj, kkkkkk, aaaaa,  bbbbb,  ccccc,  ddddd, eeeee,\n"
9161       "    ffffff, ggggg,  hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
9162       "};",
9163       NoBinPacking);
9164 
9165   NoBinPacking.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
9166   EXPECT_EQ("static uint8 CddDp83848Reg[] = {\n"
9167             "    CDDDP83848_BMCR_REGISTER,\n"
9168             "    CDDDP83848_BMSR_REGISTER,\n"
9169             "    CDDDP83848_RBR_REGISTER};",
9170             format("static uint8 CddDp83848Reg[] = {CDDDP83848_BMCR_REGISTER,\n"
9171                    "                                CDDDP83848_BMSR_REGISTER,\n"
9172                    "                                CDDDP83848_RBR_REGISTER};",
9173                    NoBinPacking));
9174 
9175   // FIXME: The alignment of these trailing comments might be bad. Then again,
9176   // this might be utterly useless in real code.
9177   verifyFormat("Constructor::Constructor()\n"
9178                "    : some_value{         //\n"
9179                "                 aaaaaaa, //\n"
9180                "                 bbbbbbb} {}");
9181 
9182   // In braced lists, the first comment is always assumed to belong to the
9183   // first element. Thus, it can be moved to the next or previous line as
9184   // appropriate.
9185   EXPECT_EQ("function({// First element:\n"
9186             "          1,\n"
9187             "          // Second element:\n"
9188             "          2});",
9189             format("function({\n"
9190                    "    // First element:\n"
9191                    "    1,\n"
9192                    "    // Second element:\n"
9193                    "    2});"));
9194   EXPECT_EQ("std::vector<int> MyNumbers{\n"
9195             "    // First element:\n"
9196             "    1,\n"
9197             "    // Second element:\n"
9198             "    2};",
9199             format("std::vector<int> MyNumbers{// First element:\n"
9200                    "                           1,\n"
9201                    "                           // Second element:\n"
9202                    "                           2};",
9203                    getLLVMStyleWithColumns(30)));
9204   // A trailing comma should still lead to an enforced line break and no
9205   // binpacking.
9206   EXPECT_EQ("vector<int> SomeVector = {\n"
9207             "    // aaa\n"
9208             "    1,\n"
9209             "    2,\n"
9210             "};",
9211             format("vector<int> SomeVector = { // aaa\n"
9212                    "    1, 2, };"));
9213 
9214   // C++11 brace initializer list l-braces should not be treated any differently
9215   // when breaking before lambda bodies is enabled
9216   FormatStyle BreakBeforeLambdaBody = getLLVMStyle();
9217   BreakBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom;
9218   BreakBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true;
9219   BreakBeforeLambdaBody.AlwaysBreakBeforeMultilineStrings = true;
9220   verifyFormat(
9221       "std::runtime_error{\n"
9222       "    \"Long string which will force a break onto the next line...\"};",
9223       BreakBeforeLambdaBody);
9224 
9225   FormatStyle ExtraSpaces = getLLVMStyle();
9226   ExtraSpaces.Cpp11BracedListStyle = false;
9227   ExtraSpaces.ColumnLimit = 75;
9228   verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
9229   verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
9230   verifyFormat("f({ 1, 2 });", ExtraSpaces);
9231   verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
9232   verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
9233   verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
9234   verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
9235   verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
9236   verifyFormat("return { arg1, arg2 };", ExtraSpaces);
9237   verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
9238   verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
9239   verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
9240   verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
9241   verifyFormat("class Class {\n"
9242                "  T member = { arg1, arg2 };\n"
9243                "};",
9244                ExtraSpaces);
9245   verifyFormat(
9246       "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
9247       "                                 aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
9248       "                  : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
9249       "                                 bbbbbbbbbbbbbbbbbbbb, bbbbb };",
9250       ExtraSpaces);
9251   verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
9252   verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
9253                ExtraSpaces);
9254   verifyFormat(
9255       "someFunction(OtherParam,\n"
9256       "             BracedList{ // comment 1 (Forcing interesting break)\n"
9257       "                         param1, param2,\n"
9258       "                         // comment 2\n"
9259       "                         param3, param4 });",
9260       ExtraSpaces);
9261   verifyFormat(
9262       "std::this_thread::sleep_for(\n"
9263       "    std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
9264       ExtraSpaces);
9265   verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
9266                "    aaaaaaa,\n"
9267                "    aaaaaaaaaa,\n"
9268                "    aaaaa,\n"
9269                "    aaaaaaaaaaaaaaa,\n"
9270                "    aaa,\n"
9271                "    aaaaaaaaaa,\n"
9272                "    a,\n"
9273                "    aaaaaaaaaaaaaaaaaaaaa,\n"
9274                "    aaaaaaaaaaaa,\n"
9275                "    aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
9276                "    aaaaaaa,\n"
9277                "    a};");
9278   verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
9279   verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
9280   verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
9281 
9282   // Avoid breaking between initializer/equal sign and opening brace
9283   ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200;
9284   verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n"
9285                "  { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
9286                "  { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
9287                "  { \"ccccccccccccccccccccc\", 2 }\n"
9288                "};",
9289                ExtraSpaces);
9290   verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n"
9291                "  { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
9292                "  { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
9293                "  { \"ccccccccccccccccccccc\", 2 }\n"
9294                "};",
9295                ExtraSpaces);
9296 
9297   FormatStyle SpaceBeforeBrace = getLLVMStyle();
9298   SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true;
9299   verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace);
9300   verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace);
9301 
9302   FormatStyle SpaceBetweenBraces = getLLVMStyle();
9303   SpaceBetweenBraces.SpacesInAngles = true;
9304   SpaceBetweenBraces.SpacesInParentheses = true;
9305   SpaceBetweenBraces.SpacesInSquareBrackets = true;
9306   verifyFormat("vector< int > x{ 1, 2, 3, 4 };", SpaceBetweenBraces);
9307   verifyFormat("f( {}, { {}, {} }, MyMap[ { k, v } ] );", SpaceBetweenBraces);
9308   verifyFormat("vector< int > x{ // comment 1\n"
9309                "                 1, 2, 3, 4 };",
9310                SpaceBetweenBraces);
9311   SpaceBetweenBraces.ColumnLimit = 20;
9312   EXPECT_EQ("vector< int > x{\n"
9313             "    1, 2, 3, 4 };",
9314             format("vector<int>x{1,2,3,4};", SpaceBetweenBraces));
9315   SpaceBetweenBraces.ColumnLimit = 24;
9316   EXPECT_EQ("vector< int > x{ 1, 2,\n"
9317             "                 3, 4 };",
9318             format("vector<int>x{1,2,3,4};", SpaceBetweenBraces));
9319   EXPECT_EQ("vector< int > x{\n"
9320             "    1,\n"
9321             "    2,\n"
9322             "    3,\n"
9323             "    4,\n"
9324             "};",
9325             format("vector<int>x{1,2,3,4,};", SpaceBetweenBraces));
9326   verifyFormat("vector< int > x{};", SpaceBetweenBraces);
9327   SpaceBetweenBraces.SpaceInEmptyParentheses = true;
9328   verifyFormat("vector< int > x{ };", SpaceBetweenBraces);
9329 }
9330 
9331 TEST_F(FormatTest, FormatSpacesInAngles) {
9332   FormatStyle SpaceInAngles = getLLVMStyle();
9333   SpaceInAngles.SpacesInAngles = true;
9334   verifyFormat("vector< ::std::string > x1;", SpaceInAngles);
9335   verifyFormat("Foo< int, Bar > x2;", SpaceInAngles);
9336   verifyFormat("Foo< ::int, ::Bar > x3;", SpaceInAngles);
9337 
9338   SpaceInAngles.SpacesInAngles = false;
9339   verifyFormat("vector<::std::string> x4;", SpaceInAngles);
9340   verifyFormat("vector<int> x5;", SpaceInAngles);
9341   verifyFormat("Foo<int, Bar> x6;", SpaceInAngles);
9342   verifyFormat("Foo<::int, ::Bar> x7;", SpaceInAngles);
9343 }
9344 
9345 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
9346   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9347                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9348                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9349                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9350                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9351                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
9352   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
9353                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9354                "                 1, 22, 333, 4444, 55555, //\n"
9355                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9356                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
9357   verifyFormat(
9358       "vector<int> x = {1,       22, 333, 4444, 55555, 666666, 7777777,\n"
9359       "                 1,       22, 333, 4444, 55555, 666666, 7777777,\n"
9360       "                 1,       22, 333, 4444, 55555, 666666, // comment\n"
9361       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
9362       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
9363       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
9364       "                 7777777};");
9365   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
9366                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
9367                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
9368   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
9369                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
9370                "    // Separating comment.\n"
9371                "    X86::R8, X86::R9, X86::R10, X86::R11, 0};");
9372   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
9373                "    // Leading comment\n"
9374                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
9375                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
9376   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
9377                "                 1, 1, 1, 1};",
9378                getLLVMStyleWithColumns(39));
9379   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
9380                "                 1, 1, 1, 1};",
9381                getLLVMStyleWithColumns(38));
9382   verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
9383                "    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
9384                getLLVMStyleWithColumns(43));
9385   verifyFormat(
9386       "static unsigned SomeValues[10][3] = {\n"
9387       "    {1, 4, 0},  {4, 9, 0},  {4, 5, 9},  {8, 5, 4}, {1, 8, 4},\n"
9388       "    {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
9389   verifyFormat("static auto fields = new vector<string>{\n"
9390                "    \"aaaaaaaaaaaaa\",\n"
9391                "    \"aaaaaaaaaaaaa\",\n"
9392                "    \"aaaaaaaaaaaa\",\n"
9393                "    \"aaaaaaaaaaaaaa\",\n"
9394                "    \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
9395                "    \"aaaaaaaaaaaa\",\n"
9396                "    \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
9397                "};");
9398   verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
9399   verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
9400                "                 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
9401                "                 3, cccccccccccccccccccccc};",
9402                getLLVMStyleWithColumns(60));
9403 
9404   // Trailing commas.
9405   verifyFormat("vector<int> x = {\n"
9406                "    1, 1, 1, 1, 1, 1, 1, 1,\n"
9407                "};",
9408                getLLVMStyleWithColumns(39));
9409   verifyFormat("vector<int> x = {\n"
9410                "    1, 1, 1, 1, 1, 1, 1, 1, //\n"
9411                "};",
9412                getLLVMStyleWithColumns(39));
9413   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
9414                "                 1, 1, 1, 1,\n"
9415                "                 /**/ /**/};",
9416                getLLVMStyleWithColumns(39));
9417 
9418   // Trailing comment in the first line.
9419   verifyFormat("vector<int> iiiiiiiiiiiiiii = {                      //\n"
9420                "    1111111111, 2222222222, 33333333333, 4444444444, //\n"
9421                "    111111111,  222222222,  3333333333,  444444444,  //\n"
9422                "    11111111,   22222222,   333333333,   44444444};");
9423   // Trailing comment in the last line.
9424   verifyFormat("int aaaaa[] = {\n"
9425                "    1, 2, 3, // comment\n"
9426                "    4, 5, 6  // comment\n"
9427                "};");
9428 
9429   // With nested lists, we should either format one item per line or all nested
9430   // lists one on line.
9431   // FIXME: For some nested lists, we can do better.
9432   verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
9433                "        {aaaaaaaaaaaaaaaaaaa},\n"
9434                "        {aaaaaaaaaaaaaaaaaaaaa},\n"
9435                "        {aaaaaaaaaaaaaaaaa}};",
9436                getLLVMStyleWithColumns(60));
9437   verifyFormat(
9438       "SomeStruct my_struct_array = {\n"
9439       "    {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
9440       "     aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
9441       "    {aaa, aaa},\n"
9442       "    {aaa, aaa},\n"
9443       "    {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
9444       "    {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
9445       "     aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
9446 
9447   // No column layout should be used here.
9448   verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
9449                "                   bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
9450 
9451   verifyNoCrash("a<,");
9452 
9453   // No braced initializer here.
9454   verifyFormat("void f() {\n"
9455                "  struct Dummy {};\n"
9456                "  f(v);\n"
9457                "}");
9458 
9459   // Long lists should be formatted in columns even if they are nested.
9460   verifyFormat(
9461       "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9462       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9463       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9464       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9465       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9466       "                          1, 22, 333, 4444, 55555, 666666, 7777777});");
9467 
9468   // Allow "single-column" layout even if that violates the column limit. There
9469   // isn't going to be a better way.
9470   verifyFormat("std::vector<int> a = {\n"
9471                "    aaaaaaaa,\n"
9472                "    aaaaaaaa,\n"
9473                "    aaaaaaaa,\n"
9474                "    aaaaaaaa,\n"
9475                "    aaaaaaaaaa,\n"
9476                "    aaaaaaaa,\n"
9477                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
9478                getLLVMStyleWithColumns(30));
9479   verifyFormat("vector<int> aaaa = {\n"
9480                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
9481                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
9482                "    aaaaaa.aaaaaaa,\n"
9483                "    aaaaaa.aaaaaaa,\n"
9484                "    aaaaaa.aaaaaaa,\n"
9485                "    aaaaaa.aaaaaaa,\n"
9486                "};");
9487 
9488   // Don't create hanging lists.
9489   verifyFormat("someFunction(Param, {List1, List2,\n"
9490                "                     List3});",
9491                getLLVMStyleWithColumns(35));
9492   verifyFormat("someFunction(Param, Param,\n"
9493                "             {List1, List2,\n"
9494                "              List3});",
9495                getLLVMStyleWithColumns(35));
9496   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
9497                "                               aaaaaaaaaaaaaaaaaaaaaaa);");
9498 }
9499 
9500 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
9501   FormatStyle DoNotMerge = getLLVMStyle();
9502   DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
9503 
9504   verifyFormat("void f() { return 42; }");
9505   verifyFormat("void f() {\n"
9506                "  return 42;\n"
9507                "}",
9508                DoNotMerge);
9509   verifyFormat("void f() {\n"
9510                "  // Comment\n"
9511                "}");
9512   verifyFormat("{\n"
9513                "#error {\n"
9514                "  int a;\n"
9515                "}");
9516   verifyFormat("{\n"
9517                "  int a;\n"
9518                "#error {\n"
9519                "}");
9520   verifyFormat("void f() {} // comment");
9521   verifyFormat("void f() { int a; } // comment");
9522   verifyFormat("void f() {\n"
9523                "} // comment",
9524                DoNotMerge);
9525   verifyFormat("void f() {\n"
9526                "  int a;\n"
9527                "} // comment",
9528                DoNotMerge);
9529   verifyFormat("void f() {\n"
9530                "} // comment",
9531                getLLVMStyleWithColumns(15));
9532 
9533   verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
9534   verifyFormat("void f() {\n  return 42;\n}", getLLVMStyleWithColumns(22));
9535 
9536   verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
9537   verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
9538   verifyFormat("class C {\n"
9539                "  C()\n"
9540                "      : iiiiiiii(nullptr),\n"
9541                "        kkkkkkk(nullptr),\n"
9542                "        mmmmmmm(nullptr),\n"
9543                "        nnnnnnn(nullptr) {}\n"
9544                "};",
9545                getGoogleStyle());
9546 
9547   FormatStyle NoColumnLimit = getLLVMStyle();
9548   NoColumnLimit.ColumnLimit = 0;
9549   EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
9550   EXPECT_EQ("class C {\n"
9551             "  A() : b(0) {}\n"
9552             "};",
9553             format("class C{A():b(0){}};", NoColumnLimit));
9554   EXPECT_EQ("A()\n"
9555             "    : b(0) {\n"
9556             "}",
9557             format("A()\n:b(0)\n{\n}", NoColumnLimit));
9558 
9559   FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
9560   DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
9561       FormatStyle::SFS_None;
9562   EXPECT_EQ("A()\n"
9563             "    : b(0) {\n"
9564             "}",
9565             format("A():b(0){}", DoNotMergeNoColumnLimit));
9566   EXPECT_EQ("A()\n"
9567             "    : b(0) {\n"
9568             "}",
9569             format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
9570 
9571   verifyFormat("#define A          \\\n"
9572                "  void f() {       \\\n"
9573                "    int i;         \\\n"
9574                "  }",
9575                getLLVMStyleWithColumns(20));
9576   verifyFormat("#define A           \\\n"
9577                "  void f() { int i; }",
9578                getLLVMStyleWithColumns(21));
9579   verifyFormat("#define A            \\\n"
9580                "  void f() {         \\\n"
9581                "    int i;           \\\n"
9582                "  }                  \\\n"
9583                "  int j;",
9584                getLLVMStyleWithColumns(22));
9585   verifyFormat("#define A             \\\n"
9586                "  void f() { int i; } \\\n"
9587                "  int j;",
9588                getLLVMStyleWithColumns(23));
9589 }
9590 
9591 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
9592   FormatStyle MergeEmptyOnly = getLLVMStyle();
9593   MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
9594   verifyFormat("class C {\n"
9595                "  int f() {}\n"
9596                "};",
9597                MergeEmptyOnly);
9598   verifyFormat("class C {\n"
9599                "  int f() {\n"
9600                "    return 42;\n"
9601                "  }\n"
9602                "};",
9603                MergeEmptyOnly);
9604   verifyFormat("int f() {}", MergeEmptyOnly);
9605   verifyFormat("int f() {\n"
9606                "  return 42;\n"
9607                "}",
9608                MergeEmptyOnly);
9609 
9610   // Also verify behavior when BraceWrapping.AfterFunction = true
9611   MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
9612   MergeEmptyOnly.BraceWrapping.AfterFunction = true;
9613   verifyFormat("int f() {}", MergeEmptyOnly);
9614   verifyFormat("class C {\n"
9615                "  int f() {}\n"
9616                "};",
9617                MergeEmptyOnly);
9618 }
9619 
9620 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
9621   FormatStyle MergeInlineOnly = getLLVMStyle();
9622   MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
9623   verifyFormat("class C {\n"
9624                "  int f() { return 42; }\n"
9625                "};",
9626                MergeInlineOnly);
9627   verifyFormat("int f() {\n"
9628                "  return 42;\n"
9629                "}",
9630                MergeInlineOnly);
9631 
9632   // SFS_Inline implies SFS_Empty
9633   verifyFormat("class C {\n"
9634                "  int f() {}\n"
9635                "};",
9636                MergeInlineOnly);
9637   verifyFormat("int f() {}", MergeInlineOnly);
9638 
9639   // Also verify behavior when BraceWrapping.AfterFunction = true
9640   MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
9641   MergeInlineOnly.BraceWrapping.AfterFunction = true;
9642   verifyFormat("class C {\n"
9643                "  int f() { return 42; }\n"
9644                "};",
9645                MergeInlineOnly);
9646   verifyFormat("int f()\n"
9647                "{\n"
9648                "  return 42;\n"
9649                "}",
9650                MergeInlineOnly);
9651 
9652   // SFS_Inline implies SFS_Empty
9653   verifyFormat("int f() {}", MergeInlineOnly);
9654   verifyFormat("class C {\n"
9655                "  int f() {}\n"
9656                "};",
9657                MergeInlineOnly);
9658 }
9659 
9660 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
9661   FormatStyle MergeInlineOnly = getLLVMStyle();
9662   MergeInlineOnly.AllowShortFunctionsOnASingleLine =
9663       FormatStyle::SFS_InlineOnly;
9664   verifyFormat("class C {\n"
9665                "  int f() { return 42; }\n"
9666                "};",
9667                MergeInlineOnly);
9668   verifyFormat("int f() {\n"
9669                "  return 42;\n"
9670                "}",
9671                MergeInlineOnly);
9672 
9673   // SFS_InlineOnly does not imply SFS_Empty
9674   verifyFormat("class C {\n"
9675                "  int f() {}\n"
9676                "};",
9677                MergeInlineOnly);
9678   verifyFormat("int f() {\n"
9679                "}",
9680                MergeInlineOnly);
9681 
9682   // Also verify behavior when BraceWrapping.AfterFunction = true
9683   MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
9684   MergeInlineOnly.BraceWrapping.AfterFunction = true;
9685   verifyFormat("class C {\n"
9686                "  int f() { return 42; }\n"
9687                "};",
9688                MergeInlineOnly);
9689   verifyFormat("int f()\n"
9690                "{\n"
9691                "  return 42;\n"
9692                "}",
9693                MergeInlineOnly);
9694 
9695   // SFS_InlineOnly does not imply SFS_Empty
9696   verifyFormat("int f()\n"
9697                "{\n"
9698                "}",
9699                MergeInlineOnly);
9700   verifyFormat("class C {\n"
9701                "  int f() {}\n"
9702                "};",
9703                MergeInlineOnly);
9704 }
9705 
9706 TEST_F(FormatTest, SplitEmptyFunction) {
9707   FormatStyle Style = getLLVMStyle();
9708   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
9709   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9710   Style.BraceWrapping.AfterFunction = true;
9711   Style.BraceWrapping.SplitEmptyFunction = false;
9712   Style.ColumnLimit = 40;
9713 
9714   verifyFormat("int f()\n"
9715                "{}",
9716                Style);
9717   verifyFormat("int f()\n"
9718                "{\n"
9719                "  return 42;\n"
9720                "}",
9721                Style);
9722   verifyFormat("int f()\n"
9723                "{\n"
9724                "  // some comment\n"
9725                "}",
9726                Style);
9727 
9728   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
9729   verifyFormat("int f() {}", Style);
9730   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
9731                "{}",
9732                Style);
9733   verifyFormat("int f()\n"
9734                "{\n"
9735                "  return 0;\n"
9736                "}",
9737                Style);
9738 
9739   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
9740   verifyFormat("class Foo {\n"
9741                "  int f() {}\n"
9742                "};\n",
9743                Style);
9744   verifyFormat("class Foo {\n"
9745                "  int f() { return 0; }\n"
9746                "};\n",
9747                Style);
9748   verifyFormat("class Foo {\n"
9749                "  int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
9750                "  {}\n"
9751                "};\n",
9752                Style);
9753   verifyFormat("class Foo {\n"
9754                "  int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
9755                "  {\n"
9756                "    return 0;\n"
9757                "  }\n"
9758                "};\n",
9759                Style);
9760 
9761   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
9762   verifyFormat("int f() {}", Style);
9763   verifyFormat("int f() { return 0; }", Style);
9764   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
9765                "{}",
9766                Style);
9767   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
9768                "{\n"
9769                "  return 0;\n"
9770                "}",
9771                Style);
9772 }
9773 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
9774   FormatStyle Style = getLLVMStyle();
9775   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
9776   verifyFormat("#ifdef A\n"
9777                "int f() {}\n"
9778                "#else\n"
9779                "int g() {}\n"
9780                "#endif",
9781                Style);
9782 }
9783 
9784 TEST_F(FormatTest, SplitEmptyClass) {
9785   FormatStyle Style = getLLVMStyle();
9786   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9787   Style.BraceWrapping.AfterClass = true;
9788   Style.BraceWrapping.SplitEmptyRecord = false;
9789 
9790   verifyFormat("class Foo\n"
9791                "{};",
9792                Style);
9793   verifyFormat("/* something */ class Foo\n"
9794                "{};",
9795                Style);
9796   verifyFormat("template <typename X> class Foo\n"
9797                "{};",
9798                Style);
9799   verifyFormat("class Foo\n"
9800                "{\n"
9801                "  Foo();\n"
9802                "};",
9803                Style);
9804   verifyFormat("typedef class Foo\n"
9805                "{\n"
9806                "} Foo_t;",
9807                Style);
9808 }
9809 
9810 TEST_F(FormatTest, SplitEmptyStruct) {
9811   FormatStyle Style = getLLVMStyle();
9812   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9813   Style.BraceWrapping.AfterStruct = true;
9814   Style.BraceWrapping.SplitEmptyRecord = false;
9815 
9816   verifyFormat("struct Foo\n"
9817                "{};",
9818                Style);
9819   verifyFormat("/* something */ struct Foo\n"
9820                "{};",
9821                Style);
9822   verifyFormat("template <typename X> struct Foo\n"
9823                "{};",
9824                Style);
9825   verifyFormat("struct Foo\n"
9826                "{\n"
9827                "  Foo();\n"
9828                "};",
9829                Style);
9830   verifyFormat("typedef struct Foo\n"
9831                "{\n"
9832                "} Foo_t;",
9833                Style);
9834   // typedef struct Bar {} Bar_t;
9835 }
9836 
9837 TEST_F(FormatTest, SplitEmptyUnion) {
9838   FormatStyle Style = getLLVMStyle();
9839   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9840   Style.BraceWrapping.AfterUnion = true;
9841   Style.BraceWrapping.SplitEmptyRecord = false;
9842 
9843   verifyFormat("union Foo\n"
9844                "{};",
9845                Style);
9846   verifyFormat("/* something */ union Foo\n"
9847                "{};",
9848                Style);
9849   verifyFormat("union Foo\n"
9850                "{\n"
9851                "  A,\n"
9852                "};",
9853                Style);
9854   verifyFormat("typedef union Foo\n"
9855                "{\n"
9856                "} Foo_t;",
9857                Style);
9858 }
9859 
9860 TEST_F(FormatTest, SplitEmptyNamespace) {
9861   FormatStyle Style = getLLVMStyle();
9862   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9863   Style.BraceWrapping.AfterNamespace = true;
9864   Style.BraceWrapping.SplitEmptyNamespace = false;
9865 
9866   verifyFormat("namespace Foo\n"
9867                "{};",
9868                Style);
9869   verifyFormat("/* something */ namespace Foo\n"
9870                "{};",
9871                Style);
9872   verifyFormat("inline namespace Foo\n"
9873                "{};",
9874                Style);
9875   verifyFormat("/* something */ inline namespace Foo\n"
9876                "{};",
9877                Style);
9878   verifyFormat("export namespace Foo\n"
9879                "{};",
9880                Style);
9881   verifyFormat("namespace Foo\n"
9882                "{\n"
9883                "void Bar();\n"
9884                "};",
9885                Style);
9886 }
9887 
9888 TEST_F(FormatTest, NeverMergeShortRecords) {
9889   FormatStyle Style = getLLVMStyle();
9890 
9891   verifyFormat("class Foo {\n"
9892                "  Foo();\n"
9893                "};",
9894                Style);
9895   verifyFormat("typedef class Foo {\n"
9896                "  Foo();\n"
9897                "} Foo_t;",
9898                Style);
9899   verifyFormat("struct Foo {\n"
9900                "  Foo();\n"
9901                "};",
9902                Style);
9903   verifyFormat("typedef struct Foo {\n"
9904                "  Foo();\n"
9905                "} Foo_t;",
9906                Style);
9907   verifyFormat("union Foo {\n"
9908                "  A,\n"
9909                "};",
9910                Style);
9911   verifyFormat("typedef union Foo {\n"
9912                "  A,\n"
9913                "} Foo_t;",
9914                Style);
9915   verifyFormat("namespace Foo {\n"
9916                "void Bar();\n"
9917                "};",
9918                Style);
9919 
9920   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9921   Style.BraceWrapping.AfterClass = true;
9922   Style.BraceWrapping.AfterStruct = true;
9923   Style.BraceWrapping.AfterUnion = true;
9924   Style.BraceWrapping.AfterNamespace = true;
9925   verifyFormat("class Foo\n"
9926                "{\n"
9927                "  Foo();\n"
9928                "};",
9929                Style);
9930   verifyFormat("typedef class Foo\n"
9931                "{\n"
9932                "  Foo();\n"
9933                "} Foo_t;",
9934                Style);
9935   verifyFormat("struct Foo\n"
9936                "{\n"
9937                "  Foo();\n"
9938                "};",
9939                Style);
9940   verifyFormat("typedef struct Foo\n"
9941                "{\n"
9942                "  Foo();\n"
9943                "} Foo_t;",
9944                Style);
9945   verifyFormat("union Foo\n"
9946                "{\n"
9947                "  A,\n"
9948                "};",
9949                Style);
9950   verifyFormat("typedef union Foo\n"
9951                "{\n"
9952                "  A,\n"
9953                "} Foo_t;",
9954                Style);
9955   verifyFormat("namespace Foo\n"
9956                "{\n"
9957                "void Bar();\n"
9958                "};",
9959                Style);
9960 }
9961 
9962 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
9963   // Elaborate type variable declarations.
9964   verifyFormat("struct foo a = {bar};\nint n;");
9965   verifyFormat("class foo a = {bar};\nint n;");
9966   verifyFormat("union foo a = {bar};\nint n;");
9967 
9968   // Elaborate types inside function definitions.
9969   verifyFormat("struct foo f() {}\nint n;");
9970   verifyFormat("class foo f() {}\nint n;");
9971   verifyFormat("union foo f() {}\nint n;");
9972 
9973   // Templates.
9974   verifyFormat("template <class X> void f() {}\nint n;");
9975   verifyFormat("template <struct X> void f() {}\nint n;");
9976   verifyFormat("template <union X> void f() {}\nint n;");
9977 
9978   // Actual definitions...
9979   verifyFormat("struct {\n} n;");
9980   verifyFormat(
9981       "template <template <class T, class Y>, class Z> class X {\n} n;");
9982   verifyFormat("union Z {\n  int n;\n} x;");
9983   verifyFormat("class MACRO Z {\n} n;");
9984   verifyFormat("class MACRO(X) Z {\n} n;");
9985   verifyFormat("class __attribute__(X) Z {\n} n;");
9986   verifyFormat("class __declspec(X) Z {\n} n;");
9987   verifyFormat("class A##B##C {\n} n;");
9988   verifyFormat("class alignas(16) Z {\n} n;");
9989   verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
9990   verifyFormat("class MACROA MACRO(X) Z {\n} n;");
9991 
9992   // Redefinition from nested context:
9993   verifyFormat("class A::B::C {\n} n;");
9994 
9995   // Template definitions.
9996   verifyFormat(
9997       "template <typename F>\n"
9998       "Matcher(const Matcher<F> &Other,\n"
9999       "        typename enable_if_c<is_base_of<F, T>::value &&\n"
10000       "                             !is_same<F, T>::value>::type * = 0)\n"
10001       "    : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
10002 
10003   // FIXME: This is still incorrectly handled at the formatter side.
10004   verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
10005   verifyFormat("int i = SomeFunction(a<b, a> b);");
10006 
10007   // FIXME:
10008   // This now gets parsed incorrectly as class definition.
10009   // verifyFormat("class A<int> f() {\n}\nint n;");
10010 
10011   // Elaborate types where incorrectly parsing the structural element would
10012   // break the indent.
10013   verifyFormat("if (true)\n"
10014                "  class X x;\n"
10015                "else\n"
10016                "  f();\n");
10017 
10018   // This is simply incomplete. Formatting is not important, but must not crash.
10019   verifyFormat("class A:");
10020 }
10021 
10022 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
10023   EXPECT_EQ("#error Leave     all         white!!!!! space* alone!\n",
10024             format("#error Leave     all         white!!!!! space* alone!\n"));
10025   EXPECT_EQ(
10026       "#warning Leave     all         white!!!!! space* alone!\n",
10027       format("#warning Leave     all         white!!!!! space* alone!\n"));
10028   EXPECT_EQ("#error 1", format("  #  error   1"));
10029   EXPECT_EQ("#warning 1", format("  #  warning 1"));
10030 }
10031 
10032 TEST_F(FormatTest, FormatHashIfExpressions) {
10033   verifyFormat("#if AAAA && BBBB");
10034   verifyFormat("#if (AAAA && BBBB)");
10035   verifyFormat("#elif (AAAA && BBBB)");
10036   // FIXME: Come up with a better indentation for #elif.
10037   verifyFormat(
10038       "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) &&  \\\n"
10039       "    defined(BBBBBBBB)\n"
10040       "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) &&  \\\n"
10041       "    defined(BBBBBBBB)\n"
10042       "#endif",
10043       getLLVMStyleWithColumns(65));
10044 }
10045 
10046 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
10047   FormatStyle AllowsMergedIf = getGoogleStyle();
10048   AllowsMergedIf.AllowShortIfStatementsOnASingleLine =
10049       FormatStyle::SIS_WithoutElse;
10050   verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
10051   verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
10052   verifyFormat("if (true)\n#error E\n  return 42;", AllowsMergedIf);
10053   EXPECT_EQ("if (true) return 42;",
10054             format("if (true)\nreturn 42;", AllowsMergedIf));
10055   FormatStyle ShortMergedIf = AllowsMergedIf;
10056   ShortMergedIf.ColumnLimit = 25;
10057   verifyFormat("#define A \\\n"
10058                "  if (true) return 42;",
10059                ShortMergedIf);
10060   verifyFormat("#define A \\\n"
10061                "  f();    \\\n"
10062                "  if (true)\n"
10063                "#define B",
10064                ShortMergedIf);
10065   verifyFormat("#define A \\\n"
10066                "  f();    \\\n"
10067                "  if (true)\n"
10068                "g();",
10069                ShortMergedIf);
10070   verifyFormat("{\n"
10071                "#ifdef A\n"
10072                "  // Comment\n"
10073                "  if (true) continue;\n"
10074                "#endif\n"
10075                "  // Comment\n"
10076                "  if (true) continue;\n"
10077                "}",
10078                ShortMergedIf);
10079   ShortMergedIf.ColumnLimit = 33;
10080   verifyFormat("#define A \\\n"
10081                "  if constexpr (true) return 42;",
10082                ShortMergedIf);
10083   verifyFormat("#define A \\\n"
10084                "  if CONSTEXPR (true) return 42;",
10085                ShortMergedIf);
10086   ShortMergedIf.ColumnLimit = 29;
10087   verifyFormat("#define A                   \\\n"
10088                "  if (aaaaaaaaaa) return 1; \\\n"
10089                "  return 2;",
10090                ShortMergedIf);
10091   ShortMergedIf.ColumnLimit = 28;
10092   verifyFormat("#define A         \\\n"
10093                "  if (aaaaaaaaaa) \\\n"
10094                "    return 1;     \\\n"
10095                "  return 2;",
10096                ShortMergedIf);
10097   verifyFormat("#define A                \\\n"
10098                "  if constexpr (aaaaaaa) \\\n"
10099                "    return 1;            \\\n"
10100                "  return 2;",
10101                ShortMergedIf);
10102   verifyFormat("#define A                \\\n"
10103                "  if CONSTEXPR (aaaaaaa) \\\n"
10104                "    return 1;            \\\n"
10105                "  return 2;",
10106                ShortMergedIf);
10107 }
10108 
10109 TEST_F(FormatTest, FormatStarDependingOnContext) {
10110   verifyFormat("void f(int *a);");
10111   verifyFormat("void f() { f(fint * b); }");
10112   verifyFormat("class A {\n  void f(int *a);\n};");
10113   verifyFormat("class A {\n  int *a;\n};");
10114   verifyFormat("namespace a {\n"
10115                "namespace b {\n"
10116                "class A {\n"
10117                "  void f() {}\n"
10118                "  int *a;\n"
10119                "};\n"
10120                "} // namespace b\n"
10121                "} // namespace a");
10122 }
10123 
10124 TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
10125   verifyFormat("while");
10126   verifyFormat("operator");
10127 }
10128 
10129 TEST_F(FormatTest, SkipsDeeplyNestedLines) {
10130   // This code would be painfully slow to format if we didn't skip it.
10131   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
10132                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
10133                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
10134                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
10135                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
10136                    "A(1, 1)\n"
10137                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
10138                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
10139                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
10140                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
10141                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
10142                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
10143                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
10144                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
10145                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
10146                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
10147   // Deeply nested part is untouched, rest is formatted.
10148   EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
10149             format(std::string("int    i;\n") + Code + "int    j;\n",
10150                    getLLVMStyle(), SC_ExpectIncomplete));
10151 }
10152 
10153 //===----------------------------------------------------------------------===//
10154 // Objective-C tests.
10155 //===----------------------------------------------------------------------===//
10156 
10157 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
10158   verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
10159   EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
10160             format("-(NSUInteger)indexOfObject:(id)anObject;"));
10161   EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
10162   EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
10163   EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
10164             format("-(NSInteger)Method3:(id)anObject;"));
10165   EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
10166             format("-(NSInteger)Method4:(id)anObject;"));
10167   EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
10168             format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
10169   EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
10170             format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
10171   EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
10172             "forAllCells:(BOOL)flag;",
10173             format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
10174                    "forAllCells:(BOOL)flag;"));
10175 
10176   // Very long objectiveC method declaration.
10177   verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
10178                "    (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
10179   verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
10180                "                    inRange:(NSRange)range\n"
10181                "                   outRange:(NSRange)out_range\n"
10182                "                  outRange1:(NSRange)out_range1\n"
10183                "                  outRange2:(NSRange)out_range2\n"
10184                "                  outRange3:(NSRange)out_range3\n"
10185                "                  outRange4:(NSRange)out_range4\n"
10186                "                  outRange5:(NSRange)out_range5\n"
10187                "                  outRange6:(NSRange)out_range6\n"
10188                "                  outRange7:(NSRange)out_range7\n"
10189                "                  outRange8:(NSRange)out_range8\n"
10190                "                  outRange9:(NSRange)out_range9;");
10191 
10192   // When the function name has to be wrapped.
10193   FormatStyle Style = getLLVMStyle();
10194   // ObjC ignores IndentWrappedFunctionNames when wrapping methods
10195   // and always indents instead.
10196   Style.IndentWrappedFunctionNames = false;
10197   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
10198                "    veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
10199                "               anotherName:(NSString)bbbbbbbbbbbbbb {\n"
10200                "}",
10201                Style);
10202   Style.IndentWrappedFunctionNames = true;
10203   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
10204                "    veryLooooooooooongName:(NSString)cccccccccccccc\n"
10205                "               anotherName:(NSString)dddddddddddddd {\n"
10206                "}",
10207                Style);
10208 
10209   verifyFormat("- (int)sum:(vector<int>)numbers;");
10210   verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
10211   // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
10212   // protocol lists (but not for template classes):
10213   // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
10214 
10215   verifyFormat("- (int (*)())foo:(int (*)())f;");
10216   verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
10217 
10218   // If there's no return type (very rare in practice!), LLVM and Google style
10219   // agree.
10220   verifyFormat("- foo;");
10221   verifyFormat("- foo:(int)f;");
10222   verifyGoogleFormat("- foo:(int)foo;");
10223 }
10224 
10225 TEST_F(FormatTest, BreaksStringLiterals) {
10226   EXPECT_EQ("\"some text \"\n"
10227             "\"other\";",
10228             format("\"some text other\";", getLLVMStyleWithColumns(12)));
10229   EXPECT_EQ("\"some text \"\n"
10230             "\"other\";",
10231             format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
10232   EXPECT_EQ(
10233       "#define A  \\\n"
10234       "  \"some \"  \\\n"
10235       "  \"text \"  \\\n"
10236       "  \"other\";",
10237       format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
10238   EXPECT_EQ(
10239       "#define A  \\\n"
10240       "  \"so \"    \\\n"
10241       "  \"text \"  \\\n"
10242       "  \"other\";",
10243       format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
10244 
10245   EXPECT_EQ("\"some text\"",
10246             format("\"some text\"", getLLVMStyleWithColumns(1)));
10247   EXPECT_EQ("\"some text\"",
10248             format("\"some text\"", getLLVMStyleWithColumns(11)));
10249   EXPECT_EQ("\"some \"\n"
10250             "\"text\"",
10251             format("\"some text\"", getLLVMStyleWithColumns(10)));
10252   EXPECT_EQ("\"some \"\n"
10253             "\"text\"",
10254             format("\"some text\"", getLLVMStyleWithColumns(7)));
10255   EXPECT_EQ("\"some\"\n"
10256             "\" tex\"\n"
10257             "\"t\"",
10258             format("\"some text\"", getLLVMStyleWithColumns(6)));
10259   EXPECT_EQ("\"some\"\n"
10260             "\" tex\"\n"
10261             "\" and\"",
10262             format("\"some tex and\"", getLLVMStyleWithColumns(6)));
10263   EXPECT_EQ("\"some\"\n"
10264             "\"/tex\"\n"
10265             "\"/and\"",
10266             format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
10267 
10268   EXPECT_EQ("variable =\n"
10269             "    \"long string \"\n"
10270             "    \"literal\";",
10271             format("variable = \"long string literal\";",
10272                    getLLVMStyleWithColumns(20)));
10273 
10274   EXPECT_EQ("variable = f(\n"
10275             "    \"long string \"\n"
10276             "    \"literal\",\n"
10277             "    short,\n"
10278             "    loooooooooooooooooooong);",
10279             format("variable = f(\"long string literal\", short, "
10280                    "loooooooooooooooooooong);",
10281                    getLLVMStyleWithColumns(20)));
10282 
10283   EXPECT_EQ(
10284       "f(g(\"long string \"\n"
10285       "    \"literal\"),\n"
10286       "  b);",
10287       format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
10288   EXPECT_EQ("f(g(\"long string \"\n"
10289             "    \"literal\",\n"
10290             "    a),\n"
10291             "  b);",
10292             format("f(g(\"long string literal\", a), b);",
10293                    getLLVMStyleWithColumns(20)));
10294   EXPECT_EQ(
10295       "f(\"one two\".split(\n"
10296       "    variable));",
10297       format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
10298   EXPECT_EQ("f(\"one two three four five six \"\n"
10299             "  \"seven\".split(\n"
10300             "      really_looooong_variable));",
10301             format("f(\"one two three four five six seven\"."
10302                    "split(really_looooong_variable));",
10303                    getLLVMStyleWithColumns(33)));
10304 
10305   EXPECT_EQ("f(\"some \"\n"
10306             "  \"text\",\n"
10307             "  other);",
10308             format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
10309 
10310   // Only break as a last resort.
10311   verifyFormat(
10312       "aaaaaaaaaaaaaaaaaaaa(\n"
10313       "    aaaaaaaaaaaaaaaaaaaa,\n"
10314       "    aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
10315 
10316   EXPECT_EQ("\"splitmea\"\n"
10317             "\"trandomp\"\n"
10318             "\"oint\"",
10319             format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
10320 
10321   EXPECT_EQ("\"split/\"\n"
10322             "\"pathat/\"\n"
10323             "\"slashes\"",
10324             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
10325 
10326   EXPECT_EQ("\"split/\"\n"
10327             "\"pathat/\"\n"
10328             "\"slashes\"",
10329             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
10330   EXPECT_EQ("\"split at \"\n"
10331             "\"spaces/at/\"\n"
10332             "\"slashes.at.any$\"\n"
10333             "\"non-alphanumeric%\"\n"
10334             "\"1111111111characte\"\n"
10335             "\"rs\"",
10336             format("\"split at "
10337                    "spaces/at/"
10338                    "slashes.at."
10339                    "any$non-"
10340                    "alphanumeric%"
10341                    "1111111111characte"
10342                    "rs\"",
10343                    getLLVMStyleWithColumns(20)));
10344 
10345   // Verify that splitting the strings understands
10346   // Style::AlwaysBreakBeforeMultilineStrings.
10347   EXPECT_EQ("aaaaaaaaaaaa(\n"
10348             "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
10349             "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
10350             format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
10351                    "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
10352                    "aaaaaaaaaaaaaaaaaaaaaa\");",
10353                    getGoogleStyle()));
10354   EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
10355             "       \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
10356             format("return \"aaaaaaaaaaaaaaaaaaaaaa "
10357                    "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
10358                    "aaaaaaaaaaaaaaaaaaaaaa\";",
10359                    getGoogleStyle()));
10360   EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
10361             "                \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
10362             format("llvm::outs() << "
10363                    "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
10364                    "aaaaaaaaaaaaaaaaaaa\";"));
10365   EXPECT_EQ("ffff(\n"
10366             "    {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
10367             "     \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
10368             format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
10369                    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
10370                    getGoogleStyle()));
10371 
10372   FormatStyle Style = getLLVMStyleWithColumns(12);
10373   Style.BreakStringLiterals = false;
10374   EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
10375 
10376   FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
10377   AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10378   EXPECT_EQ("#define A \\\n"
10379             "  \"some \" \\\n"
10380             "  \"text \" \\\n"
10381             "  \"other\";",
10382             format("#define A \"some text other\";", AlignLeft));
10383 }
10384 
10385 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) {
10386   EXPECT_EQ("C a = \"some more \"\n"
10387             "      \"text\";",
10388             format("C a = \"some more text\";", getLLVMStyleWithColumns(18)));
10389 }
10390 
10391 TEST_F(FormatTest, FullyRemoveEmptyLines) {
10392   FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
10393   NoEmptyLines.MaxEmptyLinesToKeep = 0;
10394   EXPECT_EQ("int i = a(b());",
10395             format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
10396 }
10397 
10398 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
10399   EXPECT_EQ(
10400       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10401       "(\n"
10402       "    \"x\t\");",
10403       format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10404              "aaaaaaa("
10405              "\"x\t\");"));
10406 }
10407 
10408 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
10409   EXPECT_EQ(
10410       "u8\"utf8 string \"\n"
10411       "u8\"literal\";",
10412       format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
10413   EXPECT_EQ(
10414       "u\"utf16 string \"\n"
10415       "u\"literal\";",
10416       format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
10417   EXPECT_EQ(
10418       "U\"utf32 string \"\n"
10419       "U\"literal\";",
10420       format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
10421   EXPECT_EQ("L\"wide string \"\n"
10422             "L\"literal\";",
10423             format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
10424   EXPECT_EQ("@\"NSString \"\n"
10425             "@\"literal\";",
10426             format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
10427   verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
10428 
10429   // This input makes clang-format try to split the incomplete unicode escape
10430   // sequence, which used to lead to a crasher.
10431   verifyNoCrash(
10432       "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
10433       getLLVMStyleWithColumns(60));
10434 }
10435 
10436 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
10437   FormatStyle Style = getGoogleStyleWithColumns(15);
10438   EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
10439   EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
10440   EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
10441   EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
10442   EXPECT_EQ("u8R\"x(raw literal)x\";",
10443             format("u8R\"x(raw literal)x\";", Style));
10444 }
10445 
10446 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
10447   FormatStyle Style = getLLVMStyleWithColumns(20);
10448   EXPECT_EQ(
10449       "_T(\"aaaaaaaaaaaaaa\")\n"
10450       "_T(\"aaaaaaaaaaaaaa\")\n"
10451       "_T(\"aaaaaaaaaaaa\")",
10452       format("  _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
10453   EXPECT_EQ("f(x,\n"
10454             "  _T(\"aaaaaaaaaaaa\")\n"
10455             "  _T(\"aaa\"),\n"
10456             "  z);",
10457             format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
10458 
10459   // FIXME: Handle embedded spaces in one iteration.
10460   //  EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
10461   //            "_T(\"aaaaaaaaaaaaa\")\n"
10462   //            "_T(\"aaaaaaaaaaaaa\")\n"
10463   //            "_T(\"a\")",
10464   //            format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
10465   //                   getLLVMStyleWithColumns(20)));
10466   EXPECT_EQ(
10467       "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
10468       format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
10469   EXPECT_EQ("f(\n"
10470             "#if !TEST\n"
10471             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
10472             "#endif\n"
10473             ");",
10474             format("f(\n"
10475                    "#if !TEST\n"
10476                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
10477                    "#endif\n"
10478                    ");"));
10479   EXPECT_EQ("f(\n"
10480             "\n"
10481             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
10482             format("f(\n"
10483                    "\n"
10484                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
10485 }
10486 
10487 TEST_F(FormatTest, BreaksStringLiteralOperands) {
10488   // In a function call with two operands, the second can be broken with no line
10489   // break before it.
10490   EXPECT_EQ(
10491       "func(a, \"long long \"\n"
10492       "        \"long long\");",
10493       format("func(a, \"long long long long\");", getLLVMStyleWithColumns(24)));
10494   // In a function call with three operands, the second must be broken with a
10495   // line break before it.
10496   EXPECT_EQ("func(a,\n"
10497             "     \"long long long \"\n"
10498             "     \"long\",\n"
10499             "     c);",
10500             format("func(a, \"long long long long\", c);",
10501                    getLLVMStyleWithColumns(24)));
10502   // In a function call with three operands, the third must be broken with a
10503   // line break before it.
10504   EXPECT_EQ("func(a, b,\n"
10505             "     \"long long long \"\n"
10506             "     \"long\");",
10507             format("func(a, b, \"long long long long\");",
10508                    getLLVMStyleWithColumns(24)));
10509   // In a function call with three operands, both the second and the third must
10510   // be broken with a line break before them.
10511   EXPECT_EQ("func(a,\n"
10512             "     \"long long long \"\n"
10513             "     \"long\",\n"
10514             "     \"long long long \"\n"
10515             "     \"long\");",
10516             format("func(a, \"long long long long\", \"long long long long\");",
10517                    getLLVMStyleWithColumns(24)));
10518   // In a chain of << with two operands, the second can be broken with no line
10519   // break before it.
10520   EXPECT_EQ("a << \"line line \"\n"
10521             "     \"line\";",
10522             format("a << \"line line line\";", getLLVMStyleWithColumns(20)));
10523   // In a chain of << with three operands, the second can be broken with no line
10524   // break before it.
10525   EXPECT_EQ(
10526       "abcde << \"line \"\n"
10527       "         \"line line\"\n"
10528       "      << c;",
10529       format("abcde << \"line line line\" << c;", getLLVMStyleWithColumns(20)));
10530   // In a chain of << with three operands, the third must be broken with a line
10531   // break before it.
10532   EXPECT_EQ(
10533       "a << b\n"
10534       "  << \"line line \"\n"
10535       "     \"line\";",
10536       format("a << b << \"line line line\";", getLLVMStyleWithColumns(20)));
10537   // In a chain of << with three operands, the second can be broken with no line
10538   // break before it and the third must be broken with a line break before it.
10539   EXPECT_EQ("abcd << \"line line \"\n"
10540             "        \"line\"\n"
10541             "     << \"line line \"\n"
10542             "        \"line\";",
10543             format("abcd << \"line line line\" << \"line line line\";",
10544                    getLLVMStyleWithColumns(20)));
10545   // In a chain of binary operators with two operands, the second can be broken
10546   // with no line break before it.
10547   EXPECT_EQ(
10548       "abcd + \"line line \"\n"
10549       "       \"line line\";",
10550       format("abcd + \"line line line line\";", getLLVMStyleWithColumns(20)));
10551   // In a chain of binary operators with three operands, the second must be
10552   // broken with a line break before it.
10553   EXPECT_EQ("abcd +\n"
10554             "    \"line line \"\n"
10555             "    \"line line\" +\n"
10556             "    e;",
10557             format("abcd + \"line line line line\" + e;",
10558                    getLLVMStyleWithColumns(20)));
10559   // In a function call with two operands, with AlignAfterOpenBracket enabled,
10560   // the first must be broken with a line break before it.
10561   FormatStyle Style = getLLVMStyleWithColumns(25);
10562   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10563   EXPECT_EQ("someFunction(\n"
10564             "    \"long long long \"\n"
10565             "    \"long\",\n"
10566             "    a);",
10567             format("someFunction(\"long long long long\", a);", Style));
10568 }
10569 
10570 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
10571   EXPECT_EQ(
10572       "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
10573       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
10574       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
10575       format("aaaaaaaaaaa  =  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
10576              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
10577              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
10578 }
10579 
10580 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
10581   EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
10582             format("f(g(R\"x(raw literal)x\",   a), b);", getGoogleStyle()));
10583   EXPECT_EQ("fffffffffff(g(R\"x(\n"
10584             "multiline raw string literal xxxxxxxxxxxxxx\n"
10585             ")x\",\n"
10586             "              a),\n"
10587             "            b);",
10588             format("fffffffffff(g(R\"x(\n"
10589                    "multiline raw string literal xxxxxxxxxxxxxx\n"
10590                    ")x\", a), b);",
10591                    getGoogleStyleWithColumns(20)));
10592   EXPECT_EQ("fffffffffff(\n"
10593             "    g(R\"x(qqq\n"
10594             "multiline raw string literal xxxxxxxxxxxxxx\n"
10595             ")x\",\n"
10596             "      a),\n"
10597             "    b);",
10598             format("fffffffffff(g(R\"x(qqq\n"
10599                    "multiline raw string literal xxxxxxxxxxxxxx\n"
10600                    ")x\", a), b);",
10601                    getGoogleStyleWithColumns(20)));
10602 
10603   EXPECT_EQ("fffffffffff(R\"x(\n"
10604             "multiline raw string literal xxxxxxxxxxxxxx\n"
10605             ")x\");",
10606             format("fffffffffff(R\"x(\n"
10607                    "multiline raw string literal xxxxxxxxxxxxxx\n"
10608                    ")x\");",
10609                    getGoogleStyleWithColumns(20)));
10610   EXPECT_EQ("fffffffffff(R\"x(\n"
10611             "multiline raw string literal xxxxxxxxxxxxxx\n"
10612             ")x\" + bbbbbb);",
10613             format("fffffffffff(R\"x(\n"
10614                    "multiline raw string literal xxxxxxxxxxxxxx\n"
10615                    ")x\" +   bbbbbb);",
10616                    getGoogleStyleWithColumns(20)));
10617   EXPECT_EQ("fffffffffff(\n"
10618             "    R\"x(\n"
10619             "multiline raw string literal xxxxxxxxxxxxxx\n"
10620             ")x\" +\n"
10621             "    bbbbbb);",
10622             format("fffffffffff(\n"
10623                    " R\"x(\n"
10624                    "multiline raw string literal xxxxxxxxxxxxxx\n"
10625                    ")x\" + bbbbbb);",
10626                    getGoogleStyleWithColumns(20)));
10627   EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);",
10628             format("fffffffffff(\n"
10629                    " R\"(single line raw string)\" + bbbbbb);"));
10630 }
10631 
10632 TEST_F(FormatTest, SkipsUnknownStringLiterals) {
10633   verifyFormat("string a = \"unterminated;");
10634   EXPECT_EQ("function(\"unterminated,\n"
10635             "         OtherParameter);",
10636             format("function(  \"unterminated,\n"
10637                    "    OtherParameter);"));
10638 }
10639 
10640 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
10641   FormatStyle Style = getLLVMStyle();
10642   Style.Standard = FormatStyle::LS_Cpp03;
10643   EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
10644             format("#define x(_a) printf(\"foo\"_a);", Style));
10645 }
10646 
10647 TEST_F(FormatTest, CppLexVersion) {
10648   FormatStyle Style = getLLVMStyle();
10649   // Formatting of x * y differs if x is a type.
10650   verifyFormat("void foo() { MACRO(a * b); }", Style);
10651   verifyFormat("void foo() { MACRO(int *b); }", Style);
10652 
10653   // LLVM style uses latest lexer.
10654   verifyFormat("void foo() { MACRO(char8_t *b); }", Style);
10655   Style.Standard = FormatStyle::LS_Cpp17;
10656   // But in c++17, char8_t isn't a keyword.
10657   verifyFormat("void foo() { MACRO(char8_t * b); }", Style);
10658 }
10659 
10660 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
10661 
10662 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
10663   EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
10664             "             \"ddeeefff\");",
10665             format("someFunction(\"aaabbbcccdddeeefff\");",
10666                    getLLVMStyleWithColumns(25)));
10667   EXPECT_EQ("someFunction1234567890(\n"
10668             "    \"aaabbbcccdddeeefff\");",
10669             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
10670                    getLLVMStyleWithColumns(26)));
10671   EXPECT_EQ("someFunction1234567890(\n"
10672             "    \"aaabbbcccdddeeeff\"\n"
10673             "    \"f\");",
10674             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
10675                    getLLVMStyleWithColumns(25)));
10676   EXPECT_EQ("someFunction1234567890(\n"
10677             "    \"aaabbbcccdddeeeff\"\n"
10678             "    \"f\");",
10679             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
10680                    getLLVMStyleWithColumns(24)));
10681   EXPECT_EQ("someFunction(\n"
10682             "    \"aaabbbcc ddde \"\n"
10683             "    \"efff\");",
10684             format("someFunction(\"aaabbbcc ddde efff\");",
10685                    getLLVMStyleWithColumns(25)));
10686   EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
10687             "             \"ddeeefff\");",
10688             format("someFunction(\"aaabbbccc ddeeefff\");",
10689                    getLLVMStyleWithColumns(25)));
10690   EXPECT_EQ("someFunction1234567890(\n"
10691             "    \"aaabb \"\n"
10692             "    \"cccdddeeefff\");",
10693             format("someFunction1234567890(\"aaabb cccdddeeefff\");",
10694                    getLLVMStyleWithColumns(25)));
10695   EXPECT_EQ("#define A          \\\n"
10696             "  string s =       \\\n"
10697             "      \"123456789\"  \\\n"
10698             "      \"0\";         \\\n"
10699             "  int i;",
10700             format("#define A string s = \"1234567890\"; int i;",
10701                    getLLVMStyleWithColumns(20)));
10702   EXPECT_EQ("someFunction(\n"
10703             "    \"aaabbbcc \"\n"
10704             "    \"dddeeefff\");",
10705             format("someFunction(\"aaabbbcc dddeeefff\");",
10706                    getLLVMStyleWithColumns(25)));
10707 }
10708 
10709 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
10710   EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
10711   EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
10712   EXPECT_EQ("\"test\"\n"
10713             "\"\\n\"",
10714             format("\"test\\n\"", getLLVMStyleWithColumns(7)));
10715   EXPECT_EQ("\"tes\\\\\"\n"
10716             "\"n\"",
10717             format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
10718   EXPECT_EQ("\"\\\\\\\\\"\n"
10719             "\"\\n\"",
10720             format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
10721   EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
10722   EXPECT_EQ("\"\\uff01\"\n"
10723             "\"test\"",
10724             format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
10725   EXPECT_EQ("\"\\Uff01ff02\"",
10726             format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
10727   EXPECT_EQ("\"\\x000000000001\"\n"
10728             "\"next\"",
10729             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
10730   EXPECT_EQ("\"\\x000000000001next\"",
10731             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
10732   EXPECT_EQ("\"\\x000000000001\"",
10733             format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
10734   EXPECT_EQ("\"test\"\n"
10735             "\"\\000000\"\n"
10736             "\"000001\"",
10737             format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
10738   EXPECT_EQ("\"test\\000\"\n"
10739             "\"00000000\"\n"
10740             "\"1\"",
10741             format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
10742 }
10743 
10744 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
10745   verifyFormat("void f() {\n"
10746                "  return g() {}\n"
10747                "  void h() {}");
10748   verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
10749                "g();\n"
10750                "}");
10751 }
10752 
10753 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
10754   verifyFormat(
10755       "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
10756 }
10757 
10758 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
10759   verifyFormat("class X {\n"
10760                "  void f() {\n"
10761                "  }\n"
10762                "};",
10763                getLLVMStyleWithColumns(12));
10764 }
10765 
10766 TEST_F(FormatTest, ConfigurableIndentWidth) {
10767   FormatStyle EightIndent = getLLVMStyleWithColumns(18);
10768   EightIndent.IndentWidth = 8;
10769   EightIndent.ContinuationIndentWidth = 8;
10770   verifyFormat("void f() {\n"
10771                "        someFunction();\n"
10772                "        if (true) {\n"
10773                "                f();\n"
10774                "        }\n"
10775                "}",
10776                EightIndent);
10777   verifyFormat("class X {\n"
10778                "        void f() {\n"
10779                "        }\n"
10780                "};",
10781                EightIndent);
10782   verifyFormat("int x[] = {\n"
10783                "        call(),\n"
10784                "        call()};",
10785                EightIndent);
10786 }
10787 
10788 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
10789   verifyFormat("double\n"
10790                "f();",
10791                getLLVMStyleWithColumns(8));
10792 }
10793 
10794 TEST_F(FormatTest, ConfigurableUseOfTab) {
10795   FormatStyle Tab = getLLVMStyleWithColumns(42);
10796   Tab.IndentWidth = 8;
10797   Tab.UseTab = FormatStyle::UT_Always;
10798   Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10799 
10800   EXPECT_EQ("if (aaaaaaaa && // q\n"
10801             "    bb)\t\t// w\n"
10802             "\t;",
10803             format("if (aaaaaaaa &&// q\n"
10804                    "bb)// w\n"
10805                    ";",
10806                    Tab));
10807   EXPECT_EQ("if (aaa && bbb) // w\n"
10808             "\t;",
10809             format("if(aaa&&bbb)// w\n"
10810                    ";",
10811                    Tab));
10812 
10813   verifyFormat("class X {\n"
10814                "\tvoid f() {\n"
10815                "\t\tsomeFunction(parameter1,\n"
10816                "\t\t\t     parameter2);\n"
10817                "\t}\n"
10818                "};",
10819                Tab);
10820   verifyFormat("#define A                        \\\n"
10821                "\tvoid f() {               \\\n"
10822                "\t\tsomeFunction(    \\\n"
10823                "\t\t    parameter1,  \\\n"
10824                "\t\t    parameter2); \\\n"
10825                "\t}",
10826                Tab);
10827   verifyFormat("int a;\t      // x\n"
10828                "int bbbbbbbb; // x\n",
10829                Tab);
10830 
10831   Tab.TabWidth = 4;
10832   Tab.IndentWidth = 8;
10833   verifyFormat("class TabWidth4Indent8 {\n"
10834                "\t\tvoid f() {\n"
10835                "\t\t\t\tsomeFunction(parameter1,\n"
10836                "\t\t\t\t\t\t\t parameter2);\n"
10837                "\t\t}\n"
10838                "};",
10839                Tab);
10840 
10841   Tab.TabWidth = 4;
10842   Tab.IndentWidth = 4;
10843   verifyFormat("class TabWidth4Indent4 {\n"
10844                "\tvoid f() {\n"
10845                "\t\tsomeFunction(parameter1,\n"
10846                "\t\t\t\t\t parameter2);\n"
10847                "\t}\n"
10848                "};",
10849                Tab);
10850 
10851   Tab.TabWidth = 8;
10852   Tab.IndentWidth = 4;
10853   verifyFormat("class TabWidth8Indent4 {\n"
10854                "    void f() {\n"
10855                "\tsomeFunction(parameter1,\n"
10856                "\t\t     parameter2);\n"
10857                "    }\n"
10858                "};",
10859                Tab);
10860 
10861   Tab.TabWidth = 8;
10862   Tab.IndentWidth = 8;
10863   EXPECT_EQ("/*\n"
10864             "\t      a\t\tcomment\n"
10865             "\t      in multiple lines\n"
10866             "       */",
10867             format("   /*\t \t \n"
10868                    " \t \t a\t\tcomment\t \t\n"
10869                    " \t \t in multiple lines\t\n"
10870                    " \t  */",
10871                    Tab));
10872 
10873   Tab.UseTab = FormatStyle::UT_ForIndentation;
10874   verifyFormat("{\n"
10875                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10876                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10877                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10878                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10879                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10880                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10881                "};",
10882                Tab);
10883   verifyFormat("enum AA {\n"
10884                "\ta1, // Force multiple lines\n"
10885                "\ta2,\n"
10886                "\ta3\n"
10887                "};",
10888                Tab);
10889   EXPECT_EQ("if (aaaaaaaa && // q\n"
10890             "    bb)         // w\n"
10891             "\t;",
10892             format("if (aaaaaaaa &&// q\n"
10893                    "bb)// w\n"
10894                    ";",
10895                    Tab));
10896   verifyFormat("class X {\n"
10897                "\tvoid f() {\n"
10898                "\t\tsomeFunction(parameter1,\n"
10899                "\t\t             parameter2);\n"
10900                "\t}\n"
10901                "};",
10902                Tab);
10903   verifyFormat("{\n"
10904                "\tQ(\n"
10905                "\t    {\n"
10906                "\t\t    int a;\n"
10907                "\t\t    someFunction(aaaaaaaa,\n"
10908                "\t\t                 bbbbbbb);\n"
10909                "\t    },\n"
10910                "\t    p);\n"
10911                "}",
10912                Tab);
10913   EXPECT_EQ("{\n"
10914             "\t/* aaaa\n"
10915             "\t   bbbb */\n"
10916             "}",
10917             format("{\n"
10918                    "/* aaaa\n"
10919                    "   bbbb */\n"
10920                    "}",
10921                    Tab));
10922   EXPECT_EQ("{\n"
10923             "\t/*\n"
10924             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10925             "\t  bbbbbbbbbbbbb\n"
10926             "\t*/\n"
10927             "}",
10928             format("{\n"
10929                    "/*\n"
10930                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10931                    "*/\n"
10932                    "}",
10933                    Tab));
10934   EXPECT_EQ("{\n"
10935             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10936             "\t// bbbbbbbbbbbbb\n"
10937             "}",
10938             format("{\n"
10939                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10940                    "}",
10941                    Tab));
10942   EXPECT_EQ("{\n"
10943             "\t/*\n"
10944             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10945             "\t  bbbbbbbbbbbbb\n"
10946             "\t*/\n"
10947             "}",
10948             format("{\n"
10949                    "\t/*\n"
10950                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10951                    "\t*/\n"
10952                    "}",
10953                    Tab));
10954   EXPECT_EQ("{\n"
10955             "\t/*\n"
10956             "\n"
10957             "\t*/\n"
10958             "}",
10959             format("{\n"
10960                    "\t/*\n"
10961                    "\n"
10962                    "\t*/\n"
10963                    "}",
10964                    Tab));
10965   EXPECT_EQ("{\n"
10966             "\t/*\n"
10967             " asdf\n"
10968             "\t*/\n"
10969             "}",
10970             format("{\n"
10971                    "\t/*\n"
10972                    " asdf\n"
10973                    "\t*/\n"
10974                    "}",
10975                    Tab));
10976 
10977   Tab.UseTab = FormatStyle::UT_Never;
10978   EXPECT_EQ("/*\n"
10979             "              a\t\tcomment\n"
10980             "              in multiple lines\n"
10981             "       */",
10982             format("   /*\t \t \n"
10983                    " \t \t a\t\tcomment\t \t\n"
10984                    " \t \t in multiple lines\t\n"
10985                    " \t  */",
10986                    Tab));
10987   EXPECT_EQ("/* some\n"
10988             "   comment */",
10989             format(" \t \t /* some\n"
10990                    " \t \t    comment */",
10991                    Tab));
10992   EXPECT_EQ("int a; /* some\n"
10993             "   comment */",
10994             format(" \t \t int a; /* some\n"
10995                    " \t \t    comment */",
10996                    Tab));
10997 
10998   EXPECT_EQ("int a; /* some\n"
10999             "comment */",
11000             format(" \t \t int\ta; /* some\n"
11001                    " \t \t    comment */",
11002                    Tab));
11003   EXPECT_EQ("f(\"\t\t\"); /* some\n"
11004             "    comment */",
11005             format(" \t \t f(\"\t\t\"); /* some\n"
11006                    " \t \t    comment */",
11007                    Tab));
11008   EXPECT_EQ("{\n"
11009             "        /*\n"
11010             "         * Comment\n"
11011             "         */\n"
11012             "        int i;\n"
11013             "}",
11014             format("{\n"
11015                    "\t/*\n"
11016                    "\t * Comment\n"
11017                    "\t */\n"
11018                    "\t int i;\n"
11019                    "}",
11020                    Tab));
11021 
11022   Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
11023   Tab.TabWidth = 8;
11024   Tab.IndentWidth = 8;
11025   EXPECT_EQ("if (aaaaaaaa && // q\n"
11026             "    bb)         // w\n"
11027             "\t;",
11028             format("if (aaaaaaaa &&// q\n"
11029                    "bb)// w\n"
11030                    ";",
11031                    Tab));
11032   EXPECT_EQ("if (aaa && bbb) // w\n"
11033             "\t;",
11034             format("if(aaa&&bbb)// w\n"
11035                    ";",
11036                    Tab));
11037   verifyFormat("class X {\n"
11038                "\tvoid f() {\n"
11039                "\t\tsomeFunction(parameter1,\n"
11040                "\t\t\t     parameter2);\n"
11041                "\t}\n"
11042                "};",
11043                Tab);
11044   verifyFormat("#define A                        \\\n"
11045                "\tvoid f() {               \\\n"
11046                "\t\tsomeFunction(    \\\n"
11047                "\t\t    parameter1,  \\\n"
11048                "\t\t    parameter2); \\\n"
11049                "\t}",
11050                Tab);
11051   Tab.TabWidth = 4;
11052   Tab.IndentWidth = 8;
11053   verifyFormat("class TabWidth4Indent8 {\n"
11054                "\t\tvoid f() {\n"
11055                "\t\t\t\tsomeFunction(parameter1,\n"
11056                "\t\t\t\t\t\t\t parameter2);\n"
11057                "\t\t}\n"
11058                "};",
11059                Tab);
11060   Tab.TabWidth = 4;
11061   Tab.IndentWidth = 4;
11062   verifyFormat("class TabWidth4Indent4 {\n"
11063                "\tvoid f() {\n"
11064                "\t\tsomeFunction(parameter1,\n"
11065                "\t\t\t\t\t parameter2);\n"
11066                "\t}\n"
11067                "};",
11068                Tab);
11069   Tab.TabWidth = 8;
11070   Tab.IndentWidth = 4;
11071   verifyFormat("class TabWidth8Indent4 {\n"
11072                "    void f() {\n"
11073                "\tsomeFunction(parameter1,\n"
11074                "\t\t     parameter2);\n"
11075                "    }\n"
11076                "};",
11077                Tab);
11078   Tab.TabWidth = 8;
11079   Tab.IndentWidth = 8;
11080   EXPECT_EQ("/*\n"
11081             "\t      a\t\tcomment\n"
11082             "\t      in multiple lines\n"
11083             "       */",
11084             format("   /*\t \t \n"
11085                    " \t \t a\t\tcomment\t \t\n"
11086                    " \t \t in multiple lines\t\n"
11087                    " \t  */",
11088                    Tab));
11089   verifyFormat("{\n"
11090                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11091                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11092                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11093                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11094                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11095                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11096                "};",
11097                Tab);
11098   verifyFormat("enum AA {\n"
11099                "\ta1, // Force multiple lines\n"
11100                "\ta2,\n"
11101                "\ta3\n"
11102                "};",
11103                Tab);
11104   EXPECT_EQ("if (aaaaaaaa && // q\n"
11105             "    bb)         // w\n"
11106             "\t;",
11107             format("if (aaaaaaaa &&// q\n"
11108                    "bb)// w\n"
11109                    ";",
11110                    Tab));
11111   verifyFormat("class X {\n"
11112                "\tvoid f() {\n"
11113                "\t\tsomeFunction(parameter1,\n"
11114                "\t\t\t     parameter2);\n"
11115                "\t}\n"
11116                "};",
11117                Tab);
11118   verifyFormat("{\n"
11119                "\tQ(\n"
11120                "\t    {\n"
11121                "\t\t    int a;\n"
11122                "\t\t    someFunction(aaaaaaaa,\n"
11123                "\t\t\t\t bbbbbbb);\n"
11124                "\t    },\n"
11125                "\t    p);\n"
11126                "}",
11127                Tab);
11128   EXPECT_EQ("{\n"
11129             "\t/* aaaa\n"
11130             "\t   bbbb */\n"
11131             "}",
11132             format("{\n"
11133                    "/* aaaa\n"
11134                    "   bbbb */\n"
11135                    "}",
11136                    Tab));
11137   EXPECT_EQ("{\n"
11138             "\t/*\n"
11139             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
11140             "\t  bbbbbbbbbbbbb\n"
11141             "\t*/\n"
11142             "}",
11143             format("{\n"
11144                    "/*\n"
11145                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
11146                    "*/\n"
11147                    "}",
11148                    Tab));
11149   EXPECT_EQ("{\n"
11150             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
11151             "\t// bbbbbbbbbbbbb\n"
11152             "}",
11153             format("{\n"
11154                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
11155                    "}",
11156                    Tab));
11157   EXPECT_EQ("{\n"
11158             "\t/*\n"
11159             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
11160             "\t  bbbbbbbbbbbbb\n"
11161             "\t*/\n"
11162             "}",
11163             format("{\n"
11164                    "\t/*\n"
11165                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
11166                    "\t*/\n"
11167                    "}",
11168                    Tab));
11169   EXPECT_EQ("{\n"
11170             "\t/*\n"
11171             "\n"
11172             "\t*/\n"
11173             "}",
11174             format("{\n"
11175                    "\t/*\n"
11176                    "\n"
11177                    "\t*/\n"
11178                    "}",
11179                    Tab));
11180   EXPECT_EQ("{\n"
11181             "\t/*\n"
11182             " asdf\n"
11183             "\t*/\n"
11184             "}",
11185             format("{\n"
11186                    "\t/*\n"
11187                    " asdf\n"
11188                    "\t*/\n"
11189                    "}",
11190                    Tab));
11191   EXPECT_EQ("/* some\n"
11192             "   comment */",
11193             format(" \t \t /* some\n"
11194                    " \t \t    comment */",
11195                    Tab));
11196   EXPECT_EQ("int a; /* some\n"
11197             "   comment */",
11198             format(" \t \t int a; /* some\n"
11199                    " \t \t    comment */",
11200                    Tab));
11201   EXPECT_EQ("int a; /* some\n"
11202             "comment */",
11203             format(" \t \t int\ta; /* some\n"
11204                    " \t \t    comment */",
11205                    Tab));
11206   EXPECT_EQ("f(\"\t\t\"); /* some\n"
11207             "    comment */",
11208             format(" \t \t f(\"\t\t\"); /* some\n"
11209                    " \t \t    comment */",
11210                    Tab));
11211   EXPECT_EQ("{\n"
11212             "\t/*\n"
11213             "\t * Comment\n"
11214             "\t */\n"
11215             "\tint i;\n"
11216             "}",
11217             format("{\n"
11218                    "\t/*\n"
11219                    "\t * Comment\n"
11220                    "\t */\n"
11221                    "\t int i;\n"
11222                    "}",
11223                    Tab));
11224   Tab.TabWidth = 2;
11225   Tab.IndentWidth = 2;
11226   EXPECT_EQ("{\n"
11227             "\t/* aaaa\n"
11228             "\t\t bbbb */\n"
11229             "}",
11230             format("{\n"
11231                    "/* aaaa\n"
11232                    "\t bbbb */\n"
11233                    "}",
11234                    Tab));
11235   EXPECT_EQ("{\n"
11236             "\t/*\n"
11237             "\t\taaaaaaaaaaaaaaaaaaaaaaaaaa\n"
11238             "\t\tbbbbbbbbbbbbb\n"
11239             "\t*/\n"
11240             "}",
11241             format("{\n"
11242                    "/*\n"
11243                    "\taaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
11244                    "*/\n"
11245                    "}",
11246                    Tab));
11247   Tab.AlignConsecutiveAssignments = true;
11248   Tab.AlignConsecutiveDeclarations = true;
11249   Tab.TabWidth = 4;
11250   Tab.IndentWidth = 4;
11251   verifyFormat("class Assign {\n"
11252                "\tvoid f() {\n"
11253                "\t\tint         x      = 123;\n"
11254                "\t\tint         random = 4;\n"
11255                "\t\tstd::string alphabet =\n"
11256                "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
11257                "\t}\n"
11258                "};",
11259                Tab);
11260 
11261   Tab.UseTab = FormatStyle::UT_AlignWithSpaces;
11262   Tab.TabWidth = 8;
11263   Tab.IndentWidth = 8;
11264   EXPECT_EQ("if (aaaaaaaa && // q\n"
11265             "    bb)         // w\n"
11266             "\t;",
11267             format("if (aaaaaaaa &&// q\n"
11268                    "bb)// w\n"
11269                    ";",
11270                    Tab));
11271   EXPECT_EQ("if (aaa && bbb) // w\n"
11272             "\t;",
11273             format("if(aaa&&bbb)// w\n"
11274                    ";",
11275                    Tab));
11276   verifyFormat("class X {\n"
11277                "\tvoid f() {\n"
11278                "\t\tsomeFunction(parameter1,\n"
11279                "\t\t             parameter2);\n"
11280                "\t}\n"
11281                "};",
11282                Tab);
11283   verifyFormat("#define A                        \\\n"
11284                "\tvoid f() {               \\\n"
11285                "\t\tsomeFunction(    \\\n"
11286                "\t\t    parameter1,  \\\n"
11287                "\t\t    parameter2); \\\n"
11288                "\t}",
11289                Tab);
11290   Tab.TabWidth = 4;
11291   Tab.IndentWidth = 8;
11292   verifyFormat("class TabWidth4Indent8 {\n"
11293                "\t\tvoid f() {\n"
11294                "\t\t\t\tsomeFunction(parameter1,\n"
11295                "\t\t\t\t             parameter2);\n"
11296                "\t\t}\n"
11297                "};",
11298                Tab);
11299   Tab.TabWidth = 4;
11300   Tab.IndentWidth = 4;
11301   verifyFormat("class TabWidth4Indent4 {\n"
11302                "\tvoid f() {\n"
11303                "\t\tsomeFunction(parameter1,\n"
11304                "\t\t             parameter2);\n"
11305                "\t}\n"
11306                "};",
11307                Tab);
11308   Tab.TabWidth = 8;
11309   Tab.IndentWidth = 4;
11310   verifyFormat("class TabWidth8Indent4 {\n"
11311                "    void f() {\n"
11312                "\tsomeFunction(parameter1,\n"
11313                "\t             parameter2);\n"
11314                "    }\n"
11315                "};",
11316                Tab);
11317   Tab.TabWidth = 8;
11318   Tab.IndentWidth = 8;
11319   EXPECT_EQ("/*\n"
11320             "              a\t\tcomment\n"
11321             "              in multiple lines\n"
11322             "       */",
11323             format("   /*\t \t \n"
11324                    " \t \t a\t\tcomment\t \t\n"
11325                    " \t \t in multiple lines\t\n"
11326                    " \t  */",
11327                    Tab));
11328   verifyFormat("{\n"
11329                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11330                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11331                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11332                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11333                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11334                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11335                "};",
11336                Tab);
11337   verifyFormat("enum AA {\n"
11338                "\ta1, // Force multiple lines\n"
11339                "\ta2,\n"
11340                "\ta3\n"
11341                "};",
11342                Tab);
11343   EXPECT_EQ("if (aaaaaaaa && // q\n"
11344             "    bb)         // w\n"
11345             "\t;",
11346             format("if (aaaaaaaa &&// q\n"
11347                    "bb)// w\n"
11348                    ";",
11349                    Tab));
11350   verifyFormat("class X {\n"
11351                "\tvoid f() {\n"
11352                "\t\tsomeFunction(parameter1,\n"
11353                "\t\t             parameter2);\n"
11354                "\t}\n"
11355                "};",
11356                Tab);
11357   verifyFormat("{\n"
11358                "\tQ(\n"
11359                "\t    {\n"
11360                "\t\t    int a;\n"
11361                "\t\t    someFunction(aaaaaaaa,\n"
11362                "\t\t                 bbbbbbb);\n"
11363                "\t    },\n"
11364                "\t    p);\n"
11365                "}",
11366                Tab);
11367   EXPECT_EQ("{\n"
11368             "\t/* aaaa\n"
11369             "\t   bbbb */\n"
11370             "}",
11371             format("{\n"
11372                    "/* aaaa\n"
11373                    "   bbbb */\n"
11374                    "}",
11375                    Tab));
11376   EXPECT_EQ("{\n"
11377             "\t/*\n"
11378             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
11379             "\t  bbbbbbbbbbbbb\n"
11380             "\t*/\n"
11381             "}",
11382             format("{\n"
11383                    "/*\n"
11384                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
11385                    "*/\n"
11386                    "}",
11387                    Tab));
11388   EXPECT_EQ("{\n"
11389             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
11390             "\t// bbbbbbbbbbbbb\n"
11391             "}",
11392             format("{\n"
11393                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
11394                    "}",
11395                    Tab));
11396   EXPECT_EQ("{\n"
11397             "\t/*\n"
11398             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
11399             "\t  bbbbbbbbbbbbb\n"
11400             "\t*/\n"
11401             "}",
11402             format("{\n"
11403                    "\t/*\n"
11404                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
11405                    "\t*/\n"
11406                    "}",
11407                    Tab));
11408   EXPECT_EQ("{\n"
11409             "\t/*\n"
11410             "\n"
11411             "\t*/\n"
11412             "}",
11413             format("{\n"
11414                    "\t/*\n"
11415                    "\n"
11416                    "\t*/\n"
11417                    "}",
11418                    Tab));
11419   EXPECT_EQ("{\n"
11420             "\t/*\n"
11421             " asdf\n"
11422             "\t*/\n"
11423             "}",
11424             format("{\n"
11425                    "\t/*\n"
11426                    " asdf\n"
11427                    "\t*/\n"
11428                    "}",
11429                    Tab));
11430   EXPECT_EQ("/* some\n"
11431             "   comment */",
11432             format(" \t \t /* some\n"
11433                    " \t \t    comment */",
11434                    Tab));
11435   EXPECT_EQ("int a; /* some\n"
11436             "   comment */",
11437             format(" \t \t int a; /* some\n"
11438                    " \t \t    comment */",
11439                    Tab));
11440   EXPECT_EQ("int a; /* some\n"
11441             "comment */",
11442             format(" \t \t int\ta; /* some\n"
11443                    " \t \t    comment */",
11444                    Tab));
11445   EXPECT_EQ("f(\"\t\t\"); /* some\n"
11446             "    comment */",
11447             format(" \t \t f(\"\t\t\"); /* some\n"
11448                    " \t \t    comment */",
11449                    Tab));
11450   EXPECT_EQ("{\n"
11451             "\t/*\n"
11452             "\t * Comment\n"
11453             "\t */\n"
11454             "\tint i;\n"
11455             "}",
11456             format("{\n"
11457                    "\t/*\n"
11458                    "\t * Comment\n"
11459                    "\t */\n"
11460                    "\t int i;\n"
11461                    "}",
11462                    Tab));
11463   Tab.TabWidth = 2;
11464   Tab.IndentWidth = 2;
11465   EXPECT_EQ("{\n"
11466             "\t/* aaaa\n"
11467             "\t   bbbb */\n"
11468             "}",
11469             format("{\n"
11470                    "/* aaaa\n"
11471                    "   bbbb */\n"
11472                    "}",
11473                    Tab));
11474   EXPECT_EQ("{\n"
11475             "\t/*\n"
11476             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
11477             "\t  bbbbbbbbbbbbb\n"
11478             "\t*/\n"
11479             "}",
11480             format("{\n"
11481                    "/*\n"
11482                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
11483                    "*/\n"
11484                    "}",
11485                    Tab));
11486   Tab.AlignConsecutiveAssignments = true;
11487   Tab.AlignConsecutiveDeclarations = true;
11488   Tab.TabWidth = 4;
11489   Tab.IndentWidth = 4;
11490   verifyFormat("class Assign {\n"
11491                "\tvoid f() {\n"
11492                "\t\tint         x      = 123;\n"
11493                "\t\tint         random = 4;\n"
11494                "\t\tstd::string alphabet =\n"
11495                "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
11496                "\t}\n"
11497                "};",
11498                Tab);
11499   Tab.AlignOperands = FormatStyle::OAS_Align;
11500   verifyFormat("int aaaaaaaaaa = bbbbbbbbbbbbbbbbbbbb +\n"
11501                "                 cccccccccccccccccccc;",
11502                Tab);
11503   // no alignment
11504   verifyFormat("int aaaaaaaaaa =\n"
11505                "\tbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
11506                Tab);
11507   verifyFormat("return aaaaaaaaaaaaaaaa ? 111111111111111\n"
11508                "       : bbbbbbbbbbbbbb ? 222222222222222\n"
11509                "                        : 333333333333333;",
11510                Tab);
11511   Tab.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
11512   Tab.AlignOperands = FormatStyle::OAS_AlignAfterOperator;
11513   verifyFormat("int aaaaaaaaaa = bbbbbbbbbbbbbbbbbbbb\n"
11514                "               + cccccccccccccccccccc;",
11515                Tab);
11516 }
11517 
11518 TEST_F(FormatTest, ZeroTabWidth) {
11519   FormatStyle Tab = getLLVMStyleWithColumns(42);
11520   Tab.IndentWidth = 8;
11521   Tab.UseTab = FormatStyle::UT_Never;
11522   Tab.TabWidth = 0;
11523   EXPECT_EQ("void a(){\n"
11524             "    // line starts with '\t'\n"
11525             "};",
11526             format("void a(){\n"
11527                    "\t// line starts with '\t'\n"
11528                    "};",
11529                    Tab));
11530 
11531   EXPECT_EQ("void a(){\n"
11532             "    // line starts with '\t'\n"
11533             "};",
11534             format("void a(){\n"
11535                    "\t\t// line starts with '\t'\n"
11536                    "};",
11537                    Tab));
11538 
11539   Tab.UseTab = FormatStyle::UT_ForIndentation;
11540   EXPECT_EQ("void a(){\n"
11541             "    // line starts with '\t'\n"
11542             "};",
11543             format("void a(){\n"
11544                    "\t// line starts with '\t'\n"
11545                    "};",
11546                    Tab));
11547 
11548   EXPECT_EQ("void a(){\n"
11549             "    // line starts with '\t'\n"
11550             "};",
11551             format("void a(){\n"
11552                    "\t\t// line starts with '\t'\n"
11553                    "};",
11554                    Tab));
11555 
11556   Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
11557   EXPECT_EQ("void a(){\n"
11558             "    // line starts with '\t'\n"
11559             "};",
11560             format("void a(){\n"
11561                    "\t// line starts with '\t'\n"
11562                    "};",
11563                    Tab));
11564 
11565   EXPECT_EQ("void a(){\n"
11566             "    // line starts with '\t'\n"
11567             "};",
11568             format("void a(){\n"
11569                    "\t\t// line starts with '\t'\n"
11570                    "};",
11571                    Tab));
11572 
11573   Tab.UseTab = FormatStyle::UT_AlignWithSpaces;
11574   EXPECT_EQ("void a(){\n"
11575             "    // line starts with '\t'\n"
11576             "};",
11577             format("void a(){\n"
11578                    "\t// line starts with '\t'\n"
11579                    "};",
11580                    Tab));
11581 
11582   EXPECT_EQ("void a(){\n"
11583             "    // line starts with '\t'\n"
11584             "};",
11585             format("void a(){\n"
11586                    "\t\t// line starts with '\t'\n"
11587                    "};",
11588                    Tab));
11589 
11590   Tab.UseTab = FormatStyle::UT_Always;
11591   EXPECT_EQ("void a(){\n"
11592             "// line starts with '\t'\n"
11593             "};",
11594             format("void a(){\n"
11595                    "\t// line starts with '\t'\n"
11596                    "};",
11597                    Tab));
11598 
11599   EXPECT_EQ("void a(){\n"
11600             "// line starts with '\t'\n"
11601             "};",
11602             format("void a(){\n"
11603                    "\t\t// line starts with '\t'\n"
11604                    "};",
11605                    Tab));
11606 }
11607 
11608 TEST_F(FormatTest, CalculatesOriginalColumn) {
11609   EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
11610             "q\"; /* some\n"
11611             "       comment */",
11612             format("  \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
11613                    "q\"; /* some\n"
11614                    "       comment */",
11615                    getLLVMStyle()));
11616   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
11617             "/* some\n"
11618             "   comment */",
11619             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
11620                    " /* some\n"
11621                    "    comment */",
11622                    getLLVMStyle()));
11623   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
11624             "qqq\n"
11625             "/* some\n"
11626             "   comment */",
11627             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
11628                    "qqq\n"
11629                    " /* some\n"
11630                    "    comment */",
11631                    getLLVMStyle()));
11632   EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
11633             "wwww; /* some\n"
11634             "         comment */",
11635             format("  inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
11636                    "wwww; /* some\n"
11637                    "         comment */",
11638                    getLLVMStyle()));
11639 }
11640 
11641 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
11642   FormatStyle NoSpace = getLLVMStyle();
11643   NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
11644 
11645   verifyFormat("while(true)\n"
11646                "  continue;",
11647                NoSpace);
11648   verifyFormat("for(;;)\n"
11649                "  continue;",
11650                NoSpace);
11651   verifyFormat("if(true)\n"
11652                "  f();\n"
11653                "else if(true)\n"
11654                "  f();",
11655                NoSpace);
11656   verifyFormat("do {\n"
11657                "  do_something();\n"
11658                "} while(something());",
11659                NoSpace);
11660   verifyFormat("switch(x) {\n"
11661                "default:\n"
11662                "  break;\n"
11663                "}",
11664                NoSpace);
11665   verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
11666   verifyFormat("size_t x = sizeof(x);", NoSpace);
11667   verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
11668   verifyFormat("auto f(int x) -> typeof(x);", NoSpace);
11669   verifyFormat("auto f(int x) -> _Atomic(x);", NoSpace);
11670   verifyFormat("auto f(int x) -> __underlying_type(x);", NoSpace);
11671   verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
11672   verifyFormat("alignas(128) char a[128];", NoSpace);
11673   verifyFormat("size_t x = alignof(MyType);", NoSpace);
11674   verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
11675   verifyFormat("int f() throw(Deprecated);", NoSpace);
11676   verifyFormat("typedef void (*cb)(int);", NoSpace);
11677   verifyFormat("T A::operator()();", NoSpace);
11678   verifyFormat("X A::operator++(T);", NoSpace);
11679   verifyFormat("auto lambda = []() { return 0; };", NoSpace);
11680 
11681   FormatStyle Space = getLLVMStyle();
11682   Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
11683 
11684   verifyFormat("int f ();", Space);
11685   verifyFormat("void f (int a, T b) {\n"
11686                "  while (true)\n"
11687                "    continue;\n"
11688                "}",
11689                Space);
11690   verifyFormat("if (true)\n"
11691                "  f ();\n"
11692                "else if (true)\n"
11693                "  f ();",
11694                Space);
11695   verifyFormat("do {\n"
11696                "  do_something ();\n"
11697                "} while (something ());",
11698                Space);
11699   verifyFormat("switch (x) {\n"
11700                "default:\n"
11701                "  break;\n"
11702                "}",
11703                Space);
11704   verifyFormat("A::A () : a (1) {}", Space);
11705   verifyFormat("void f () __attribute__ ((asdf));", Space);
11706   verifyFormat("*(&a + 1);\n"
11707                "&((&a)[1]);\n"
11708                "a[(b + c) * d];\n"
11709                "(((a + 1) * 2) + 3) * 4;",
11710                Space);
11711   verifyFormat("#define A(x) x", Space);
11712   verifyFormat("#define A (x) x", Space);
11713   verifyFormat("#if defined(x)\n"
11714                "#endif",
11715                Space);
11716   verifyFormat("auto i = std::make_unique<int> (5);", Space);
11717   verifyFormat("size_t x = sizeof (x);", Space);
11718   verifyFormat("auto f (int x) -> decltype (x);", Space);
11719   verifyFormat("auto f (int x) -> typeof (x);", Space);
11720   verifyFormat("auto f (int x) -> _Atomic (x);", Space);
11721   verifyFormat("auto f (int x) -> __underlying_type (x);", Space);
11722   verifyFormat("int f (T x) noexcept (x.create ());", Space);
11723   verifyFormat("alignas (128) char a[128];", Space);
11724   verifyFormat("size_t x = alignof (MyType);", Space);
11725   verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
11726   verifyFormat("int f () throw (Deprecated);", Space);
11727   verifyFormat("typedef void (*cb) (int);", Space);
11728   verifyFormat("T A::operator() ();", Space);
11729   verifyFormat("X A::operator++ (T);", Space);
11730   verifyFormat("auto lambda = [] () { return 0; };", Space);
11731   verifyFormat("int x = int (y);", Space);
11732 
11733   FormatStyle SomeSpace = getLLVMStyle();
11734   SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses;
11735 
11736   verifyFormat("[]() -> float {}", SomeSpace);
11737   verifyFormat("[] (auto foo) {}", SomeSpace);
11738   verifyFormat("[foo]() -> int {}", SomeSpace);
11739   verifyFormat("int f();", SomeSpace);
11740   verifyFormat("void f (int a, T b) {\n"
11741                "  while (true)\n"
11742                "    continue;\n"
11743                "}",
11744                SomeSpace);
11745   verifyFormat("if (true)\n"
11746                "  f();\n"
11747                "else if (true)\n"
11748                "  f();",
11749                SomeSpace);
11750   verifyFormat("do {\n"
11751                "  do_something();\n"
11752                "} while (something());",
11753                SomeSpace);
11754   verifyFormat("switch (x) {\n"
11755                "default:\n"
11756                "  break;\n"
11757                "}",
11758                SomeSpace);
11759   verifyFormat("A::A() : a (1) {}", SomeSpace);
11760   verifyFormat("void f() __attribute__ ((asdf));", SomeSpace);
11761   verifyFormat("*(&a + 1);\n"
11762                "&((&a)[1]);\n"
11763                "a[(b + c) * d];\n"
11764                "(((a + 1) * 2) + 3) * 4;",
11765                SomeSpace);
11766   verifyFormat("#define A(x) x", SomeSpace);
11767   verifyFormat("#define A (x) x", SomeSpace);
11768   verifyFormat("#if defined(x)\n"
11769                "#endif",
11770                SomeSpace);
11771   verifyFormat("auto i = std::make_unique<int> (5);", SomeSpace);
11772   verifyFormat("size_t x = sizeof (x);", SomeSpace);
11773   verifyFormat("auto f (int x) -> decltype (x);", SomeSpace);
11774   verifyFormat("auto f (int x) -> typeof (x);", SomeSpace);
11775   verifyFormat("auto f (int x) -> _Atomic (x);", SomeSpace);
11776   verifyFormat("auto f (int x) -> __underlying_type (x);", SomeSpace);
11777   verifyFormat("int f (T x) noexcept (x.create());", SomeSpace);
11778   verifyFormat("alignas (128) char a[128];", SomeSpace);
11779   verifyFormat("size_t x = alignof (MyType);", SomeSpace);
11780   verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");",
11781                SomeSpace);
11782   verifyFormat("int f() throw (Deprecated);", SomeSpace);
11783   verifyFormat("typedef void (*cb) (int);", SomeSpace);
11784   verifyFormat("T A::operator()();", SomeSpace);
11785   verifyFormat("X A::operator++ (T);", SomeSpace);
11786   verifyFormat("int x = int (y);", SomeSpace);
11787   verifyFormat("auto lambda = []() { return 0; };", SomeSpace);
11788 }
11789 
11790 TEST_F(FormatTest, SpaceAfterLogicalNot) {
11791   FormatStyle Spaces = getLLVMStyle();
11792   Spaces.SpaceAfterLogicalNot = true;
11793 
11794   verifyFormat("bool x = ! y", Spaces);
11795   verifyFormat("if (! isFailure())", Spaces);
11796   verifyFormat("if (! (a && b))", Spaces);
11797   verifyFormat("\"Error!\"", Spaces);
11798   verifyFormat("! ! x", Spaces);
11799 }
11800 
11801 TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
11802   FormatStyle Spaces = getLLVMStyle();
11803 
11804   Spaces.SpacesInParentheses = true;
11805   verifyFormat("do_something( ::globalVar );", Spaces);
11806   verifyFormat("call( x, y, z );", Spaces);
11807   verifyFormat("call();", Spaces);
11808   verifyFormat("std::function<void( int, int )> callback;", Spaces);
11809   verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
11810                Spaces);
11811   verifyFormat("while ( (bool)1 )\n"
11812                "  continue;",
11813                Spaces);
11814   verifyFormat("for ( ;; )\n"
11815                "  continue;",
11816                Spaces);
11817   verifyFormat("if ( true )\n"
11818                "  f();\n"
11819                "else if ( true )\n"
11820                "  f();",
11821                Spaces);
11822   verifyFormat("do {\n"
11823                "  do_something( (int)i );\n"
11824                "} while ( something() );",
11825                Spaces);
11826   verifyFormat("switch ( x ) {\n"
11827                "default:\n"
11828                "  break;\n"
11829                "}",
11830                Spaces);
11831 
11832   Spaces.SpacesInParentheses = false;
11833   Spaces.SpacesInCStyleCastParentheses = true;
11834   verifyFormat("Type *A = ( Type * )P;", Spaces);
11835   verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
11836   verifyFormat("x = ( int32 )y;", Spaces);
11837   verifyFormat("int a = ( int )(2.0f);", Spaces);
11838   verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
11839   verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
11840   verifyFormat("#define x (( int )-1)", Spaces);
11841 
11842   // Run the first set of tests again with:
11843   Spaces.SpacesInParentheses = false;
11844   Spaces.SpaceInEmptyParentheses = true;
11845   Spaces.SpacesInCStyleCastParentheses = true;
11846   verifyFormat("call(x, y, z);", Spaces);
11847   verifyFormat("call( );", Spaces);
11848   verifyFormat("std::function<void(int, int)> callback;", Spaces);
11849   verifyFormat("while (( bool )1)\n"
11850                "  continue;",
11851                Spaces);
11852   verifyFormat("for (;;)\n"
11853                "  continue;",
11854                Spaces);
11855   verifyFormat("if (true)\n"
11856                "  f( );\n"
11857                "else if (true)\n"
11858                "  f( );",
11859                Spaces);
11860   verifyFormat("do {\n"
11861                "  do_something(( int )i);\n"
11862                "} while (something( ));",
11863                Spaces);
11864   verifyFormat("switch (x) {\n"
11865                "default:\n"
11866                "  break;\n"
11867                "}",
11868                Spaces);
11869 
11870   // Run the first set of tests again with:
11871   Spaces.SpaceAfterCStyleCast = true;
11872   verifyFormat("call(x, y, z);", Spaces);
11873   verifyFormat("call( );", Spaces);
11874   verifyFormat("std::function<void(int, int)> callback;", Spaces);
11875   verifyFormat("while (( bool ) 1)\n"
11876                "  continue;",
11877                Spaces);
11878   verifyFormat("for (;;)\n"
11879                "  continue;",
11880                Spaces);
11881   verifyFormat("if (true)\n"
11882                "  f( );\n"
11883                "else if (true)\n"
11884                "  f( );",
11885                Spaces);
11886   verifyFormat("do {\n"
11887                "  do_something(( int ) i);\n"
11888                "} while (something( ));",
11889                Spaces);
11890   verifyFormat("switch (x) {\n"
11891                "default:\n"
11892                "  break;\n"
11893                "}",
11894                Spaces);
11895 
11896   // Run subset of tests again with:
11897   Spaces.SpacesInCStyleCastParentheses = false;
11898   Spaces.SpaceAfterCStyleCast = true;
11899   verifyFormat("while ((bool) 1)\n"
11900                "  continue;",
11901                Spaces);
11902   verifyFormat("do {\n"
11903                "  do_something((int) i);\n"
11904                "} while (something( ));",
11905                Spaces);
11906 }
11907 
11908 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
11909   verifyFormat("int a[5];");
11910   verifyFormat("a[3] += 42;");
11911 
11912   FormatStyle Spaces = getLLVMStyle();
11913   Spaces.SpacesInSquareBrackets = true;
11914   // Not lambdas.
11915   verifyFormat("int a[ 5 ];", Spaces);
11916   verifyFormat("a[ 3 ] += 42;", Spaces);
11917   verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
11918   verifyFormat("double &operator[](int i) { return 0; }\n"
11919                "int i;",
11920                Spaces);
11921   verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
11922   verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
11923   verifyFormat("int i = (*b)[ a ]->f();", Spaces);
11924   // Lambdas.
11925   verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
11926   verifyFormat("return [ i, args... ] {};", Spaces);
11927   verifyFormat("int foo = [ &bar ]() {};", Spaces);
11928   verifyFormat("int foo = [ = ]() {};", Spaces);
11929   verifyFormat("int foo = [ & ]() {};", Spaces);
11930   verifyFormat("int foo = [ =, &bar ]() {};", Spaces);
11931   verifyFormat("int foo = [ &bar, = ]() {};", Spaces);
11932 }
11933 
11934 TEST_F(FormatTest, ConfigurableSpaceBeforeBrackets) {
11935   FormatStyle NoSpaceStyle = getLLVMStyle();
11936   verifyFormat("int a[5];", NoSpaceStyle);
11937   verifyFormat("a[3] += 42;", NoSpaceStyle);
11938 
11939   verifyFormat("int a[1];", NoSpaceStyle);
11940   verifyFormat("int 1 [a];", NoSpaceStyle);
11941   verifyFormat("int a[1][2];", NoSpaceStyle);
11942   verifyFormat("a[7] = 5;", NoSpaceStyle);
11943   verifyFormat("int a = (f())[23];", NoSpaceStyle);
11944   verifyFormat("f([] {})", NoSpaceStyle);
11945 
11946   FormatStyle Space = getLLVMStyle();
11947   Space.SpaceBeforeSquareBrackets = true;
11948   verifyFormat("int c = []() -> int { return 2; }();\n", Space);
11949   verifyFormat("return [i, args...] {};", Space);
11950 
11951   verifyFormat("int a [5];", Space);
11952   verifyFormat("a [3] += 42;", Space);
11953   verifyFormat("constexpr char hello []{\"hello\"};", Space);
11954   verifyFormat("double &operator[](int i) { return 0; }\n"
11955                "int i;",
11956                Space);
11957   verifyFormat("std::unique_ptr<int []> foo() {}", Space);
11958   verifyFormat("int i = a [a][a]->f();", Space);
11959   verifyFormat("int i = (*b) [a]->f();", Space);
11960 
11961   verifyFormat("int a [1];", Space);
11962   verifyFormat("int 1 [a];", Space);
11963   verifyFormat("int a [1][2];", Space);
11964   verifyFormat("a [7] = 5;", Space);
11965   verifyFormat("int a = (f()) [23];", Space);
11966   verifyFormat("f([] {})", Space);
11967 }
11968 
11969 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
11970   verifyFormat("int a = 5;");
11971   verifyFormat("a += 42;");
11972   verifyFormat("a or_eq 8;");
11973 
11974   FormatStyle Spaces = getLLVMStyle();
11975   Spaces.SpaceBeforeAssignmentOperators = false;
11976   verifyFormat("int a= 5;", Spaces);
11977   verifyFormat("a+= 42;", Spaces);
11978   verifyFormat("a or_eq 8;", Spaces);
11979 }
11980 
11981 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
11982   verifyFormat("class Foo : public Bar {};");
11983   verifyFormat("Foo::Foo() : foo(1) {}");
11984   verifyFormat("for (auto a : b) {\n}");
11985   verifyFormat("int x = a ? b : c;");
11986   verifyFormat("{\n"
11987                "label0:\n"
11988                "  int x = 0;\n"
11989                "}");
11990   verifyFormat("switch (x) {\n"
11991                "case 1:\n"
11992                "default:\n"
11993                "}");
11994 
11995   FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30);
11996   CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false;
11997   verifyFormat("class Foo : public Bar {};", CtorInitializerStyle);
11998   verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle);
11999   verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle);
12000   verifyFormat("int x = a ? b : c;", CtorInitializerStyle);
12001   verifyFormat("{\n"
12002                "label1:\n"
12003                "  int x = 0;\n"
12004                "}",
12005                CtorInitializerStyle);
12006   verifyFormat("switch (x) {\n"
12007                "case 1:\n"
12008                "default:\n"
12009                "}",
12010                CtorInitializerStyle);
12011   CtorInitializerStyle.BreakConstructorInitializers =
12012       FormatStyle::BCIS_AfterColon;
12013   verifyFormat("Fooooooooooo::Fooooooooooo():\n"
12014                "    aaaaaaaaaaaaaaaa(1),\n"
12015                "    bbbbbbbbbbbbbbbb(2) {}",
12016                CtorInitializerStyle);
12017   CtorInitializerStyle.BreakConstructorInitializers =
12018       FormatStyle::BCIS_BeforeComma;
12019   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
12020                "    : aaaaaaaaaaaaaaaa(1)\n"
12021                "    , bbbbbbbbbbbbbbbb(2) {}",
12022                CtorInitializerStyle);
12023   CtorInitializerStyle.BreakConstructorInitializers =
12024       FormatStyle::BCIS_BeforeColon;
12025   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
12026                "    : aaaaaaaaaaaaaaaa(1),\n"
12027                "      bbbbbbbbbbbbbbbb(2) {}",
12028                CtorInitializerStyle);
12029   CtorInitializerStyle.ConstructorInitializerIndentWidth = 0;
12030   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
12031                ": aaaaaaaaaaaaaaaa(1),\n"
12032                "  bbbbbbbbbbbbbbbb(2) {}",
12033                CtorInitializerStyle);
12034 
12035   FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30);
12036   InheritanceStyle.SpaceBeforeInheritanceColon = false;
12037   verifyFormat("class Foo: public Bar {};", InheritanceStyle);
12038   verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle);
12039   verifyFormat("for (auto a : b) {\n}", InheritanceStyle);
12040   verifyFormat("int x = a ? b : c;", InheritanceStyle);
12041   verifyFormat("{\n"
12042                "label2:\n"
12043                "  int x = 0;\n"
12044                "}",
12045                InheritanceStyle);
12046   verifyFormat("switch (x) {\n"
12047                "case 1:\n"
12048                "default:\n"
12049                "}",
12050                InheritanceStyle);
12051   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon;
12052   verifyFormat("class Foooooooooooooooooooooo:\n"
12053                "    public aaaaaaaaaaaaaaaaaa,\n"
12054                "    public bbbbbbbbbbbbbbbbbb {\n"
12055                "}",
12056                InheritanceStyle);
12057   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
12058   verifyFormat("class Foooooooooooooooooooooo\n"
12059                "    : public aaaaaaaaaaaaaaaaaa\n"
12060                "    , public bbbbbbbbbbbbbbbbbb {\n"
12061                "}",
12062                InheritanceStyle);
12063   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
12064   verifyFormat("class Foooooooooooooooooooooo\n"
12065                "    : public aaaaaaaaaaaaaaaaaa,\n"
12066                "      public bbbbbbbbbbbbbbbbbb {\n"
12067                "}",
12068                InheritanceStyle);
12069   InheritanceStyle.ConstructorInitializerIndentWidth = 0;
12070   verifyFormat("class Foooooooooooooooooooooo\n"
12071                ": public aaaaaaaaaaaaaaaaaa,\n"
12072                "  public bbbbbbbbbbbbbbbbbb {}",
12073                InheritanceStyle);
12074 
12075   FormatStyle ForLoopStyle = getLLVMStyle();
12076   ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false;
12077   verifyFormat("class Foo : public Bar {};", ForLoopStyle);
12078   verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle);
12079   verifyFormat("for (auto a: b) {\n}", ForLoopStyle);
12080   verifyFormat("int x = a ? b : c;", ForLoopStyle);
12081   verifyFormat("{\n"
12082                "label2:\n"
12083                "  int x = 0;\n"
12084                "}",
12085                ForLoopStyle);
12086   verifyFormat("switch (x) {\n"
12087                "case 1:\n"
12088                "default:\n"
12089                "}",
12090                ForLoopStyle);
12091 
12092   FormatStyle NoSpaceStyle = getLLVMStyle();
12093   NoSpaceStyle.SpaceBeforeCtorInitializerColon = false;
12094   NoSpaceStyle.SpaceBeforeInheritanceColon = false;
12095   NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false;
12096   verifyFormat("class Foo: public Bar {};", NoSpaceStyle);
12097   verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle);
12098   verifyFormat("for (auto a: b) {\n}", NoSpaceStyle);
12099   verifyFormat("int x = a ? b : c;", NoSpaceStyle);
12100   verifyFormat("{\n"
12101                "label3:\n"
12102                "  int x = 0;\n"
12103                "}",
12104                NoSpaceStyle);
12105   verifyFormat("switch (x) {\n"
12106                "case 1:\n"
12107                "default:\n"
12108                "}",
12109                NoSpaceStyle);
12110 }
12111 
12112 TEST_F(FormatTest, ConfigurableSpaceAroundPointerQualifiers) {
12113   FormatStyle Style = getLLVMStyle();
12114 
12115   Style.PointerAlignment = FormatStyle::PAS_Left;
12116   Style.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Default;
12117   verifyFormat("void* const* x = NULL;", Style);
12118 
12119 #define verifyQualifierSpaces(Code, Pointers, Qualifiers)                      \
12120   do {                                                                         \
12121     Style.PointerAlignment = FormatStyle::Pointers;                            \
12122     Style.SpaceAroundPointerQualifiers = FormatStyle::Qualifiers;              \
12123     verifyFormat(Code, Style);                                                 \
12124   } while (false)
12125 
12126   verifyQualifierSpaces("void* const* x = NULL;", PAS_Left, SAPQ_Default);
12127   verifyQualifierSpaces("void *const *x = NULL;", PAS_Right, SAPQ_Default);
12128   verifyQualifierSpaces("void * const * x = NULL;", PAS_Middle, SAPQ_Default);
12129 
12130   verifyQualifierSpaces("void* const* x = NULL;", PAS_Left, SAPQ_Before);
12131   verifyQualifierSpaces("void * const *x = NULL;", PAS_Right, SAPQ_Before);
12132   verifyQualifierSpaces("void * const * x = NULL;", PAS_Middle, SAPQ_Before);
12133 
12134   verifyQualifierSpaces("void* const * x = NULL;", PAS_Left, SAPQ_After);
12135   verifyQualifierSpaces("void *const *x = NULL;", PAS_Right, SAPQ_After);
12136   verifyQualifierSpaces("void * const * x = NULL;", PAS_Middle, SAPQ_After);
12137 
12138   verifyQualifierSpaces("void* const * x = NULL;", PAS_Left, SAPQ_Both);
12139   verifyQualifierSpaces("void * const *x = NULL;", PAS_Right, SAPQ_Both);
12140   verifyQualifierSpaces("void * const * x = NULL;", PAS_Middle, SAPQ_Both);
12141 
12142 #undef verifyQualifierSpaces
12143 
12144   FormatStyle Spaces = getLLVMStyle();
12145   Spaces.AttributeMacros.push_back("qualified");
12146   Spaces.PointerAlignment = FormatStyle::PAS_Right;
12147   Spaces.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Default;
12148   verifyFormat("SomeType *volatile *a = NULL;", Spaces);
12149   verifyFormat("SomeType *__attribute__((attr)) *a = NULL;", Spaces);
12150   verifyFormat("std::vector<SomeType *const *> x;", Spaces);
12151   verifyFormat("std::vector<SomeType *qualified *> x;", Spaces);
12152   verifyFormat("std::vector<SomeVar * NotAQualifier> x;", Spaces);
12153   Spaces.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Before;
12154   verifyFormat("SomeType * volatile *a = NULL;", Spaces);
12155   verifyFormat("SomeType * __attribute__((attr)) *a = NULL;", Spaces);
12156   verifyFormat("std::vector<SomeType * const *> x;", Spaces);
12157   verifyFormat("std::vector<SomeType * qualified *> x;", Spaces);
12158   verifyFormat("std::vector<SomeVar * NotAQualifier> x;", Spaces);
12159 
12160   // Check that SAPQ_Before doesn't result in extra spaces for PAS_Left.
12161   Spaces.PointerAlignment = FormatStyle::PAS_Left;
12162   Spaces.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Before;
12163   verifyFormat("SomeType* volatile* a = NULL;", Spaces);
12164   verifyFormat("SomeType* __attribute__((attr))* a = NULL;", Spaces);
12165   verifyFormat("std::vector<SomeType* const*> x;", Spaces);
12166   verifyFormat("std::vector<SomeType* qualified*> x;", Spaces);
12167   verifyFormat("std::vector<SomeVar * NotAQualifier> x;", Spaces);
12168   // However, setting it to SAPQ_After should add spaces after __attribute, etc.
12169   Spaces.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_After;
12170   verifyFormat("SomeType* volatile * a = NULL;", Spaces);
12171   verifyFormat("SomeType* __attribute__((attr)) * a = NULL;", Spaces);
12172   verifyFormat("std::vector<SomeType* const *> x;", Spaces);
12173   verifyFormat("std::vector<SomeType* qualified *> x;", Spaces);
12174   verifyFormat("std::vector<SomeVar * NotAQualifier> x;", Spaces);
12175 
12176   // PAS_Middle should not have any noticeable changes even for SAPQ_Both
12177   Spaces.PointerAlignment = FormatStyle::PAS_Middle;
12178   Spaces.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_After;
12179   verifyFormat("SomeType * volatile * a = NULL;", Spaces);
12180   verifyFormat("SomeType * __attribute__((attr)) * a = NULL;", Spaces);
12181   verifyFormat("std::vector<SomeType * const *> x;", Spaces);
12182   verifyFormat("std::vector<SomeType * qualified *> x;", Spaces);
12183   verifyFormat("std::vector<SomeVar * NotAQualifier> x;", Spaces);
12184 }
12185 
12186 TEST_F(FormatTest, AlignConsecutiveMacros) {
12187   FormatStyle Style = getLLVMStyle();
12188   Style.AlignConsecutiveAssignments = true;
12189   Style.AlignConsecutiveDeclarations = true;
12190   Style.AlignConsecutiveMacros = false;
12191 
12192   verifyFormat("#define a 3\n"
12193                "#define bbbb 4\n"
12194                "#define ccc (5)",
12195                Style);
12196 
12197   verifyFormat("#define f(x) (x * x)\n"
12198                "#define fff(x, y, z) (x * y + z)\n"
12199                "#define ffff(x, y) (x - y)",
12200                Style);
12201 
12202   verifyFormat("#define foo(x, y) (x + y)\n"
12203                "#define bar (5, 6)(2 + 2)",
12204                Style);
12205 
12206   verifyFormat("#define a 3\n"
12207                "#define bbbb 4\n"
12208                "#define ccc (5)\n"
12209                "#define f(x) (x * x)\n"
12210                "#define fff(x, y, z) (x * y + z)\n"
12211                "#define ffff(x, y) (x - y)",
12212                Style);
12213 
12214   Style.AlignConsecutiveMacros = true;
12215   verifyFormat("#define a    3\n"
12216                "#define bbbb 4\n"
12217                "#define ccc  (5)",
12218                Style);
12219 
12220   verifyFormat("#define f(x)         (x * x)\n"
12221                "#define fff(x, y, z) (x * y + z)\n"
12222                "#define ffff(x, y)   (x - y)",
12223                Style);
12224 
12225   verifyFormat("#define foo(x, y) (x + y)\n"
12226                "#define bar       (5, 6)(2 + 2)",
12227                Style);
12228 
12229   verifyFormat("#define a            3\n"
12230                "#define bbbb         4\n"
12231                "#define ccc          (5)\n"
12232                "#define f(x)         (x * x)\n"
12233                "#define fff(x, y, z) (x * y + z)\n"
12234                "#define ffff(x, y)   (x - y)",
12235                Style);
12236 
12237   verifyFormat("#define a         5\n"
12238                "#define foo(x, y) (x + y)\n"
12239                "#define CCC       (6)\n"
12240                "auto lambda = []() {\n"
12241                "  auto  ii = 0;\n"
12242                "  float j  = 0;\n"
12243                "  return 0;\n"
12244                "};\n"
12245                "int   i  = 0;\n"
12246                "float i2 = 0;\n"
12247                "auto  v  = type{\n"
12248                "    i = 1,   //\n"
12249                "    (i = 2), //\n"
12250                "    i = 3    //\n"
12251                "};",
12252                Style);
12253 
12254   Style.AlignConsecutiveMacros = false;
12255   Style.ColumnLimit = 20;
12256 
12257   verifyFormat("#define a          \\\n"
12258                "  \"aabbbbbbbbbbbb\"\n"
12259                "#define D          \\\n"
12260                "  \"aabbbbbbbbbbbb\" \\\n"
12261                "  \"ccddeeeeeeeee\"\n"
12262                "#define B          \\\n"
12263                "  \"QQQQQQQQQQQQQ\"  \\\n"
12264                "  \"FFFFFFFFFFFFF\"  \\\n"
12265                "  \"LLLLLLLL\"\n",
12266                Style);
12267 
12268   Style.AlignConsecutiveMacros = true;
12269   verifyFormat("#define a          \\\n"
12270                "  \"aabbbbbbbbbbbb\"\n"
12271                "#define D          \\\n"
12272                "  \"aabbbbbbbbbbbb\" \\\n"
12273                "  \"ccddeeeeeeeee\"\n"
12274                "#define B          \\\n"
12275                "  \"QQQQQQQQQQQQQ\"  \\\n"
12276                "  \"FFFFFFFFFFFFF\"  \\\n"
12277                "  \"LLLLLLLL\"\n",
12278                Style);
12279 }
12280 
12281 TEST_F(FormatTest, AlignConsecutiveAssignments) {
12282   FormatStyle Alignment = getLLVMStyle();
12283   Alignment.AlignConsecutiveMacros = true;
12284   Alignment.AlignConsecutiveAssignments = false;
12285   verifyFormat("int a = 5;\n"
12286                "int oneTwoThree = 123;",
12287                Alignment);
12288   verifyFormat("int a = 5;\n"
12289                "int oneTwoThree = 123;",
12290                Alignment);
12291 
12292   Alignment.AlignConsecutiveAssignments = true;
12293   verifyFormat("int a           = 5;\n"
12294                "int oneTwoThree = 123;",
12295                Alignment);
12296   verifyFormat("int a           = method();\n"
12297                "int oneTwoThree = 133;",
12298                Alignment);
12299   verifyFormat("a &= 5;\n"
12300                "bcd *= 5;\n"
12301                "ghtyf += 5;\n"
12302                "dvfvdb -= 5;\n"
12303                "a /= 5;\n"
12304                "vdsvsv %= 5;\n"
12305                "sfdbddfbdfbb ^= 5;\n"
12306                "dvsdsv |= 5;\n"
12307                "int dsvvdvsdvvv = 123;",
12308                Alignment);
12309   verifyFormat("int i = 1, j = 10;\n"
12310                "something = 2000;",
12311                Alignment);
12312   verifyFormat("something = 2000;\n"
12313                "int i = 1, j = 10;\n",
12314                Alignment);
12315   verifyFormat("something = 2000;\n"
12316                "another   = 911;\n"
12317                "int i = 1, j = 10;\n"
12318                "oneMore = 1;\n"
12319                "i       = 2;",
12320                Alignment);
12321   verifyFormat("int a   = 5;\n"
12322                "int one = 1;\n"
12323                "method();\n"
12324                "int oneTwoThree = 123;\n"
12325                "int oneTwo      = 12;",
12326                Alignment);
12327   verifyFormat("int oneTwoThree = 123;\n"
12328                "int oneTwo      = 12;\n"
12329                "method();\n",
12330                Alignment);
12331   verifyFormat("int oneTwoThree = 123; // comment\n"
12332                "int oneTwo      = 12;  // comment",
12333                Alignment);
12334 
12335   // Bug 25167
12336   /* Uncomment when fixed
12337     verifyFormat("#if A\n"
12338                  "#else\n"
12339                  "int aaaaaaaa = 12;\n"
12340                  "#endif\n"
12341                  "#if B\n"
12342                  "#else\n"
12343                  "int a = 12;\n"
12344                  "#endif\n",
12345                  Alignment);
12346     verifyFormat("enum foo {\n"
12347                  "#if A\n"
12348                  "#else\n"
12349                  "  aaaaaaaa = 12;\n"
12350                  "#endif\n"
12351                  "#if B\n"
12352                  "#else\n"
12353                  "  a = 12;\n"
12354                  "#endif\n"
12355                  "};\n",
12356                  Alignment);
12357   */
12358 
12359   EXPECT_EQ("int a = 5;\n"
12360             "\n"
12361             "int oneTwoThree = 123;",
12362             format("int a       = 5;\n"
12363                    "\n"
12364                    "int oneTwoThree= 123;",
12365                    Alignment));
12366   EXPECT_EQ("int a   = 5;\n"
12367             "int one = 1;\n"
12368             "\n"
12369             "int oneTwoThree = 123;",
12370             format("int a = 5;\n"
12371                    "int one = 1;\n"
12372                    "\n"
12373                    "int oneTwoThree = 123;",
12374                    Alignment));
12375   EXPECT_EQ("int a   = 5;\n"
12376             "int one = 1;\n"
12377             "\n"
12378             "int oneTwoThree = 123;\n"
12379             "int oneTwo      = 12;",
12380             format("int a = 5;\n"
12381                    "int one = 1;\n"
12382                    "\n"
12383                    "int oneTwoThree = 123;\n"
12384                    "int oneTwo = 12;",
12385                    Alignment));
12386   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
12387   verifyFormat("#define A \\\n"
12388                "  int aaaa       = 12; \\\n"
12389                "  int b          = 23; \\\n"
12390                "  int ccc        = 234; \\\n"
12391                "  int dddddddddd = 2345;",
12392                Alignment);
12393   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
12394   verifyFormat("#define A               \\\n"
12395                "  int aaaa       = 12;  \\\n"
12396                "  int b          = 23;  \\\n"
12397                "  int ccc        = 234; \\\n"
12398                "  int dddddddddd = 2345;",
12399                Alignment);
12400   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
12401   verifyFormat("#define A                                                      "
12402                "                \\\n"
12403                "  int aaaa       = 12;                                         "
12404                "                \\\n"
12405                "  int b          = 23;                                         "
12406                "                \\\n"
12407                "  int ccc        = 234;                                        "
12408                "                \\\n"
12409                "  int dddddddddd = 2345;",
12410                Alignment);
12411   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
12412                "k = 4, int l = 5,\n"
12413                "                  int m = 6) {\n"
12414                "  int j      = 10;\n"
12415                "  otherThing = 1;\n"
12416                "}",
12417                Alignment);
12418   verifyFormat("void SomeFunction(int parameter = 0) {\n"
12419                "  int i   = 1;\n"
12420                "  int j   = 2;\n"
12421                "  int big = 10000;\n"
12422                "}",
12423                Alignment);
12424   verifyFormat("class C {\n"
12425                "public:\n"
12426                "  int i            = 1;\n"
12427                "  virtual void f() = 0;\n"
12428                "};",
12429                Alignment);
12430   verifyFormat("int i = 1;\n"
12431                "if (SomeType t = getSomething()) {\n"
12432                "}\n"
12433                "int j   = 2;\n"
12434                "int big = 10000;",
12435                Alignment);
12436   verifyFormat("int j = 7;\n"
12437                "for (int k = 0; k < N; ++k) {\n"
12438                "}\n"
12439                "int j   = 2;\n"
12440                "int big = 10000;\n"
12441                "}",
12442                Alignment);
12443   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
12444   verifyFormat("int i = 1;\n"
12445                "LooooooooooongType loooooooooooooooooooooongVariable\n"
12446                "    = someLooooooooooooooooongFunction();\n"
12447                "int j = 2;",
12448                Alignment);
12449   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
12450   verifyFormat("int i = 1;\n"
12451                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
12452                "    someLooooooooooooooooongFunction();\n"
12453                "int j = 2;",
12454                Alignment);
12455 
12456   verifyFormat("auto lambda = []() {\n"
12457                "  auto i = 0;\n"
12458                "  return 0;\n"
12459                "};\n"
12460                "int i  = 0;\n"
12461                "auto v = type{\n"
12462                "    i = 1,   //\n"
12463                "    (i = 2), //\n"
12464                "    i = 3    //\n"
12465                "};",
12466                Alignment);
12467 
12468   verifyFormat(
12469       "int i      = 1;\n"
12470       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
12471       "                          loooooooooooooooooooooongParameterB);\n"
12472       "int j      = 2;",
12473       Alignment);
12474 
12475   verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
12476                "          typename B   = very_long_type_name_1,\n"
12477                "          typename T_2 = very_long_type_name_2>\n"
12478                "auto foo() {}\n",
12479                Alignment);
12480   verifyFormat("int a, b = 1;\n"
12481                "int c  = 2;\n"
12482                "int dd = 3;\n",
12483                Alignment);
12484   verifyFormat("int aa       = ((1 > 2) ? 3 : 4);\n"
12485                "float b[1][] = {{3.f}};\n",
12486                Alignment);
12487   verifyFormat("for (int i = 0; i < 1; i++)\n"
12488                "  int x = 1;\n",
12489                Alignment);
12490   verifyFormat("for (i = 0; i < 1; i++)\n"
12491                "  x = 1;\n"
12492                "y = 1;\n",
12493                Alignment);
12494 
12495   Alignment.ReflowComments = true;
12496   Alignment.ColumnLimit = 50;
12497   EXPECT_EQ("int x   = 0;\n"
12498             "int yy  = 1; /// specificlennospace\n"
12499             "int zzz = 2;\n",
12500             format("int x   = 0;\n"
12501                    "int yy  = 1; ///specificlennospace\n"
12502                    "int zzz = 2;\n",
12503                    Alignment));
12504 }
12505 
12506 TEST_F(FormatTest, AlignConsecutiveBitFields) {
12507   FormatStyle Alignment = getLLVMStyle();
12508   Alignment.AlignConsecutiveBitFields = true;
12509   verifyFormat("int const a     : 5;\n"
12510                "int oneTwoThree : 23;",
12511                Alignment);
12512 
12513   // Initializers are allowed starting with c++2a
12514   verifyFormat("int const a     : 5 = 1;\n"
12515                "int oneTwoThree : 23 = 0;",
12516                Alignment);
12517 
12518   Alignment.AlignConsecutiveDeclarations = true;
12519   verifyFormat("int const a           : 5;\n"
12520                "int       oneTwoThree : 23;",
12521                Alignment);
12522 
12523   verifyFormat("int const a           : 5;  // comment\n"
12524                "int       oneTwoThree : 23; // comment",
12525                Alignment);
12526 
12527   verifyFormat("int const a           : 5 = 1;\n"
12528                "int       oneTwoThree : 23 = 0;",
12529                Alignment);
12530 
12531   Alignment.AlignConsecutiveAssignments = true;
12532   verifyFormat("int const a           : 5  = 1;\n"
12533                "int       oneTwoThree : 23 = 0;",
12534                Alignment);
12535   verifyFormat("int const a           : 5  = {1};\n"
12536                "int       oneTwoThree : 23 = 0;",
12537                Alignment);
12538 
12539   Alignment.BitFieldColonSpacing = FormatStyle::BFCS_None;
12540   verifyFormat("int const a          :5;\n"
12541                "int       oneTwoThree:23;",
12542                Alignment);
12543 
12544   Alignment.BitFieldColonSpacing = FormatStyle::BFCS_Before;
12545   verifyFormat("int const a           :5;\n"
12546                "int       oneTwoThree :23;",
12547                Alignment);
12548 
12549   Alignment.BitFieldColonSpacing = FormatStyle::BFCS_After;
12550   verifyFormat("int const a          : 5;\n"
12551                "int       oneTwoThree: 23;",
12552                Alignment);
12553 
12554   // Known limitations: ':' is only recognized as a bitfield colon when
12555   // followed by a number.
12556   /*
12557   verifyFormat("int oneTwoThree : SOME_CONSTANT;\n"
12558                "int a           : 5;",
12559                Alignment);
12560   */
12561 }
12562 
12563 TEST_F(FormatTest, AlignConsecutiveDeclarations) {
12564   FormatStyle Alignment = getLLVMStyle();
12565   Alignment.AlignConsecutiveMacros = true;
12566   Alignment.AlignConsecutiveDeclarations = false;
12567   verifyFormat("float const a = 5;\n"
12568                "int oneTwoThree = 123;",
12569                Alignment);
12570   verifyFormat("int a = 5;\n"
12571                "float const oneTwoThree = 123;",
12572                Alignment);
12573 
12574   Alignment.AlignConsecutiveDeclarations = true;
12575   verifyFormat("float const a = 5;\n"
12576                "int         oneTwoThree = 123;",
12577                Alignment);
12578   verifyFormat("int         a = method();\n"
12579                "float const oneTwoThree = 133;",
12580                Alignment);
12581   verifyFormat("int i = 1, j = 10;\n"
12582                "something = 2000;",
12583                Alignment);
12584   verifyFormat("something = 2000;\n"
12585                "int i = 1, j = 10;\n",
12586                Alignment);
12587   verifyFormat("float      something = 2000;\n"
12588                "double     another = 911;\n"
12589                "int        i = 1, j = 10;\n"
12590                "const int *oneMore = 1;\n"
12591                "unsigned   i = 2;",
12592                Alignment);
12593   verifyFormat("float a = 5;\n"
12594                "int   one = 1;\n"
12595                "method();\n"
12596                "const double       oneTwoThree = 123;\n"
12597                "const unsigned int oneTwo = 12;",
12598                Alignment);
12599   verifyFormat("int      oneTwoThree{0}; // comment\n"
12600                "unsigned oneTwo;         // comment",
12601                Alignment);
12602   EXPECT_EQ("float const a = 5;\n"
12603             "\n"
12604             "int oneTwoThree = 123;",
12605             format("float const   a = 5;\n"
12606                    "\n"
12607                    "int           oneTwoThree= 123;",
12608                    Alignment));
12609   EXPECT_EQ("float a = 5;\n"
12610             "int   one = 1;\n"
12611             "\n"
12612             "unsigned oneTwoThree = 123;",
12613             format("float    a = 5;\n"
12614                    "int      one = 1;\n"
12615                    "\n"
12616                    "unsigned oneTwoThree = 123;",
12617                    Alignment));
12618   EXPECT_EQ("float a = 5;\n"
12619             "int   one = 1;\n"
12620             "\n"
12621             "unsigned oneTwoThree = 123;\n"
12622             "int      oneTwo = 12;",
12623             format("float    a = 5;\n"
12624                    "int one = 1;\n"
12625                    "\n"
12626                    "unsigned oneTwoThree = 123;\n"
12627                    "int oneTwo = 12;",
12628                    Alignment));
12629   // Function prototype alignment
12630   verifyFormat("int    a();\n"
12631                "double b();",
12632                Alignment);
12633   verifyFormat("int    a(int x);\n"
12634                "double b();",
12635                Alignment);
12636   unsigned OldColumnLimit = Alignment.ColumnLimit;
12637   // We need to set ColumnLimit to zero, in order to stress nested alignments,
12638   // otherwise the function parameters will be re-flowed onto a single line.
12639   Alignment.ColumnLimit = 0;
12640   EXPECT_EQ("int    a(int   x,\n"
12641             "         float y);\n"
12642             "double b(int    x,\n"
12643             "         double y);",
12644             format("int a(int x,\n"
12645                    " float y);\n"
12646                    "double b(int x,\n"
12647                    " double y);",
12648                    Alignment));
12649   // This ensures that function parameters of function declarations are
12650   // correctly indented when their owning functions are indented.
12651   // The failure case here is for 'double y' to not be indented enough.
12652   EXPECT_EQ("double a(int x);\n"
12653             "int    b(int    y,\n"
12654             "         double z);",
12655             format("double a(int x);\n"
12656                    "int b(int y,\n"
12657                    " double z);",
12658                    Alignment));
12659   // Set ColumnLimit low so that we induce wrapping immediately after
12660   // the function name and opening paren.
12661   Alignment.ColumnLimit = 13;
12662   verifyFormat("int function(\n"
12663                "    int  x,\n"
12664                "    bool y);",
12665                Alignment);
12666   Alignment.ColumnLimit = OldColumnLimit;
12667   // Ensure function pointers don't screw up recursive alignment
12668   verifyFormat("int    a(int x, void (*fp)(int y));\n"
12669                "double b();",
12670                Alignment);
12671   Alignment.AlignConsecutiveAssignments = true;
12672   // Ensure recursive alignment is broken by function braces, so that the
12673   // "a = 1" does not align with subsequent assignments inside the function
12674   // body.
12675   verifyFormat("int func(int a = 1) {\n"
12676                "  int b  = 2;\n"
12677                "  int cc = 3;\n"
12678                "}",
12679                Alignment);
12680   verifyFormat("float      something = 2000;\n"
12681                "double     another   = 911;\n"
12682                "int        i = 1, j = 10;\n"
12683                "const int *oneMore = 1;\n"
12684                "unsigned   i       = 2;",
12685                Alignment);
12686   verifyFormat("int      oneTwoThree = {0}; // comment\n"
12687                "unsigned oneTwo      = 0;   // comment",
12688                Alignment);
12689   // Make sure that scope is correctly tracked, in the absence of braces
12690   verifyFormat("for (int i = 0; i < n; i++)\n"
12691                "  j = i;\n"
12692                "double x = 1;\n",
12693                Alignment);
12694   verifyFormat("if (int i = 0)\n"
12695                "  j = i;\n"
12696                "double x = 1;\n",
12697                Alignment);
12698   // Ensure operator[] and operator() are comprehended
12699   verifyFormat("struct test {\n"
12700                "  long long int foo();\n"
12701                "  int           operator[](int a);\n"
12702                "  double        bar();\n"
12703                "};\n",
12704                Alignment);
12705   verifyFormat("struct test {\n"
12706                "  long long int foo();\n"
12707                "  int           operator()(int a);\n"
12708                "  double        bar();\n"
12709                "};\n",
12710                Alignment);
12711   EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
12712             "  int const i   = 1;\n"
12713             "  int *     j   = 2;\n"
12714             "  int       big = 10000;\n"
12715             "\n"
12716             "  unsigned oneTwoThree = 123;\n"
12717             "  int      oneTwo      = 12;\n"
12718             "  method();\n"
12719             "  float k  = 2;\n"
12720             "  int   ll = 10000;\n"
12721             "}",
12722             format("void SomeFunction(int parameter= 0) {\n"
12723                    " int const  i= 1;\n"
12724                    "  int *j=2;\n"
12725                    " int big  =  10000;\n"
12726                    "\n"
12727                    "unsigned oneTwoThree  =123;\n"
12728                    "int oneTwo = 12;\n"
12729                    "  method();\n"
12730                    "float k= 2;\n"
12731                    "int ll=10000;\n"
12732                    "}",
12733                    Alignment));
12734   Alignment.AlignConsecutiveAssignments = false;
12735   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
12736   verifyFormat("#define A \\\n"
12737                "  int       aaaa = 12; \\\n"
12738                "  float     b = 23; \\\n"
12739                "  const int ccc = 234; \\\n"
12740                "  unsigned  dddddddddd = 2345;",
12741                Alignment);
12742   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
12743   verifyFormat("#define A              \\\n"
12744                "  int       aaaa = 12; \\\n"
12745                "  float     b = 23;    \\\n"
12746                "  const int ccc = 234; \\\n"
12747                "  unsigned  dddddddddd = 2345;",
12748                Alignment);
12749   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
12750   Alignment.ColumnLimit = 30;
12751   verifyFormat("#define A                    \\\n"
12752                "  int       aaaa = 12;       \\\n"
12753                "  float     b = 23;          \\\n"
12754                "  const int ccc = 234;       \\\n"
12755                "  int       dddddddddd = 2345;",
12756                Alignment);
12757   Alignment.ColumnLimit = 80;
12758   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
12759                "k = 4, int l = 5,\n"
12760                "                  int m = 6) {\n"
12761                "  const int j = 10;\n"
12762                "  otherThing = 1;\n"
12763                "}",
12764                Alignment);
12765   verifyFormat("void SomeFunction(int parameter = 0) {\n"
12766                "  int const i = 1;\n"
12767                "  int *     j = 2;\n"
12768                "  int       big = 10000;\n"
12769                "}",
12770                Alignment);
12771   verifyFormat("class C {\n"
12772                "public:\n"
12773                "  int          i = 1;\n"
12774                "  virtual void f() = 0;\n"
12775                "};",
12776                Alignment);
12777   verifyFormat("float i = 1;\n"
12778                "if (SomeType t = getSomething()) {\n"
12779                "}\n"
12780                "const unsigned j = 2;\n"
12781                "int            big = 10000;",
12782                Alignment);
12783   verifyFormat("float j = 7;\n"
12784                "for (int k = 0; k < N; ++k) {\n"
12785                "}\n"
12786                "unsigned j = 2;\n"
12787                "int      big = 10000;\n"
12788                "}",
12789                Alignment);
12790   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
12791   verifyFormat("float              i = 1;\n"
12792                "LooooooooooongType loooooooooooooooooooooongVariable\n"
12793                "    = someLooooooooooooooooongFunction();\n"
12794                "int j = 2;",
12795                Alignment);
12796   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
12797   verifyFormat("int                i = 1;\n"
12798                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
12799                "    someLooooooooooooooooongFunction();\n"
12800                "int j = 2;",
12801                Alignment);
12802 
12803   Alignment.AlignConsecutiveAssignments = true;
12804   verifyFormat("auto lambda = []() {\n"
12805                "  auto  ii = 0;\n"
12806                "  float j  = 0;\n"
12807                "  return 0;\n"
12808                "};\n"
12809                "int   i  = 0;\n"
12810                "float i2 = 0;\n"
12811                "auto  v  = type{\n"
12812                "    i = 1,   //\n"
12813                "    (i = 2), //\n"
12814                "    i = 3    //\n"
12815                "};",
12816                Alignment);
12817   Alignment.AlignConsecutiveAssignments = false;
12818 
12819   verifyFormat(
12820       "int      i = 1;\n"
12821       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
12822       "                          loooooooooooooooooooooongParameterB);\n"
12823       "int      j = 2;",
12824       Alignment);
12825 
12826   // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
12827   // We expect declarations and assignments to align, as long as it doesn't
12828   // exceed the column limit, starting a new alignment sequence whenever it
12829   // happens.
12830   Alignment.AlignConsecutiveAssignments = true;
12831   Alignment.ColumnLimit = 30;
12832   verifyFormat("float    ii              = 1;\n"
12833                "unsigned j               = 2;\n"
12834                "int someVerylongVariable = 1;\n"
12835                "AnotherLongType  ll = 123456;\n"
12836                "VeryVeryLongType k  = 2;\n"
12837                "int              myvar = 1;",
12838                Alignment);
12839   Alignment.ColumnLimit = 80;
12840   Alignment.AlignConsecutiveAssignments = false;
12841 
12842   verifyFormat(
12843       "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
12844       "          typename LongType, typename B>\n"
12845       "auto foo() {}\n",
12846       Alignment);
12847   verifyFormat("float a, b = 1;\n"
12848                "int   c = 2;\n"
12849                "int   dd = 3;\n",
12850                Alignment);
12851   verifyFormat("int   aa = ((1 > 2) ? 3 : 4);\n"
12852                "float b[1][] = {{3.f}};\n",
12853                Alignment);
12854   Alignment.AlignConsecutiveAssignments = true;
12855   verifyFormat("float a, b = 1;\n"
12856                "int   c  = 2;\n"
12857                "int   dd = 3;\n",
12858                Alignment);
12859   verifyFormat("int   aa     = ((1 > 2) ? 3 : 4);\n"
12860                "float b[1][] = {{3.f}};\n",
12861                Alignment);
12862   Alignment.AlignConsecutiveAssignments = false;
12863 
12864   Alignment.ColumnLimit = 30;
12865   Alignment.BinPackParameters = false;
12866   verifyFormat("void foo(float     a,\n"
12867                "         float     b,\n"
12868                "         int       c,\n"
12869                "         uint32_t *d) {\n"
12870                "  int *  e = 0;\n"
12871                "  float  f = 0;\n"
12872                "  double g = 0;\n"
12873                "}\n"
12874                "void bar(ino_t     a,\n"
12875                "         int       b,\n"
12876                "         uint32_t *c,\n"
12877                "         bool      d) {}\n",
12878                Alignment);
12879   Alignment.BinPackParameters = true;
12880   Alignment.ColumnLimit = 80;
12881 
12882   // Bug 33507
12883   Alignment.PointerAlignment = FormatStyle::PAS_Middle;
12884   verifyFormat(
12885       "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
12886       "  static const Version verVs2017;\n"
12887       "  return true;\n"
12888       "});\n",
12889       Alignment);
12890   Alignment.PointerAlignment = FormatStyle::PAS_Right;
12891 
12892   // See llvm.org/PR35641
12893   Alignment.AlignConsecutiveDeclarations = true;
12894   verifyFormat("int func() { //\n"
12895                "  int      b;\n"
12896                "  unsigned c;\n"
12897                "}",
12898                Alignment);
12899 
12900   // See PR37175
12901   FormatStyle Style = getMozillaStyle();
12902   Style.AlignConsecutiveDeclarations = true;
12903   EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n"
12904             "foo(int a);",
12905             format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style));
12906 }
12907 
12908 TEST_F(FormatTest, LinuxBraceBreaking) {
12909   FormatStyle LinuxBraceStyle = getLLVMStyle();
12910   LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
12911   verifyFormat("namespace a\n"
12912                "{\n"
12913                "class A\n"
12914                "{\n"
12915                "  void f()\n"
12916                "  {\n"
12917                "    if (true) {\n"
12918                "      a();\n"
12919                "      b();\n"
12920                "    } else {\n"
12921                "      a();\n"
12922                "    }\n"
12923                "  }\n"
12924                "  void g() { return; }\n"
12925                "};\n"
12926                "struct B {\n"
12927                "  int x;\n"
12928                "};\n"
12929                "} // namespace a\n",
12930                LinuxBraceStyle);
12931   verifyFormat("enum X {\n"
12932                "  Y = 0,\n"
12933                "}\n",
12934                LinuxBraceStyle);
12935   verifyFormat("struct S {\n"
12936                "  int Type;\n"
12937                "  union {\n"
12938                "    int x;\n"
12939                "    double y;\n"
12940                "  } Value;\n"
12941                "  class C\n"
12942                "  {\n"
12943                "    MyFavoriteType Value;\n"
12944                "  } Class;\n"
12945                "}\n",
12946                LinuxBraceStyle);
12947 }
12948 
12949 TEST_F(FormatTest, MozillaBraceBreaking) {
12950   FormatStyle MozillaBraceStyle = getLLVMStyle();
12951   MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
12952   MozillaBraceStyle.FixNamespaceComments = false;
12953   verifyFormat("namespace a {\n"
12954                "class A\n"
12955                "{\n"
12956                "  void f()\n"
12957                "  {\n"
12958                "    if (true) {\n"
12959                "      a();\n"
12960                "      b();\n"
12961                "    }\n"
12962                "  }\n"
12963                "  void g() { return; }\n"
12964                "};\n"
12965                "enum E\n"
12966                "{\n"
12967                "  A,\n"
12968                "  // foo\n"
12969                "  B,\n"
12970                "  C\n"
12971                "};\n"
12972                "struct B\n"
12973                "{\n"
12974                "  int x;\n"
12975                "};\n"
12976                "}\n",
12977                MozillaBraceStyle);
12978   verifyFormat("struct S\n"
12979                "{\n"
12980                "  int Type;\n"
12981                "  union\n"
12982                "  {\n"
12983                "    int x;\n"
12984                "    double y;\n"
12985                "  } Value;\n"
12986                "  class C\n"
12987                "  {\n"
12988                "    MyFavoriteType Value;\n"
12989                "  } Class;\n"
12990                "}\n",
12991                MozillaBraceStyle);
12992 }
12993 
12994 TEST_F(FormatTest, StroustrupBraceBreaking) {
12995   FormatStyle StroustrupBraceStyle = getLLVMStyle();
12996   StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
12997   verifyFormat("namespace a {\n"
12998                "class A {\n"
12999                "  void f()\n"
13000                "  {\n"
13001                "    if (true) {\n"
13002                "      a();\n"
13003                "      b();\n"
13004                "    }\n"
13005                "  }\n"
13006                "  void g() { return; }\n"
13007                "};\n"
13008                "struct B {\n"
13009                "  int x;\n"
13010                "};\n"
13011                "} // namespace a\n",
13012                StroustrupBraceStyle);
13013 
13014   verifyFormat("void foo()\n"
13015                "{\n"
13016                "  if (a) {\n"
13017                "    a();\n"
13018                "  }\n"
13019                "  else {\n"
13020                "    b();\n"
13021                "  }\n"
13022                "}\n",
13023                StroustrupBraceStyle);
13024 
13025   verifyFormat("#ifdef _DEBUG\n"
13026                "int foo(int i = 0)\n"
13027                "#else\n"
13028                "int foo(int i = 5)\n"
13029                "#endif\n"
13030                "{\n"
13031                "  return i;\n"
13032                "}",
13033                StroustrupBraceStyle);
13034 
13035   verifyFormat("void foo() {}\n"
13036                "void bar()\n"
13037                "#ifdef _DEBUG\n"
13038                "{\n"
13039                "  foo();\n"
13040                "}\n"
13041                "#else\n"
13042                "{\n"
13043                "}\n"
13044                "#endif",
13045                StroustrupBraceStyle);
13046 
13047   verifyFormat("void foobar() { int i = 5; }\n"
13048                "#ifdef _DEBUG\n"
13049                "void bar() {}\n"
13050                "#else\n"
13051                "void bar() { foobar(); }\n"
13052                "#endif",
13053                StroustrupBraceStyle);
13054 }
13055 
13056 TEST_F(FormatTest, AllmanBraceBreaking) {
13057   FormatStyle AllmanBraceStyle = getLLVMStyle();
13058   AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
13059 
13060   EXPECT_EQ("namespace a\n"
13061             "{\n"
13062             "void f();\n"
13063             "void g();\n"
13064             "} // namespace a\n",
13065             format("namespace a\n"
13066                    "{\n"
13067                    "void f();\n"
13068                    "void g();\n"
13069                    "}\n",
13070                    AllmanBraceStyle));
13071 
13072   verifyFormat("namespace a\n"
13073                "{\n"
13074                "class A\n"
13075                "{\n"
13076                "  void f()\n"
13077                "  {\n"
13078                "    if (true)\n"
13079                "    {\n"
13080                "      a();\n"
13081                "      b();\n"
13082                "    }\n"
13083                "  }\n"
13084                "  void g() { return; }\n"
13085                "};\n"
13086                "struct B\n"
13087                "{\n"
13088                "  int x;\n"
13089                "};\n"
13090                "union C\n"
13091                "{\n"
13092                "};\n"
13093                "} // namespace a",
13094                AllmanBraceStyle);
13095 
13096   verifyFormat("void f()\n"
13097                "{\n"
13098                "  if (true)\n"
13099                "  {\n"
13100                "    a();\n"
13101                "  }\n"
13102                "  else if (false)\n"
13103                "  {\n"
13104                "    b();\n"
13105                "  }\n"
13106                "  else\n"
13107                "  {\n"
13108                "    c();\n"
13109                "  }\n"
13110                "}\n",
13111                AllmanBraceStyle);
13112 
13113   verifyFormat("void f()\n"
13114                "{\n"
13115                "  for (int i = 0; i < 10; ++i)\n"
13116                "  {\n"
13117                "    a();\n"
13118                "  }\n"
13119                "  while (false)\n"
13120                "  {\n"
13121                "    b();\n"
13122                "  }\n"
13123                "  do\n"
13124                "  {\n"
13125                "    c();\n"
13126                "  } while (false)\n"
13127                "}\n",
13128                AllmanBraceStyle);
13129 
13130   verifyFormat("void f(int a)\n"
13131                "{\n"
13132                "  switch (a)\n"
13133                "  {\n"
13134                "  case 0:\n"
13135                "    break;\n"
13136                "  case 1:\n"
13137                "  {\n"
13138                "    break;\n"
13139                "  }\n"
13140                "  case 2:\n"
13141                "  {\n"
13142                "  }\n"
13143                "  break;\n"
13144                "  default:\n"
13145                "    break;\n"
13146                "  }\n"
13147                "}\n",
13148                AllmanBraceStyle);
13149 
13150   verifyFormat("enum X\n"
13151                "{\n"
13152                "  Y = 0,\n"
13153                "}\n",
13154                AllmanBraceStyle);
13155   verifyFormat("enum X\n"
13156                "{\n"
13157                "  Y = 0\n"
13158                "}\n",
13159                AllmanBraceStyle);
13160 
13161   verifyFormat("@interface BSApplicationController ()\n"
13162                "{\n"
13163                "@private\n"
13164                "  id _extraIvar;\n"
13165                "}\n"
13166                "@end\n",
13167                AllmanBraceStyle);
13168 
13169   verifyFormat("#ifdef _DEBUG\n"
13170                "int foo(int i = 0)\n"
13171                "#else\n"
13172                "int foo(int i = 5)\n"
13173                "#endif\n"
13174                "{\n"
13175                "  return i;\n"
13176                "}",
13177                AllmanBraceStyle);
13178 
13179   verifyFormat("void foo() {}\n"
13180                "void bar()\n"
13181                "#ifdef _DEBUG\n"
13182                "{\n"
13183                "  foo();\n"
13184                "}\n"
13185                "#else\n"
13186                "{\n"
13187                "}\n"
13188                "#endif",
13189                AllmanBraceStyle);
13190 
13191   verifyFormat("void foobar() { int i = 5; }\n"
13192                "#ifdef _DEBUG\n"
13193                "void bar() {}\n"
13194                "#else\n"
13195                "void bar() { foobar(); }\n"
13196                "#endif",
13197                AllmanBraceStyle);
13198 
13199   // This shouldn't affect ObjC blocks..
13200   verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
13201                "  // ...\n"
13202                "  int i;\n"
13203                "}];",
13204                AllmanBraceStyle);
13205   verifyFormat("void (^block)(void) = ^{\n"
13206                "  // ...\n"
13207                "  int i;\n"
13208                "};",
13209                AllmanBraceStyle);
13210   // .. or dict literals.
13211   verifyFormat("void f()\n"
13212                "{\n"
13213                "  // ...\n"
13214                "  [object someMethod:@{@\"a\" : @\"b\"}];\n"
13215                "}",
13216                AllmanBraceStyle);
13217   verifyFormat("void f()\n"
13218                "{\n"
13219                "  // ...\n"
13220                "  [object someMethod:@{a : @\"b\"}];\n"
13221                "}",
13222                AllmanBraceStyle);
13223   verifyFormat("int f()\n"
13224                "{ // comment\n"
13225                "  return 42;\n"
13226                "}",
13227                AllmanBraceStyle);
13228 
13229   AllmanBraceStyle.ColumnLimit = 19;
13230   verifyFormat("void f() { int i; }", AllmanBraceStyle);
13231   AllmanBraceStyle.ColumnLimit = 18;
13232   verifyFormat("void f()\n"
13233                "{\n"
13234                "  int i;\n"
13235                "}",
13236                AllmanBraceStyle);
13237   AllmanBraceStyle.ColumnLimit = 80;
13238 
13239   FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
13240   BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine =
13241       FormatStyle::SIS_WithoutElse;
13242   BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
13243   verifyFormat("void f(bool b)\n"
13244                "{\n"
13245                "  if (b)\n"
13246                "  {\n"
13247                "    return;\n"
13248                "  }\n"
13249                "}\n",
13250                BreakBeforeBraceShortIfs);
13251   verifyFormat("void f(bool b)\n"
13252                "{\n"
13253                "  if constexpr (b)\n"
13254                "  {\n"
13255                "    return;\n"
13256                "  }\n"
13257                "}\n",
13258                BreakBeforeBraceShortIfs);
13259   verifyFormat("void f(bool b)\n"
13260                "{\n"
13261                "  if CONSTEXPR (b)\n"
13262                "  {\n"
13263                "    return;\n"
13264                "  }\n"
13265                "}\n",
13266                BreakBeforeBraceShortIfs);
13267   verifyFormat("void f(bool b)\n"
13268                "{\n"
13269                "  if (b) return;\n"
13270                "}\n",
13271                BreakBeforeBraceShortIfs);
13272   verifyFormat("void f(bool b)\n"
13273                "{\n"
13274                "  if constexpr (b) return;\n"
13275                "}\n",
13276                BreakBeforeBraceShortIfs);
13277   verifyFormat("void f(bool b)\n"
13278                "{\n"
13279                "  if CONSTEXPR (b) return;\n"
13280                "}\n",
13281                BreakBeforeBraceShortIfs);
13282   verifyFormat("void f(bool b)\n"
13283                "{\n"
13284                "  while (b)\n"
13285                "  {\n"
13286                "    return;\n"
13287                "  }\n"
13288                "}\n",
13289                BreakBeforeBraceShortIfs);
13290 }
13291 
13292 TEST_F(FormatTest, WhitesmithsBraceBreaking) {
13293   FormatStyle WhitesmithsBraceStyle = getLLVMStyle();
13294   WhitesmithsBraceStyle.BreakBeforeBraces = FormatStyle::BS_Whitesmiths;
13295 
13296   // Make a few changes to the style for testing purposes
13297   WhitesmithsBraceStyle.AllowShortFunctionsOnASingleLine =
13298       FormatStyle::SFS_Empty;
13299   WhitesmithsBraceStyle.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None;
13300   WhitesmithsBraceStyle.ColumnLimit = 0;
13301 
13302   // FIXME: this test case can't decide whether there should be a blank line
13303   // after the ~D() line or not. It adds one if one doesn't exist in the test
13304   // and it removes the line if one exists.
13305   /*
13306   verifyFormat("class A;\n"
13307                "namespace B\n"
13308                "  {\n"
13309                "class C;\n"
13310                "// Comment\n"
13311                "class D\n"
13312                "  {\n"
13313                "public:\n"
13314                "  D();\n"
13315                "  ~D() {}\n"
13316                "private:\n"
13317                "  enum E\n"
13318                "    {\n"
13319                "    F\n"
13320                "    }\n"
13321                "  };\n"
13322                "  } // namespace B\n",
13323                WhitesmithsBraceStyle);
13324   */
13325 
13326   verifyFormat("namespace a\n"
13327                "  {\n"
13328                "class A\n"
13329                "  {\n"
13330                "  void f()\n"
13331                "    {\n"
13332                "    if (true)\n"
13333                "      {\n"
13334                "      a();\n"
13335                "      b();\n"
13336                "      }\n"
13337                "    }\n"
13338                "  void g()\n"
13339                "    {\n"
13340                "    return;\n"
13341                "    }\n"
13342                "  };\n"
13343                "struct B\n"
13344                "  {\n"
13345                "  int x;\n"
13346                "  };\n"
13347                "  } // namespace a",
13348                WhitesmithsBraceStyle);
13349 
13350   verifyFormat("void f()\n"
13351                "  {\n"
13352                "  if (true)\n"
13353                "    {\n"
13354                "    a();\n"
13355                "    }\n"
13356                "  else if (false)\n"
13357                "    {\n"
13358                "    b();\n"
13359                "    }\n"
13360                "  else\n"
13361                "    {\n"
13362                "    c();\n"
13363                "    }\n"
13364                "  }\n",
13365                WhitesmithsBraceStyle);
13366 
13367   verifyFormat("void f()\n"
13368                "  {\n"
13369                "  for (int i = 0; i < 10; ++i)\n"
13370                "    {\n"
13371                "    a();\n"
13372                "    }\n"
13373                "  while (false)\n"
13374                "    {\n"
13375                "    b();\n"
13376                "    }\n"
13377                "  do\n"
13378                "    {\n"
13379                "    c();\n"
13380                "    } while (false)\n"
13381                "  }\n",
13382                WhitesmithsBraceStyle);
13383 
13384   WhitesmithsBraceStyle.IndentCaseBlocks = true;
13385   verifyFormat("void switchTest1(int a)\n"
13386                "  {\n"
13387                "  switch (a)\n"
13388                "    {\n"
13389                "    case 2:\n"
13390                "      {\n"
13391                "      }\n"
13392                "    break;\n"
13393                "    }\n"
13394                "  }\n",
13395                WhitesmithsBraceStyle);
13396 
13397   verifyFormat("void switchTest2(int a)\n"
13398                "  {\n"
13399                "  switch (a)\n"
13400                "    {\n"
13401                "    case 0:\n"
13402                "    break;\n"
13403                "    case 1:\n"
13404                "      {\n"
13405                "      break;\n"
13406                "      }\n"
13407                "    case 2:\n"
13408                "      {\n"
13409                "      }\n"
13410                "    break;\n"
13411                "    default:\n"
13412                "    break;\n"
13413                "    }\n"
13414                "  }\n",
13415                WhitesmithsBraceStyle);
13416 
13417   verifyFormat("void switchTest3(int a)\n"
13418                "  {\n"
13419                "  switch (a)\n"
13420                "    {\n"
13421                "    case 0:\n"
13422                "      {\n"
13423                "      foo(x);\n"
13424                "      }\n"
13425                "    break;\n"
13426                "    default:\n"
13427                "      {\n"
13428                "      foo(1);\n"
13429                "      }\n"
13430                "    break;\n"
13431                "    }\n"
13432                "  }\n",
13433                WhitesmithsBraceStyle);
13434 
13435   WhitesmithsBraceStyle.IndentCaseBlocks = false;
13436 
13437   verifyFormat("void switchTest4(int a)\n"
13438                "  {\n"
13439                "  switch (a)\n"
13440                "    {\n"
13441                "    case 2:\n"
13442                "    {\n"
13443                "    }\n"
13444                "    break;\n"
13445                "    }\n"
13446                "  }\n",
13447                WhitesmithsBraceStyle);
13448 
13449   verifyFormat("void switchTest5(int a)\n"
13450                "  {\n"
13451                "  switch (a)\n"
13452                "    {\n"
13453                "    case 0:\n"
13454                "    break;\n"
13455                "    case 1:\n"
13456                "    {\n"
13457                "    foo();\n"
13458                "    break;\n"
13459                "    }\n"
13460                "    case 2:\n"
13461                "    {\n"
13462                "    }\n"
13463                "    break;\n"
13464                "    default:\n"
13465                "    break;\n"
13466                "    }\n"
13467                "  }\n",
13468                WhitesmithsBraceStyle);
13469 
13470   verifyFormat("void switchTest6(int a)\n"
13471                "  {\n"
13472                "  switch (a)\n"
13473                "    {\n"
13474                "    case 0:\n"
13475                "    {\n"
13476                "    foo(x);\n"
13477                "    }\n"
13478                "    break;\n"
13479                "    default:\n"
13480                "    {\n"
13481                "    foo(1);\n"
13482                "    }\n"
13483                "    break;\n"
13484                "    }\n"
13485                "  }\n",
13486                WhitesmithsBraceStyle);
13487 
13488   verifyFormat("enum X\n"
13489                "  {\n"
13490                "  Y = 0, // testing\n"
13491                "  }\n",
13492                WhitesmithsBraceStyle);
13493 
13494   verifyFormat("enum X\n"
13495                "  {\n"
13496                "  Y = 0\n"
13497                "  }\n",
13498                WhitesmithsBraceStyle);
13499   verifyFormat("enum X\n"
13500                "  {\n"
13501                "  Y = 0,\n"
13502                "  Z = 1\n"
13503                "  };\n",
13504                WhitesmithsBraceStyle);
13505 
13506   verifyFormat("@interface BSApplicationController ()\n"
13507                "  {\n"
13508                "@private\n"
13509                "  id _extraIvar;\n"
13510                "  }\n"
13511                "@end\n",
13512                WhitesmithsBraceStyle);
13513 
13514   verifyFormat("#ifdef _DEBUG\n"
13515                "int foo(int i = 0)\n"
13516                "#else\n"
13517                "int foo(int i = 5)\n"
13518                "#endif\n"
13519                "  {\n"
13520                "  return i;\n"
13521                "  }",
13522                WhitesmithsBraceStyle);
13523 
13524   verifyFormat("void foo() {}\n"
13525                "void bar()\n"
13526                "#ifdef _DEBUG\n"
13527                "  {\n"
13528                "  foo();\n"
13529                "  }\n"
13530                "#else\n"
13531                "  {\n"
13532                "  }\n"
13533                "#endif",
13534                WhitesmithsBraceStyle);
13535 
13536   verifyFormat("void foobar()\n"
13537                "  {\n"
13538                "  int i = 5;\n"
13539                "  }\n"
13540                "#ifdef _DEBUG\n"
13541                "void bar()\n"
13542                "  {\n"
13543                "  }\n"
13544                "#else\n"
13545                "void bar()\n"
13546                "  {\n"
13547                "  foobar();\n"
13548                "  }\n"
13549                "#endif",
13550                WhitesmithsBraceStyle);
13551 
13552   // This shouldn't affect ObjC blocks..
13553   verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
13554                "  // ...\n"
13555                "  int i;\n"
13556                "}];",
13557                WhitesmithsBraceStyle);
13558   verifyFormat("void (^block)(void) = ^{\n"
13559                "  // ...\n"
13560                "  int i;\n"
13561                "};",
13562                WhitesmithsBraceStyle);
13563   // .. or dict literals.
13564   verifyFormat("void f()\n"
13565                "  {\n"
13566                "  [object someMethod:@{@\"a\" : @\"b\"}];\n"
13567                "  }",
13568                WhitesmithsBraceStyle);
13569 
13570   verifyFormat("int f()\n"
13571                "  { // comment\n"
13572                "  return 42;\n"
13573                "  }",
13574                WhitesmithsBraceStyle);
13575 
13576   FormatStyle BreakBeforeBraceShortIfs = WhitesmithsBraceStyle;
13577   BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine =
13578       FormatStyle::SIS_Always;
13579   BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
13580   verifyFormat("void f(bool b)\n"
13581                "  {\n"
13582                "  if (b)\n"
13583                "    {\n"
13584                "    return;\n"
13585                "    }\n"
13586                "  }\n",
13587                BreakBeforeBraceShortIfs);
13588   verifyFormat("void f(bool b)\n"
13589                "  {\n"
13590                "  if (b) return;\n"
13591                "  }\n",
13592                BreakBeforeBraceShortIfs);
13593   verifyFormat("void f(bool b)\n"
13594                "  {\n"
13595                "  while (b)\n"
13596                "    {\n"
13597                "    return;\n"
13598                "    }\n"
13599                "  }\n",
13600                BreakBeforeBraceShortIfs);
13601 }
13602 
13603 TEST_F(FormatTest, GNUBraceBreaking) {
13604   FormatStyle GNUBraceStyle = getLLVMStyle();
13605   GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
13606   verifyFormat("namespace a\n"
13607                "{\n"
13608                "class A\n"
13609                "{\n"
13610                "  void f()\n"
13611                "  {\n"
13612                "    int a;\n"
13613                "    {\n"
13614                "      int b;\n"
13615                "    }\n"
13616                "    if (true)\n"
13617                "      {\n"
13618                "        a();\n"
13619                "        b();\n"
13620                "      }\n"
13621                "  }\n"
13622                "  void g() { return; }\n"
13623                "}\n"
13624                "} // namespace a",
13625                GNUBraceStyle);
13626 
13627   verifyFormat("void f()\n"
13628                "{\n"
13629                "  if (true)\n"
13630                "    {\n"
13631                "      a();\n"
13632                "    }\n"
13633                "  else if (false)\n"
13634                "    {\n"
13635                "      b();\n"
13636                "    }\n"
13637                "  else\n"
13638                "    {\n"
13639                "      c();\n"
13640                "    }\n"
13641                "}\n",
13642                GNUBraceStyle);
13643 
13644   verifyFormat("void f()\n"
13645                "{\n"
13646                "  for (int i = 0; i < 10; ++i)\n"
13647                "    {\n"
13648                "      a();\n"
13649                "    }\n"
13650                "  while (false)\n"
13651                "    {\n"
13652                "      b();\n"
13653                "    }\n"
13654                "  do\n"
13655                "    {\n"
13656                "      c();\n"
13657                "    }\n"
13658                "  while (false);\n"
13659                "}\n",
13660                GNUBraceStyle);
13661 
13662   verifyFormat("void f(int a)\n"
13663                "{\n"
13664                "  switch (a)\n"
13665                "    {\n"
13666                "    case 0:\n"
13667                "      break;\n"
13668                "    case 1:\n"
13669                "      {\n"
13670                "        break;\n"
13671                "      }\n"
13672                "    case 2:\n"
13673                "      {\n"
13674                "      }\n"
13675                "      break;\n"
13676                "    default:\n"
13677                "      break;\n"
13678                "    }\n"
13679                "}\n",
13680                GNUBraceStyle);
13681 
13682   verifyFormat("enum X\n"
13683                "{\n"
13684                "  Y = 0,\n"
13685                "}\n",
13686                GNUBraceStyle);
13687 
13688   verifyFormat("@interface BSApplicationController ()\n"
13689                "{\n"
13690                "@private\n"
13691                "  id _extraIvar;\n"
13692                "}\n"
13693                "@end\n",
13694                GNUBraceStyle);
13695 
13696   verifyFormat("#ifdef _DEBUG\n"
13697                "int foo(int i = 0)\n"
13698                "#else\n"
13699                "int foo(int i = 5)\n"
13700                "#endif\n"
13701                "{\n"
13702                "  return i;\n"
13703                "}",
13704                GNUBraceStyle);
13705 
13706   verifyFormat("void foo() {}\n"
13707                "void bar()\n"
13708                "#ifdef _DEBUG\n"
13709                "{\n"
13710                "  foo();\n"
13711                "}\n"
13712                "#else\n"
13713                "{\n"
13714                "}\n"
13715                "#endif",
13716                GNUBraceStyle);
13717 
13718   verifyFormat("void foobar() { int i = 5; }\n"
13719                "#ifdef _DEBUG\n"
13720                "void bar() {}\n"
13721                "#else\n"
13722                "void bar() { foobar(); }\n"
13723                "#endif",
13724                GNUBraceStyle);
13725 }
13726 
13727 TEST_F(FormatTest, WebKitBraceBreaking) {
13728   FormatStyle WebKitBraceStyle = getLLVMStyle();
13729   WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
13730   WebKitBraceStyle.FixNamespaceComments = false;
13731   verifyFormat("namespace a {\n"
13732                "class A {\n"
13733                "  void f()\n"
13734                "  {\n"
13735                "    if (true) {\n"
13736                "      a();\n"
13737                "      b();\n"
13738                "    }\n"
13739                "  }\n"
13740                "  void g() { return; }\n"
13741                "};\n"
13742                "enum E {\n"
13743                "  A,\n"
13744                "  // foo\n"
13745                "  B,\n"
13746                "  C\n"
13747                "};\n"
13748                "struct B {\n"
13749                "  int x;\n"
13750                "};\n"
13751                "}\n",
13752                WebKitBraceStyle);
13753   verifyFormat("struct S {\n"
13754                "  int Type;\n"
13755                "  union {\n"
13756                "    int x;\n"
13757                "    double y;\n"
13758                "  } Value;\n"
13759                "  class C {\n"
13760                "    MyFavoriteType Value;\n"
13761                "  } Class;\n"
13762                "};\n",
13763                WebKitBraceStyle);
13764 }
13765 
13766 TEST_F(FormatTest, CatchExceptionReferenceBinding) {
13767   verifyFormat("void f() {\n"
13768                "  try {\n"
13769                "  } catch (const Exception &e) {\n"
13770                "  }\n"
13771                "}\n",
13772                getLLVMStyle());
13773 }
13774 
13775 TEST_F(FormatTest, UnderstandsPragmas) {
13776   verifyFormat("#pragma omp reduction(| : var)");
13777   verifyFormat("#pragma omp reduction(+ : var)");
13778 
13779   EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
13780             "(including parentheses).",
13781             format("#pragma    mark   Any non-hyphenated or hyphenated string "
13782                    "(including parentheses)."));
13783 }
13784 
13785 TEST_F(FormatTest, UnderstandPragmaOption) {
13786   verifyFormat("#pragma option -C -A");
13787 
13788   EXPECT_EQ("#pragma option -C -A", format("#pragma    option   -C   -A"));
13789 }
13790 
13791 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
13792   FormatStyle Style = getLLVMStyle();
13793   Style.ColumnLimit = 20;
13794 
13795   // See PR41213
13796   EXPECT_EQ("/*\n"
13797             " *\t9012345\n"
13798             " * /8901\n"
13799             " */",
13800             format("/*\n"
13801                    " *\t9012345 /8901\n"
13802                    " */",
13803                    Style));
13804   EXPECT_EQ("/*\n"
13805             " *345678\n"
13806             " *\t/8901\n"
13807             " */",
13808             format("/*\n"
13809                    " *345678\t/8901\n"
13810                    " */",
13811                    Style));
13812 
13813   verifyFormat("int a; // the\n"
13814                "       // comment",
13815                Style);
13816   EXPECT_EQ("int a; /* first line\n"
13817             "        * second\n"
13818             "        * line third\n"
13819             "        * line\n"
13820             "        */",
13821             format("int a; /* first line\n"
13822                    "        * second\n"
13823                    "        * line third\n"
13824                    "        * line\n"
13825                    "        */",
13826                    Style));
13827   EXPECT_EQ("int a; // first line\n"
13828             "       // second\n"
13829             "       // line third\n"
13830             "       // line",
13831             format("int a; // first line\n"
13832                    "       // second line\n"
13833                    "       // third line",
13834                    Style));
13835 
13836   Style.PenaltyExcessCharacter = 90;
13837   verifyFormat("int a; // the comment", Style);
13838   EXPECT_EQ("int a; // the comment\n"
13839             "       // aaa",
13840             format("int a; // the comment aaa", Style));
13841   EXPECT_EQ("int a; /* first line\n"
13842             "        * second line\n"
13843             "        * third line\n"
13844             "        */",
13845             format("int a; /* first line\n"
13846                    "        * second line\n"
13847                    "        * third line\n"
13848                    "        */",
13849                    Style));
13850   EXPECT_EQ("int a; // first line\n"
13851             "       // second line\n"
13852             "       // third line",
13853             format("int a; // first line\n"
13854                    "       // second line\n"
13855                    "       // third line",
13856                    Style));
13857   // FIXME: Investigate why this is not getting the same layout as the test
13858   // above.
13859   EXPECT_EQ("int a; /* first line\n"
13860             "        * second line\n"
13861             "        * third line\n"
13862             "        */",
13863             format("int a; /* first line second line third line"
13864                    "\n*/",
13865                    Style));
13866 
13867   EXPECT_EQ("// foo bar baz bazfoo\n"
13868             "// foo bar foo bar\n",
13869             format("// foo bar baz bazfoo\n"
13870                    "// foo bar foo           bar\n",
13871                    Style));
13872   EXPECT_EQ("// foo bar baz bazfoo\n"
13873             "// foo bar foo bar\n",
13874             format("// foo bar baz      bazfoo\n"
13875                    "// foo            bar foo bar\n",
13876                    Style));
13877 
13878   // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
13879   // next one.
13880   EXPECT_EQ("// foo bar baz bazfoo\n"
13881             "// bar foo bar\n",
13882             format("// foo bar baz      bazfoo bar\n"
13883                    "// foo            bar\n",
13884                    Style));
13885 
13886   EXPECT_EQ("// foo bar baz bazfoo\n"
13887             "// foo bar baz bazfoo\n"
13888             "// bar foo bar\n",
13889             format("// foo bar baz      bazfoo\n"
13890                    "// foo bar baz      bazfoo bar\n"
13891                    "// foo bar\n",
13892                    Style));
13893 
13894   EXPECT_EQ("// foo bar baz bazfoo\n"
13895             "// foo bar baz bazfoo\n"
13896             "// bar foo bar\n",
13897             format("// foo bar baz      bazfoo\n"
13898                    "// foo bar baz      bazfoo bar\n"
13899                    "// foo           bar\n",
13900                    Style));
13901 
13902   // Make sure we do not keep protruding characters if strict mode reflow is
13903   // cheaper than keeping protruding characters.
13904   Style.ColumnLimit = 21;
13905   EXPECT_EQ(
13906       "// foo foo foo foo\n"
13907       "// foo foo foo foo\n"
13908       "// foo foo foo foo\n",
13909       format("// foo foo foo foo foo foo foo foo foo foo foo foo\n", Style));
13910 
13911   EXPECT_EQ("int a = /* long block\n"
13912             "           comment */\n"
13913             "    42;",
13914             format("int a = /* long block comment */ 42;", Style));
13915 }
13916 
13917 #define EXPECT_ALL_STYLES_EQUAL(Styles)                                        \
13918   for (size_t i = 1; i < Styles.size(); ++i)                                   \
13919   EXPECT_EQ(Styles[0], Styles[i])                                              \
13920       << "Style #" << i << " of " << Styles.size() << " differs from Style #0"
13921 
13922 TEST_F(FormatTest, GetsPredefinedStyleByName) {
13923   SmallVector<FormatStyle, 3> Styles;
13924   Styles.resize(3);
13925 
13926   Styles[0] = getLLVMStyle();
13927   EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
13928   EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
13929   EXPECT_ALL_STYLES_EQUAL(Styles);
13930 
13931   Styles[0] = getGoogleStyle();
13932   EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
13933   EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
13934   EXPECT_ALL_STYLES_EQUAL(Styles);
13935 
13936   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
13937   EXPECT_TRUE(
13938       getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
13939   EXPECT_TRUE(
13940       getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
13941   EXPECT_ALL_STYLES_EQUAL(Styles);
13942 
13943   Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
13944   EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
13945   EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
13946   EXPECT_ALL_STYLES_EQUAL(Styles);
13947 
13948   Styles[0] = getMozillaStyle();
13949   EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
13950   EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
13951   EXPECT_ALL_STYLES_EQUAL(Styles);
13952 
13953   Styles[0] = getWebKitStyle();
13954   EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
13955   EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
13956   EXPECT_ALL_STYLES_EQUAL(Styles);
13957 
13958   Styles[0] = getGNUStyle();
13959   EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
13960   EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
13961   EXPECT_ALL_STYLES_EQUAL(Styles);
13962 
13963   EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
13964 }
13965 
13966 TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
13967   SmallVector<FormatStyle, 8> Styles;
13968   Styles.resize(2);
13969 
13970   Styles[0] = getGoogleStyle();
13971   Styles[1] = getLLVMStyle();
13972   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
13973   EXPECT_ALL_STYLES_EQUAL(Styles);
13974 
13975   Styles.resize(5);
13976   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
13977   Styles[1] = getLLVMStyle();
13978   Styles[1].Language = FormatStyle::LK_JavaScript;
13979   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
13980 
13981   Styles[2] = getLLVMStyle();
13982   Styles[2].Language = FormatStyle::LK_JavaScript;
13983   EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
13984                                   "BasedOnStyle: Google",
13985                                   &Styles[2])
13986                    .value());
13987 
13988   Styles[3] = getLLVMStyle();
13989   Styles[3].Language = FormatStyle::LK_JavaScript;
13990   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
13991                                   "Language: JavaScript",
13992                                   &Styles[3])
13993                    .value());
13994 
13995   Styles[4] = getLLVMStyle();
13996   Styles[4].Language = FormatStyle::LK_JavaScript;
13997   EXPECT_EQ(0, parseConfiguration("---\n"
13998                                   "BasedOnStyle: LLVM\n"
13999                                   "IndentWidth: 123\n"
14000                                   "---\n"
14001                                   "BasedOnStyle: Google\n"
14002                                   "Language: JavaScript",
14003                                   &Styles[4])
14004                    .value());
14005   EXPECT_ALL_STYLES_EQUAL(Styles);
14006 }
14007 
14008 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME)                             \
14009   Style.FIELD = false;                                                         \
14010   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value());      \
14011   EXPECT_TRUE(Style.FIELD);                                                    \
14012   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value());     \
14013   EXPECT_FALSE(Style.FIELD);
14014 
14015 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
14016 
14017 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME)              \
14018   Style.STRUCT.FIELD = false;                                                  \
14019   EXPECT_EQ(0,                                                                 \
14020             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": true", &Style)   \
14021                 .value());                                                     \
14022   EXPECT_TRUE(Style.STRUCT.FIELD);                                             \
14023   EXPECT_EQ(0,                                                                 \
14024             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": false", &Style)  \
14025                 .value());                                                     \
14026   EXPECT_FALSE(Style.STRUCT.FIELD);
14027 
14028 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD)                                 \
14029   CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
14030 
14031 #define CHECK_PARSE(TEXT, FIELD, VALUE)                                        \
14032   EXPECT_NE(VALUE, Style.FIELD) << "Initial value already the same!";          \
14033   EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value());                      \
14034   EXPECT_EQ(VALUE, Style.FIELD) << "Unexpected value after parsing!"
14035 
14036 TEST_F(FormatTest, ParsesConfigurationBools) {
14037   FormatStyle Style = {};
14038   Style.Language = FormatStyle::LK_Cpp;
14039   CHECK_PARSE_BOOL(AlignTrailingComments);
14040   CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
14041   CHECK_PARSE_BOOL(AlignConsecutiveBitFields);
14042   CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
14043   CHECK_PARSE_BOOL(AlignConsecutiveMacros);
14044   CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine);
14045   CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine);
14046   CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
14047   CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
14048   CHECK_PARSE_BOOL(AllowShortEnumsOnASingleLine);
14049   CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
14050   CHECK_PARSE_BOOL(BinPackArguments);
14051   CHECK_PARSE_BOOL(BinPackParameters);
14052   CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
14053   CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
14054   CHECK_PARSE_BOOL(BreakStringLiterals);
14055   CHECK_PARSE_BOOL(CompactNamespaces);
14056   CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
14057   CHECK_PARSE_BOOL(DeriveLineEnding);
14058   CHECK_PARSE_BOOL(DerivePointerAlignment);
14059   CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
14060   CHECK_PARSE_BOOL(DisableFormat);
14061   CHECK_PARSE_BOOL(IndentCaseLabels);
14062   CHECK_PARSE_BOOL(IndentCaseBlocks);
14063   CHECK_PARSE_BOOL(IndentGotoLabels);
14064   CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
14065   CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
14066   CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
14067   CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
14068   CHECK_PARSE_BOOL(Cpp11BracedListStyle);
14069   CHECK_PARSE_BOOL(ReflowComments);
14070   CHECK_PARSE_BOOL(SortIncludes);
14071   CHECK_PARSE_BOOL(SortUsingDeclarations);
14072   CHECK_PARSE_BOOL(SpacesInParentheses);
14073   CHECK_PARSE_BOOL(SpacesInSquareBrackets);
14074   CHECK_PARSE_BOOL(SpacesInAngles);
14075   CHECK_PARSE_BOOL(SpacesInConditionalStatement);
14076   CHECK_PARSE_BOOL(SpaceInEmptyBlock);
14077   CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
14078   CHECK_PARSE_BOOL(SpacesInContainerLiterals);
14079   CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
14080   CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
14081   CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
14082   CHECK_PARSE_BOOL(SpaceAfterLogicalNot);
14083   CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
14084   CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList);
14085   CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon);
14086   CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon);
14087   CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon);
14088   CHECK_PARSE_BOOL(SpaceBeforeSquareBrackets);
14089   CHECK_PARSE_BOOL(UseCRLF);
14090 
14091   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel);
14092   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
14093   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
14094   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
14095   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
14096   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
14097   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
14098   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
14099   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
14100   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
14101   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
14102   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeLambdaBody);
14103   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeWhile);
14104   CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
14105   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
14106   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
14107   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
14108 }
14109 
14110 #undef CHECK_PARSE_BOOL
14111 
14112 TEST_F(FormatTest, ParsesConfiguration) {
14113   FormatStyle Style = {};
14114   Style.Language = FormatStyle::LK_Cpp;
14115   CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
14116   CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
14117               ConstructorInitializerIndentWidth, 1234u);
14118   CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
14119   CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
14120   CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
14121   CHECK_PARSE("PenaltyBreakAssignment: 1234", PenaltyBreakAssignment, 1234u);
14122   CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
14123               PenaltyBreakBeforeFirstCallParameter, 1234u);
14124   CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234",
14125               PenaltyBreakTemplateDeclaration, 1234u);
14126   CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
14127   CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
14128               PenaltyReturnTypeOnItsOwnLine, 1234u);
14129   CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
14130               SpacesBeforeTrailingComments, 1234u);
14131   CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
14132   CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
14133   CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
14134 
14135   Style.PointerAlignment = FormatStyle::PAS_Middle;
14136   CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
14137               FormatStyle::PAS_Left);
14138   CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
14139               FormatStyle::PAS_Right);
14140   CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
14141               FormatStyle::PAS_Middle);
14142   // For backward compatibility:
14143   CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
14144               FormatStyle::PAS_Left);
14145   CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
14146               FormatStyle::PAS_Right);
14147   CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
14148               FormatStyle::PAS_Middle);
14149 
14150   Style.Standard = FormatStyle::LS_Auto;
14151   CHECK_PARSE("Standard: c++03", Standard, FormatStyle::LS_Cpp03);
14152   CHECK_PARSE("Standard: c++11", Standard, FormatStyle::LS_Cpp11);
14153   CHECK_PARSE("Standard: c++14", Standard, FormatStyle::LS_Cpp14);
14154   CHECK_PARSE("Standard: c++17", Standard, FormatStyle::LS_Cpp17);
14155   CHECK_PARSE("Standard: c++20", Standard, FormatStyle::LS_Cpp20);
14156   CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
14157   CHECK_PARSE("Standard: Latest", Standard, FormatStyle::LS_Latest);
14158   // Legacy aliases:
14159   CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
14160   CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Latest);
14161   CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
14162   CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
14163 
14164   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
14165   CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
14166               BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
14167   CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
14168               FormatStyle::BOS_None);
14169   CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
14170               FormatStyle::BOS_All);
14171   // For backward compatibility:
14172   CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
14173               FormatStyle::BOS_None);
14174   CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
14175               FormatStyle::BOS_All);
14176 
14177   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
14178   CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
14179               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
14180   CHECK_PARSE("BreakConstructorInitializers: AfterColon",
14181               BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
14182   CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
14183               BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
14184   // For backward compatibility:
14185   CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
14186               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
14187 
14188   Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
14189   CHECK_PARSE("BreakInheritanceList: BeforeComma", BreakInheritanceList,
14190               FormatStyle::BILS_BeforeComma);
14191   CHECK_PARSE("BreakInheritanceList: AfterColon", BreakInheritanceList,
14192               FormatStyle::BILS_AfterColon);
14193   CHECK_PARSE("BreakInheritanceList: BeforeColon", BreakInheritanceList,
14194               FormatStyle::BILS_BeforeColon);
14195   // For backward compatibility:
14196   CHECK_PARSE("BreakBeforeInheritanceComma: true", BreakInheritanceList,
14197               FormatStyle::BILS_BeforeComma);
14198 
14199   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
14200   CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
14201               FormatStyle::BAS_Align);
14202   CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
14203               FormatStyle::BAS_DontAlign);
14204   CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
14205               FormatStyle::BAS_AlwaysBreak);
14206   // For backward compatibility:
14207   CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
14208               FormatStyle::BAS_DontAlign);
14209   CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
14210               FormatStyle::BAS_Align);
14211 
14212   Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
14213   CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
14214               FormatStyle::ENAS_DontAlign);
14215   CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
14216               FormatStyle::ENAS_Left);
14217   CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
14218               FormatStyle::ENAS_Right);
14219   // For backward compatibility:
14220   CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
14221               FormatStyle::ENAS_Left);
14222   CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
14223               FormatStyle::ENAS_Right);
14224 
14225   Style.AlignOperands = FormatStyle::OAS_Align;
14226   CHECK_PARSE("AlignOperands: DontAlign", AlignOperands,
14227               FormatStyle::OAS_DontAlign);
14228   CHECK_PARSE("AlignOperands: Align", AlignOperands, FormatStyle::OAS_Align);
14229   CHECK_PARSE("AlignOperands: AlignAfterOperator", AlignOperands,
14230               FormatStyle::OAS_AlignAfterOperator);
14231   // For backward compatibility:
14232   CHECK_PARSE("AlignOperands: false", AlignOperands,
14233               FormatStyle::OAS_DontAlign);
14234   CHECK_PARSE("AlignOperands: true", AlignOperands, FormatStyle::OAS_Align);
14235 
14236   Style.UseTab = FormatStyle::UT_ForIndentation;
14237   CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
14238   CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
14239   CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
14240   CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
14241               FormatStyle::UT_ForContinuationAndIndentation);
14242   CHECK_PARSE("UseTab: AlignWithSpaces", UseTab,
14243               FormatStyle::UT_AlignWithSpaces);
14244   // For backward compatibility:
14245   CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
14246   CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
14247 
14248   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty;
14249   CHECK_PARSE("AllowShortBlocksOnASingleLine: Never",
14250               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never);
14251   CHECK_PARSE("AllowShortBlocksOnASingleLine: Empty",
14252               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Empty);
14253   CHECK_PARSE("AllowShortBlocksOnASingleLine: Always",
14254               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always);
14255   // For backward compatibility:
14256   CHECK_PARSE("AllowShortBlocksOnASingleLine: false",
14257               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never);
14258   CHECK_PARSE("AllowShortBlocksOnASingleLine: true",
14259               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always);
14260 
14261   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
14262   CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
14263               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
14264   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
14265               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
14266   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
14267               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
14268   CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
14269               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
14270   // For backward compatibility:
14271   CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
14272               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
14273   CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
14274               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
14275 
14276   Style.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Both;
14277   CHECK_PARSE("SpaceAroundPointerQualifiers: Default",
14278               SpaceAroundPointerQualifiers, FormatStyle::SAPQ_Default);
14279   CHECK_PARSE("SpaceAroundPointerQualifiers: Before",
14280               SpaceAroundPointerQualifiers, FormatStyle::SAPQ_Before);
14281   CHECK_PARSE("SpaceAroundPointerQualifiers: After",
14282               SpaceAroundPointerQualifiers, FormatStyle::SAPQ_After);
14283   CHECK_PARSE("SpaceAroundPointerQualifiers: Both",
14284               SpaceAroundPointerQualifiers, FormatStyle::SAPQ_Both);
14285 
14286   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
14287   CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
14288               FormatStyle::SBPO_Never);
14289   CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
14290               FormatStyle::SBPO_Always);
14291   CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
14292               FormatStyle::SBPO_ControlStatements);
14293   CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens,
14294               FormatStyle::SBPO_NonEmptyParentheses);
14295   // For backward compatibility:
14296   CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
14297               FormatStyle::SBPO_Never);
14298   CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
14299               FormatStyle::SBPO_ControlStatements);
14300 
14301   Style.ColumnLimit = 123;
14302   FormatStyle BaseStyle = getLLVMStyle();
14303   CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
14304   CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
14305 
14306   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
14307   CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
14308               FormatStyle::BS_Attach);
14309   CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
14310               FormatStyle::BS_Linux);
14311   CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
14312               FormatStyle::BS_Mozilla);
14313   CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
14314               FormatStyle::BS_Stroustrup);
14315   CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
14316               FormatStyle::BS_Allman);
14317   CHECK_PARSE("BreakBeforeBraces: Whitesmiths", BreakBeforeBraces,
14318               FormatStyle::BS_Whitesmiths);
14319   CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
14320   CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
14321               FormatStyle::BS_WebKit);
14322   CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
14323               FormatStyle::BS_Custom);
14324 
14325   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Never;
14326   CHECK_PARSE("BraceWrapping:\n"
14327               "  AfterControlStatement: MultiLine",
14328               BraceWrapping.AfterControlStatement,
14329               FormatStyle::BWACS_MultiLine);
14330   CHECK_PARSE("BraceWrapping:\n"
14331               "  AfterControlStatement: Always",
14332               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always);
14333   CHECK_PARSE("BraceWrapping:\n"
14334               "  AfterControlStatement: Never",
14335               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never);
14336   // For backward compatibility:
14337   CHECK_PARSE("BraceWrapping:\n"
14338               "  AfterControlStatement: true",
14339               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always);
14340   CHECK_PARSE("BraceWrapping:\n"
14341               "  AfterControlStatement: false",
14342               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never);
14343 
14344   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
14345   CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
14346               FormatStyle::RTBS_None);
14347   CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
14348               FormatStyle::RTBS_All);
14349   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
14350               AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
14351   CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
14352               AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
14353   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
14354               AlwaysBreakAfterReturnType,
14355               FormatStyle::RTBS_TopLevelDefinitions);
14356 
14357   Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
14358   CHECK_PARSE("AlwaysBreakTemplateDeclarations: No",
14359               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_No);
14360   CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine",
14361               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine);
14362   CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes",
14363               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes);
14364   CHECK_PARSE("AlwaysBreakTemplateDeclarations: false",
14365               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine);
14366   CHECK_PARSE("AlwaysBreakTemplateDeclarations: true",
14367               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes);
14368 
14369   Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
14370   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
14371               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
14372   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
14373               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
14374   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
14375               AlwaysBreakAfterDefinitionReturnType,
14376               FormatStyle::DRTBS_TopLevel);
14377 
14378   Style.NamespaceIndentation = FormatStyle::NI_All;
14379   CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
14380               FormatStyle::NI_None);
14381   CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
14382               FormatStyle::NI_Inner);
14383   CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
14384               FormatStyle::NI_All);
14385 
14386   Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always;
14387   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never",
14388               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
14389   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse",
14390               AllowShortIfStatementsOnASingleLine,
14391               FormatStyle::SIS_WithoutElse);
14392   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always",
14393               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always);
14394   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false",
14395               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
14396   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true",
14397               AllowShortIfStatementsOnASingleLine,
14398               FormatStyle::SIS_WithoutElse);
14399 
14400   Style.IndentExternBlock = FormatStyle::IEBS_NoIndent;
14401   CHECK_PARSE("IndentExternBlock: AfterExternBlock", IndentExternBlock,
14402               FormatStyle::IEBS_AfterExternBlock);
14403   CHECK_PARSE("IndentExternBlock: Indent", IndentExternBlock,
14404               FormatStyle::IEBS_Indent);
14405   CHECK_PARSE("IndentExternBlock: NoIndent", IndentExternBlock,
14406               FormatStyle::IEBS_NoIndent);
14407   CHECK_PARSE("IndentExternBlock: true", IndentExternBlock,
14408               FormatStyle::IEBS_Indent);
14409   CHECK_PARSE("IndentExternBlock: false", IndentExternBlock,
14410               FormatStyle::IEBS_NoIndent);
14411 
14412   Style.BitFieldColonSpacing = FormatStyle::BFCS_None;
14413   CHECK_PARSE("BitFieldColonSpacing: Both", BitFieldColonSpacing,
14414               FormatStyle::BFCS_Both);
14415   CHECK_PARSE("BitFieldColonSpacing: None", BitFieldColonSpacing,
14416               FormatStyle::BFCS_None);
14417   CHECK_PARSE("BitFieldColonSpacing: Before", BitFieldColonSpacing,
14418               FormatStyle::BFCS_Before);
14419   CHECK_PARSE("BitFieldColonSpacing: After", BitFieldColonSpacing,
14420               FormatStyle::BFCS_After);
14421 
14422   Style.SortJavaStaticImport = FormatStyle::SJSIO_Before;
14423   CHECK_PARSE("SortJavaStaticImport: After", SortJavaStaticImport,
14424               FormatStyle::SJSIO_After);
14425   CHECK_PARSE("SortJavaStaticImport: Before", SortJavaStaticImport,
14426               FormatStyle::SJSIO_Before);
14427 
14428   // FIXME: This is required because parsing a configuration simply overwrites
14429   // the first N elements of the list instead of resetting it.
14430   Style.ForEachMacros.clear();
14431   std::vector<std::string> BoostForeach;
14432   BoostForeach.push_back("BOOST_FOREACH");
14433   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
14434   std::vector<std::string> BoostAndQForeach;
14435   BoostAndQForeach.push_back("BOOST_FOREACH");
14436   BoostAndQForeach.push_back("Q_FOREACH");
14437   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
14438               BoostAndQForeach);
14439 
14440   Style.AttributeMacros.clear();
14441   CHECK_PARSE("BasedOnStyle: LLVM", AttributeMacros,
14442               std::vector<std::string>{"__capability"});
14443   CHECK_PARSE("AttributeMacros: [attr1, attr2]", AttributeMacros,
14444               std::vector<std::string>({"attr1", "attr2"}));
14445 
14446   Style.StatementMacros.clear();
14447   CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros,
14448               std::vector<std::string>{"QUNUSED"});
14449   CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros,
14450               std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"}));
14451 
14452   Style.NamespaceMacros.clear();
14453   CHECK_PARSE("NamespaceMacros: [TESTSUITE]", NamespaceMacros,
14454               std::vector<std::string>{"TESTSUITE"});
14455   CHECK_PARSE("NamespaceMacros: [TESTSUITE, SUITE]", NamespaceMacros,
14456               std::vector<std::string>({"TESTSUITE", "SUITE"}));
14457 
14458   Style.WhitespaceSensitiveMacros.clear();
14459   CHECK_PARSE("WhitespaceSensitiveMacros: [STRINGIZE]",
14460               WhitespaceSensitiveMacros, std::vector<std::string>{"STRINGIZE"});
14461   CHECK_PARSE("WhitespaceSensitiveMacros: [STRINGIZE, ASSERT]",
14462               WhitespaceSensitiveMacros,
14463               std::vector<std::string>({"STRINGIZE", "ASSERT"}));
14464   Style.WhitespaceSensitiveMacros.clear();
14465   CHECK_PARSE("WhitespaceSensitiveMacros: ['STRINGIZE']",
14466               WhitespaceSensitiveMacros, std::vector<std::string>{"STRINGIZE"});
14467   CHECK_PARSE("WhitespaceSensitiveMacros: ['STRINGIZE', 'ASSERT']",
14468               WhitespaceSensitiveMacros,
14469               std::vector<std::string>({"STRINGIZE", "ASSERT"}));
14470 
14471   Style.IncludeStyle.IncludeCategories.clear();
14472   std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = {
14473       {"abc/.*", 2, 0}, {".*", 1, 0}};
14474   CHECK_PARSE("IncludeCategories:\n"
14475               "  - Regex: abc/.*\n"
14476               "    Priority: 2\n"
14477               "  - Regex: .*\n"
14478               "    Priority: 1",
14479               IncludeStyle.IncludeCategories, ExpectedCategories);
14480   CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex,
14481               "abc$");
14482   CHECK_PARSE("IncludeIsMainSourceRegex: 'abc$'",
14483               IncludeStyle.IncludeIsMainSourceRegex, "abc$");
14484 
14485   Style.RawStringFormats.clear();
14486   std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
14487       {
14488           FormatStyle::LK_TextProto,
14489           {"pb", "proto"},
14490           {"PARSE_TEXT_PROTO"},
14491           /*CanonicalDelimiter=*/"",
14492           "llvm",
14493       },
14494       {
14495           FormatStyle::LK_Cpp,
14496           {"cc", "cpp"},
14497           {"C_CODEBLOCK", "CPPEVAL"},
14498           /*CanonicalDelimiter=*/"cc",
14499           /*BasedOnStyle=*/"",
14500       },
14501   };
14502 
14503   CHECK_PARSE("RawStringFormats:\n"
14504               "  - Language: TextProto\n"
14505               "    Delimiters:\n"
14506               "      - 'pb'\n"
14507               "      - 'proto'\n"
14508               "    EnclosingFunctions:\n"
14509               "      - 'PARSE_TEXT_PROTO'\n"
14510               "    BasedOnStyle: llvm\n"
14511               "  - Language: Cpp\n"
14512               "    Delimiters:\n"
14513               "      - 'cc'\n"
14514               "      - 'cpp'\n"
14515               "    EnclosingFunctions:\n"
14516               "      - 'C_CODEBLOCK'\n"
14517               "      - 'CPPEVAL'\n"
14518               "    CanonicalDelimiter: 'cc'",
14519               RawStringFormats, ExpectedRawStringFormats);
14520 }
14521 
14522 TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
14523   FormatStyle Style = {};
14524   Style.Language = FormatStyle::LK_Cpp;
14525   CHECK_PARSE("Language: Cpp\n"
14526               "IndentWidth: 12",
14527               IndentWidth, 12u);
14528   EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
14529                                "IndentWidth: 34",
14530                                &Style),
14531             ParseError::Unsuitable);
14532   FormatStyle BinPackedTCS = {};
14533   BinPackedTCS.Language = FormatStyle::LK_JavaScript;
14534   EXPECT_EQ(parseConfiguration("BinPackArguments: true\n"
14535                                "InsertTrailingCommas: Wrapped",
14536                                &BinPackedTCS),
14537             ParseError::BinPackTrailingCommaConflict);
14538   EXPECT_EQ(12u, Style.IndentWidth);
14539   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
14540   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
14541 
14542   Style.Language = FormatStyle::LK_JavaScript;
14543   CHECK_PARSE("Language: JavaScript\n"
14544               "IndentWidth: 12",
14545               IndentWidth, 12u);
14546   CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
14547   EXPECT_EQ(parseConfiguration("Language: Cpp\n"
14548                                "IndentWidth: 34",
14549                                &Style),
14550             ParseError::Unsuitable);
14551   EXPECT_EQ(23u, Style.IndentWidth);
14552   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
14553   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
14554 
14555   CHECK_PARSE("BasedOnStyle: LLVM\n"
14556               "IndentWidth: 67",
14557               IndentWidth, 67u);
14558 
14559   CHECK_PARSE("---\n"
14560               "Language: JavaScript\n"
14561               "IndentWidth: 12\n"
14562               "---\n"
14563               "Language: Cpp\n"
14564               "IndentWidth: 34\n"
14565               "...\n",
14566               IndentWidth, 12u);
14567 
14568   Style.Language = FormatStyle::LK_Cpp;
14569   CHECK_PARSE("---\n"
14570               "Language: JavaScript\n"
14571               "IndentWidth: 12\n"
14572               "---\n"
14573               "Language: Cpp\n"
14574               "IndentWidth: 34\n"
14575               "...\n",
14576               IndentWidth, 34u);
14577   CHECK_PARSE("---\n"
14578               "IndentWidth: 78\n"
14579               "---\n"
14580               "Language: JavaScript\n"
14581               "IndentWidth: 56\n"
14582               "...\n",
14583               IndentWidth, 78u);
14584 
14585   Style.ColumnLimit = 123;
14586   Style.IndentWidth = 234;
14587   Style.BreakBeforeBraces = FormatStyle::BS_Linux;
14588   Style.TabWidth = 345;
14589   EXPECT_FALSE(parseConfiguration("---\n"
14590                                   "IndentWidth: 456\n"
14591                                   "BreakBeforeBraces: Allman\n"
14592                                   "---\n"
14593                                   "Language: JavaScript\n"
14594                                   "IndentWidth: 111\n"
14595                                   "TabWidth: 111\n"
14596                                   "---\n"
14597                                   "Language: Cpp\n"
14598                                   "BreakBeforeBraces: Stroustrup\n"
14599                                   "TabWidth: 789\n"
14600                                   "...\n",
14601                                   &Style));
14602   EXPECT_EQ(123u, Style.ColumnLimit);
14603   EXPECT_EQ(456u, Style.IndentWidth);
14604   EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
14605   EXPECT_EQ(789u, Style.TabWidth);
14606 
14607   EXPECT_EQ(parseConfiguration("---\n"
14608                                "Language: JavaScript\n"
14609                                "IndentWidth: 56\n"
14610                                "---\n"
14611                                "IndentWidth: 78\n"
14612                                "...\n",
14613                                &Style),
14614             ParseError::Error);
14615   EXPECT_EQ(parseConfiguration("---\n"
14616                                "Language: JavaScript\n"
14617                                "IndentWidth: 56\n"
14618                                "---\n"
14619                                "Language: JavaScript\n"
14620                                "IndentWidth: 78\n"
14621                                "...\n",
14622                                &Style),
14623             ParseError::Error);
14624 
14625   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
14626 }
14627 
14628 #undef CHECK_PARSE
14629 
14630 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
14631   FormatStyle Style = {};
14632   Style.Language = FormatStyle::LK_JavaScript;
14633   Style.BreakBeforeTernaryOperators = true;
14634   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
14635   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
14636 
14637   Style.BreakBeforeTernaryOperators = true;
14638   EXPECT_EQ(0, parseConfiguration("---\n"
14639                                   "BasedOnStyle: Google\n"
14640                                   "---\n"
14641                                   "Language: JavaScript\n"
14642                                   "IndentWidth: 76\n"
14643                                   "...\n",
14644                                   &Style)
14645                    .value());
14646   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
14647   EXPECT_EQ(76u, Style.IndentWidth);
14648   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
14649 }
14650 
14651 TEST_F(FormatTest, ConfigurationRoundTripTest) {
14652   FormatStyle Style = getLLVMStyle();
14653   std::string YAML = configurationAsText(Style);
14654   FormatStyle ParsedStyle = {};
14655   ParsedStyle.Language = FormatStyle::LK_Cpp;
14656   EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
14657   EXPECT_EQ(Style, ParsedStyle);
14658 }
14659 
14660 TEST_F(FormatTest, WorksFor8bitEncodings) {
14661   EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
14662             "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
14663             "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
14664             "\"\xef\xee\xf0\xf3...\"",
14665             format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
14666                    "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
14667                    "\xef\xee\xf0\xf3...\"",
14668                    getLLVMStyleWithColumns(12)));
14669 }
14670 
14671 TEST_F(FormatTest, HandlesUTF8BOM) {
14672   EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
14673   EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
14674             format("\xef\xbb\xbf#include <iostream>"));
14675   EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
14676             format("\xef\xbb\xbf\n#include <iostream>"));
14677 }
14678 
14679 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
14680 #if !defined(_MSC_VER)
14681 
14682 TEST_F(FormatTest, CountsUTF8CharactersProperly) {
14683   verifyFormat("\"Однажды в студёную зимнюю пору...\"",
14684                getLLVMStyleWithColumns(35));
14685   verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
14686                getLLVMStyleWithColumns(31));
14687   verifyFormat("// Однажды в студёную зимнюю пору...",
14688                getLLVMStyleWithColumns(36));
14689   verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
14690   verifyFormat("/* Однажды в студёную зимнюю пору... */",
14691                getLLVMStyleWithColumns(39));
14692   verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
14693                getLLVMStyleWithColumns(35));
14694 }
14695 
14696 TEST_F(FormatTest, SplitsUTF8Strings) {
14697   // Non-printable characters' width is currently considered to be the length in
14698   // bytes in UTF8. The characters can be displayed in very different manner
14699   // (zero-width, single width with a substitution glyph, expanded to their code
14700   // (e.g. "<8d>"), so there's no single correct way to handle them.
14701   EXPECT_EQ("\"aaaaÄ\"\n"
14702             "\"\xc2\x8d\";",
14703             format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
14704   EXPECT_EQ("\"aaaaaaaÄ\"\n"
14705             "\"\xc2\x8d\";",
14706             format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
14707   EXPECT_EQ("\"Однажды, в \"\n"
14708             "\"студёную \"\n"
14709             "\"зимнюю \"\n"
14710             "\"пору,\"",
14711             format("\"Однажды, в студёную зимнюю пору,\"",
14712                    getLLVMStyleWithColumns(13)));
14713   EXPECT_EQ(
14714       "\"一 二 三 \"\n"
14715       "\"四 五六 \"\n"
14716       "\"七 八 九 \"\n"
14717       "\"十\"",
14718       format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
14719   EXPECT_EQ("\"一\t\"\n"
14720             "\"二 \t\"\n"
14721             "\"三 四 \"\n"
14722             "\"五\t\"\n"
14723             "\"六 \t\"\n"
14724             "\"七 \"\n"
14725             "\"八九十\tqq\"",
14726             format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
14727                    getLLVMStyleWithColumns(11)));
14728 
14729   // UTF8 character in an escape sequence.
14730   EXPECT_EQ("\"aaaaaa\"\n"
14731             "\"\\\xC2\x8D\"",
14732             format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
14733 }
14734 
14735 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
14736   EXPECT_EQ("const char *sssss =\n"
14737             "    \"一二三四五六七八\\\n"
14738             " 九 十\";",
14739             format("const char *sssss = \"一二三四五六七八\\\n"
14740                    " 九 十\";",
14741                    getLLVMStyleWithColumns(30)));
14742 }
14743 
14744 TEST_F(FormatTest, SplitsUTF8LineComments) {
14745   EXPECT_EQ("// aaaaÄ\xc2\x8d",
14746             format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
14747   EXPECT_EQ("// Я из лесу\n"
14748             "// вышел; был\n"
14749             "// сильный\n"
14750             "// мороз.",
14751             format("// Я из лесу вышел; был сильный мороз.",
14752                    getLLVMStyleWithColumns(13)));
14753   EXPECT_EQ("// 一二三\n"
14754             "// 四五六七\n"
14755             "// 八  九\n"
14756             "// 十",
14757             format("// 一二三 四五六七 八  九 十", getLLVMStyleWithColumns(9)));
14758 }
14759 
14760 TEST_F(FormatTest, SplitsUTF8BlockComments) {
14761   EXPECT_EQ("/* Гляжу,\n"
14762             " * поднимается\n"
14763             " * медленно в\n"
14764             " * гору\n"
14765             " * Лошадка,\n"
14766             " * везущая\n"
14767             " * хворосту\n"
14768             " * воз. */",
14769             format("/* Гляжу, поднимается медленно в гору\n"
14770                    " * Лошадка, везущая хворосту воз. */",
14771                    getLLVMStyleWithColumns(13)));
14772   EXPECT_EQ(
14773       "/* 一二三\n"
14774       " * 四五六七\n"
14775       " * 八  九\n"
14776       " * 十  */",
14777       format("/* 一二三 四五六七 八  九 十  */", getLLVMStyleWithColumns(9)));
14778   EXPECT_EQ("/* �������� ��������\n"
14779             " * ��������\n"
14780             " * ������-�� */",
14781             format("/* �������� �������� �������� ������-�� */", getLLVMStyleWithColumns(12)));
14782 }
14783 
14784 #endif // _MSC_VER
14785 
14786 TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
14787   FormatStyle Style = getLLVMStyle();
14788 
14789   Style.ConstructorInitializerIndentWidth = 4;
14790   verifyFormat(
14791       "SomeClass::Constructor()\n"
14792       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
14793       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
14794       Style);
14795 
14796   Style.ConstructorInitializerIndentWidth = 2;
14797   verifyFormat(
14798       "SomeClass::Constructor()\n"
14799       "  : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
14800       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
14801       Style);
14802 
14803   Style.ConstructorInitializerIndentWidth = 0;
14804   verifyFormat(
14805       "SomeClass::Constructor()\n"
14806       ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
14807       "  aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
14808       Style);
14809   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
14810   verifyFormat(
14811       "SomeLongTemplateVariableName<\n"
14812       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
14813       Style);
14814   verifyFormat("bool smaller = 1 < "
14815                "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
14816                "                       "
14817                "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
14818                Style);
14819 
14820   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
14821   verifyFormat("SomeClass::Constructor() :\n"
14822                "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n"
14823                "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}",
14824                Style);
14825 }
14826 
14827 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
14828   FormatStyle Style = getLLVMStyle();
14829   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
14830   Style.ConstructorInitializerIndentWidth = 4;
14831   verifyFormat("SomeClass::Constructor()\n"
14832                "    : a(a)\n"
14833                "    , b(b)\n"
14834                "    , c(c) {}",
14835                Style);
14836   verifyFormat("SomeClass::Constructor()\n"
14837                "    : a(a) {}",
14838                Style);
14839 
14840   Style.ColumnLimit = 0;
14841   verifyFormat("SomeClass::Constructor()\n"
14842                "    : a(a) {}",
14843                Style);
14844   verifyFormat("SomeClass::Constructor() noexcept\n"
14845                "    : a(a) {}",
14846                Style);
14847   verifyFormat("SomeClass::Constructor()\n"
14848                "    : a(a)\n"
14849                "    , b(b)\n"
14850                "    , c(c) {}",
14851                Style);
14852   verifyFormat("SomeClass::Constructor()\n"
14853                "    : a(a) {\n"
14854                "  foo();\n"
14855                "  bar();\n"
14856                "}",
14857                Style);
14858 
14859   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
14860   verifyFormat("SomeClass::Constructor()\n"
14861                "    : a(a)\n"
14862                "    , b(b)\n"
14863                "    , c(c) {\n}",
14864                Style);
14865   verifyFormat("SomeClass::Constructor()\n"
14866                "    : a(a) {\n}",
14867                Style);
14868 
14869   Style.ColumnLimit = 80;
14870   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
14871   Style.ConstructorInitializerIndentWidth = 2;
14872   verifyFormat("SomeClass::Constructor()\n"
14873                "  : a(a)\n"
14874                "  , b(b)\n"
14875                "  , c(c) {}",
14876                Style);
14877 
14878   Style.ConstructorInitializerIndentWidth = 0;
14879   verifyFormat("SomeClass::Constructor()\n"
14880                ": a(a)\n"
14881                ", b(b)\n"
14882                ", c(c) {}",
14883                Style);
14884 
14885   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
14886   Style.ConstructorInitializerIndentWidth = 4;
14887   verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
14888   verifyFormat(
14889       "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
14890       Style);
14891   verifyFormat(
14892       "SomeClass::Constructor()\n"
14893       "    : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
14894       Style);
14895   Style.ConstructorInitializerIndentWidth = 4;
14896   Style.ColumnLimit = 60;
14897   verifyFormat("SomeClass::Constructor()\n"
14898                "    : aaaaaaaa(aaaaaaaa)\n"
14899                "    , aaaaaaaa(aaaaaaaa)\n"
14900                "    , aaaaaaaa(aaaaaaaa) {}",
14901                Style);
14902 }
14903 
14904 TEST_F(FormatTest, Destructors) {
14905   verifyFormat("void F(int &i) { i.~int(); }");
14906   verifyFormat("void F(int &i) { i->~int(); }");
14907 }
14908 
14909 TEST_F(FormatTest, FormatsWithWebKitStyle) {
14910   FormatStyle Style = getWebKitStyle();
14911 
14912   // Don't indent in outer namespaces.
14913   verifyFormat("namespace outer {\n"
14914                "int i;\n"
14915                "namespace inner {\n"
14916                "    int i;\n"
14917                "} // namespace inner\n"
14918                "} // namespace outer\n"
14919                "namespace other_outer {\n"
14920                "int i;\n"
14921                "}",
14922                Style);
14923 
14924   // Don't indent case labels.
14925   verifyFormat("switch (variable) {\n"
14926                "case 1:\n"
14927                "case 2:\n"
14928                "    doSomething();\n"
14929                "    break;\n"
14930                "default:\n"
14931                "    ++variable;\n"
14932                "}",
14933                Style);
14934 
14935   // Wrap before binary operators.
14936   EXPECT_EQ("void f()\n"
14937             "{\n"
14938             "    if (aaaaaaaaaaaaaaaa\n"
14939             "        && bbbbbbbbbbbbbbbbbbbbbbbb\n"
14940             "        && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
14941             "        return;\n"
14942             "}",
14943             format("void f() {\n"
14944                    "if (aaaaaaaaaaaaaaaa\n"
14945                    "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
14946                    "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
14947                    "return;\n"
14948                    "}",
14949                    Style));
14950 
14951   // Allow functions on a single line.
14952   verifyFormat("void f() { return; }", Style);
14953 
14954   // Allow empty blocks on a single line and insert a space in empty blocks.
14955   EXPECT_EQ("void f() { }", format("void f() {}", Style));
14956   EXPECT_EQ("while (true) { }", format("while (true) {}", Style));
14957   // However, don't merge non-empty short loops.
14958   EXPECT_EQ("while (true) {\n"
14959             "    continue;\n"
14960             "}",
14961             format("while (true) { continue; }", Style));
14962 
14963   // Constructor initializers are formatted one per line with the "," on the
14964   // new line.
14965   verifyFormat("Constructor()\n"
14966                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
14967                "    , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
14968                "          aaaaaaaaaaaaaa)\n"
14969                "    , aaaaaaaaaaaaaaaaaaaaaaa()\n"
14970                "{\n"
14971                "}",
14972                Style);
14973   verifyFormat("SomeClass::Constructor()\n"
14974                "    : a(a)\n"
14975                "{\n"
14976                "}",
14977                Style);
14978   EXPECT_EQ("SomeClass::Constructor()\n"
14979             "    : a(a)\n"
14980             "{\n"
14981             "}",
14982             format("SomeClass::Constructor():a(a){}", Style));
14983   verifyFormat("SomeClass::Constructor()\n"
14984                "    : a(a)\n"
14985                "    , b(b)\n"
14986                "    , c(c)\n"
14987                "{\n"
14988                "}",
14989                Style);
14990   verifyFormat("SomeClass::Constructor()\n"
14991                "    : a(a)\n"
14992                "{\n"
14993                "    foo();\n"
14994                "    bar();\n"
14995                "}",
14996                Style);
14997 
14998   // Access specifiers should be aligned left.
14999   verifyFormat("class C {\n"
15000                "public:\n"
15001                "    int i;\n"
15002                "};",
15003                Style);
15004 
15005   // Do not align comments.
15006   verifyFormat("int a; // Do not\n"
15007                "double b; // align comments.",
15008                Style);
15009 
15010   // Do not align operands.
15011   EXPECT_EQ("ASSERT(aaaa\n"
15012             "    || bbbb);",
15013             format("ASSERT ( aaaa\n||bbbb);", Style));
15014 
15015   // Accept input's line breaks.
15016   EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
15017             "    || bbbbbbbbbbbbbbb) {\n"
15018             "    i++;\n"
15019             "}",
15020             format("if (aaaaaaaaaaaaaaa\n"
15021                    "|| bbbbbbbbbbbbbbb) { i++; }",
15022                    Style));
15023   EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
15024             "    i++;\n"
15025             "}",
15026             format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
15027 
15028   // Don't automatically break all macro definitions (llvm.org/PR17842).
15029   verifyFormat("#define aNumber 10", Style);
15030   // However, generally keep the line breaks that the user authored.
15031   EXPECT_EQ("#define aNumber \\\n"
15032             "    10",
15033             format("#define aNumber \\\n"
15034                    " 10",
15035                    Style));
15036 
15037   // Keep empty and one-element array literals on a single line.
15038   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
15039             "                                  copyItems:YES];",
15040             format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
15041                    "copyItems:YES];",
15042                    Style));
15043   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
15044             "                                  copyItems:YES];",
15045             format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
15046                    "             copyItems:YES];",
15047                    Style));
15048   // FIXME: This does not seem right, there should be more indentation before
15049   // the array literal's entries. Nested blocks have the same problem.
15050   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
15051             "    @\"a\",\n"
15052             "    @\"a\"\n"
15053             "]\n"
15054             "                                  copyItems:YES];",
15055             format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
15056                    "     @\"a\",\n"
15057                    "     @\"a\"\n"
15058                    "     ]\n"
15059                    "       copyItems:YES];",
15060                    Style));
15061   EXPECT_EQ(
15062       "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
15063       "                                  copyItems:YES];",
15064       format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
15065              "   copyItems:YES];",
15066              Style));
15067 
15068   verifyFormat("[self.a b:c c:d];", Style);
15069   EXPECT_EQ("[self.a b:c\n"
15070             "        c:d];",
15071             format("[self.a b:c\n"
15072                    "c:d];",
15073                    Style));
15074 }
15075 
15076 TEST_F(FormatTest, FormatsLambdas) {
15077   verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
15078   verifyFormat(
15079       "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n");
15080   verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
15081   verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
15082   verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
15083   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
15084   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
15085   verifyFormat("auto c = [a = [b = 42] {}] {};\n");
15086   verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
15087   verifyFormat("int x = f(*+[] {});");
15088   verifyFormat("void f() {\n"
15089                "  other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
15090                "}\n");
15091   verifyFormat("void f() {\n"
15092                "  other(x.begin(), //\n"
15093                "        x.end(),   //\n"
15094                "        [&](int, int) { return 1; });\n"
15095                "}\n");
15096   verifyFormat("void f() {\n"
15097                "  other.other.other.other.other(\n"
15098                "      x.begin(), x.end(),\n"
15099                "      [something, rather](int, int, int, int, int, int, int) { "
15100                "return 1; });\n"
15101                "}\n");
15102   verifyFormat(
15103       "void f() {\n"
15104       "  other.other.other.other.other(\n"
15105       "      x.begin(), x.end(),\n"
15106       "      [something, rather](int, int, int, int, int, int, int) {\n"
15107       "        //\n"
15108       "      });\n"
15109       "}\n");
15110   verifyFormat("SomeFunction([]() { // A cool function...\n"
15111                "  return 43;\n"
15112                "});");
15113   EXPECT_EQ("SomeFunction([]() {\n"
15114             "#define A a\n"
15115             "  return 43;\n"
15116             "});",
15117             format("SomeFunction([](){\n"
15118                    "#define A a\n"
15119                    "return 43;\n"
15120                    "});"));
15121   verifyFormat("void f() {\n"
15122                "  SomeFunction([](decltype(x), A *a) {});\n"
15123                "  SomeFunction([](typeof(x), A *a) {});\n"
15124                "  SomeFunction([](_Atomic(x), A *a) {});\n"
15125                "  SomeFunction([](__underlying_type(x), A *a) {});\n"
15126                "}");
15127   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
15128                "    [](const aaaaaaaaaa &a) { return a; });");
15129   verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
15130                "  SomeOtherFunctioooooooooooooooooooooooooon();\n"
15131                "});");
15132   verifyFormat("Constructor()\n"
15133                "    : Field([] { // comment\n"
15134                "        int i;\n"
15135                "      }) {}");
15136   verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
15137                "  return some_parameter.size();\n"
15138                "};");
15139   verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
15140                "    [](const string &s) { return s; };");
15141   verifyFormat("int i = aaaaaa ? 1 //\n"
15142                "               : [] {\n"
15143                "                   return 2; //\n"
15144                "                 }();");
15145   verifyFormat("llvm::errs() << \"number of twos is \"\n"
15146                "             << std::count_if(v.begin(), v.end(), [](int x) {\n"
15147                "                  return x == 2; // force break\n"
15148                "                });");
15149   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
15150                "    [=](int iiiiiiiiiiii) {\n"
15151                "      return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
15152                "             aaaaaaaaaaaaaaaaaaaaaaa;\n"
15153                "    });",
15154                getLLVMStyleWithColumns(60));
15155   verifyFormat("SomeFunction({[&] {\n"
15156                "                // comment\n"
15157                "              },\n"
15158                "              [&] {\n"
15159                "                // comment\n"
15160                "              }});");
15161   verifyFormat("SomeFunction({[&] {\n"
15162                "  // comment\n"
15163                "}});");
15164   verifyFormat(
15165       "virtual aaaaaaaaaaaaaaaa(\n"
15166       "    std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n"
15167       "    aaaaa aaaaaaaaa);");
15168 
15169   // Lambdas with return types.
15170   verifyFormat("int c = []() -> int { return 2; }();\n");
15171   verifyFormat("int c = []() -> int * { return 2; }();\n");
15172   verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
15173   verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
15174   verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
15175   verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
15176   verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
15177   verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
15178   verifyFormat("[a, a]() -> a<1> {};");
15179   verifyFormat("[]() -> foo<5 + 2> { return {}; };");
15180   verifyFormat("[]() -> foo<5 - 2> { return {}; };");
15181   verifyFormat("[]() -> foo<5 / 2> { return {}; };");
15182   verifyFormat("[]() -> foo<5 * 2> { return {}; };");
15183   verifyFormat("[]() -> foo<5 % 2> { return {}; };");
15184   verifyFormat("[]() -> foo<5 << 2> { return {}; };");
15185   verifyFormat("[]() -> foo<!5> { return {}; };");
15186   verifyFormat("[]() -> foo<~5> { return {}; };");
15187   verifyFormat("[]() -> foo<5 | 2> { return {}; };");
15188   verifyFormat("[]() -> foo<5 || 2> { return {}; };");
15189   verifyFormat("[]() -> foo<5 & 2> { return {}; };");
15190   verifyFormat("[]() -> foo<5 && 2> { return {}; };");
15191   verifyFormat("[]() -> foo<5 == 2> { return {}; };");
15192   verifyFormat("[]() -> foo<5 != 2> { return {}; };");
15193   verifyFormat("[]() -> foo<5 >= 2> { return {}; };");
15194   verifyFormat("[]() -> foo<5 <= 2> { return {}; };");
15195   verifyFormat("[]() -> foo<5 < 2> { return {}; };");
15196   verifyFormat("[]() -> foo<2 ? 1 : 0> { return {}; };");
15197   verifyFormat("namespace bar {\n"
15198                "// broken:\n"
15199                "auto foo{[]() -> foo<5 + 2> { return {}; }};\n"
15200                "} // namespace bar");
15201   verifyFormat("namespace bar {\n"
15202                "// broken:\n"
15203                "auto foo{[]() -> foo<5 - 2> { return {}; }};\n"
15204                "} // namespace bar");
15205   verifyFormat("namespace bar {\n"
15206                "// broken:\n"
15207                "auto foo{[]() -> foo<5 / 2> { return {}; }};\n"
15208                "} // namespace bar");
15209   verifyFormat("namespace bar {\n"
15210                "// broken:\n"
15211                "auto foo{[]() -> foo<5 * 2> { return {}; }};\n"
15212                "} // namespace bar");
15213   verifyFormat("namespace bar {\n"
15214                "// broken:\n"
15215                "auto foo{[]() -> foo<5 % 2> { return {}; }};\n"
15216                "} // namespace bar");
15217   verifyFormat("namespace bar {\n"
15218                "// broken:\n"
15219                "auto foo{[]() -> foo<5 << 2> { return {}; }};\n"
15220                "} // namespace bar");
15221   verifyFormat("namespace bar {\n"
15222                "// broken:\n"
15223                "auto foo{[]() -> foo<!5> { return {}; }};\n"
15224                "} // namespace bar");
15225   verifyFormat("namespace bar {\n"
15226                "// broken:\n"
15227                "auto foo{[]() -> foo<~5> { return {}; }};\n"
15228                "} // namespace bar");
15229   verifyFormat("namespace bar {\n"
15230                "// broken:\n"
15231                "auto foo{[]() -> foo<5 | 2> { return {}; }};\n"
15232                "} // namespace bar");
15233   verifyFormat("namespace bar {\n"
15234                "// broken:\n"
15235                "auto foo{[]() -> foo<5 || 2> { return {}; }};\n"
15236                "} // namespace bar");
15237   verifyFormat("namespace bar {\n"
15238                "// broken:\n"
15239                "auto foo{[]() -> foo<5 & 2> { return {}; }};\n"
15240                "} // namespace bar");
15241   verifyFormat("namespace bar {\n"
15242                "// broken:\n"
15243                "auto foo{[]() -> foo<5 && 2> { return {}; }};\n"
15244                "} // namespace bar");
15245   verifyFormat("namespace bar {\n"
15246                "// broken:\n"
15247                "auto foo{[]() -> foo<5 == 2> { return {}; }};\n"
15248                "} // namespace bar");
15249   verifyFormat("namespace bar {\n"
15250                "// broken:\n"
15251                "auto foo{[]() -> foo<5 != 2> { return {}; }};\n"
15252                "} // namespace bar");
15253   verifyFormat("namespace bar {\n"
15254                "// broken:\n"
15255                "auto foo{[]() -> foo<5 >= 2> { return {}; }};\n"
15256                "} // namespace bar");
15257   verifyFormat("namespace bar {\n"
15258                "// broken:\n"
15259                "auto foo{[]() -> foo<5 <= 2> { return {}; }};\n"
15260                "} // namespace bar");
15261   verifyFormat("namespace bar {\n"
15262                "// broken:\n"
15263                "auto foo{[]() -> foo<5 < 2> { return {}; }};\n"
15264                "} // namespace bar");
15265   verifyFormat("namespace bar {\n"
15266                "// broken:\n"
15267                "auto foo{[]() -> foo<2 ? 1 : 0> { return {}; }};\n"
15268                "} // namespace bar");
15269   verifyFormat("[]() -> a<1> {};");
15270   verifyFormat("[]() -> a<1> { ; };");
15271   verifyFormat("[]() -> a<1> { ; }();");
15272   verifyFormat("[a, a]() -> a<true> {};");
15273   verifyFormat("[]() -> a<true> {};");
15274   verifyFormat("[]() -> a<true> { ; };");
15275   verifyFormat("[]() -> a<true> { ; }();");
15276   verifyFormat("[a, a]() -> a<false> {};");
15277   verifyFormat("[]() -> a<false> {};");
15278   verifyFormat("[]() -> a<false> { ; };");
15279   verifyFormat("[]() -> a<false> { ; }();");
15280   verifyFormat("auto foo{[]() -> foo<false> { ; }};");
15281   verifyFormat("namespace bar {\n"
15282                "auto foo{[]() -> foo<false> { ; }};\n"
15283                "} // namespace bar");
15284   verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
15285                "                   int j) -> int {\n"
15286                "  return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
15287                "};");
15288   verifyFormat(
15289       "aaaaaaaaaaaaaaaaaaaaaa(\n"
15290       "    [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
15291       "      return aaaaaaaaaaaaaaaaa;\n"
15292       "    });",
15293       getLLVMStyleWithColumns(70));
15294   verifyFormat("[]() //\n"
15295                "    -> int {\n"
15296                "  return 1; //\n"
15297                "};");
15298   verifyFormat("[]() -> Void<T...> {};");
15299   verifyFormat("[a, b]() -> Tuple<T...> { return {}; };");
15300 
15301   // Lambdas with explicit template argument lists.
15302   verifyFormat(
15303       "auto L = []<template <typename> class T, class U>(T<U> &&a) {};\n");
15304 
15305   // Multiple lambdas in the same parentheses change indentation rules. These
15306   // lambdas are forced to start on new lines.
15307   verifyFormat("SomeFunction(\n"
15308                "    []() {\n"
15309                "      //\n"
15310                "    },\n"
15311                "    []() {\n"
15312                "      //\n"
15313                "    });");
15314 
15315   // A lambda passed as arg0 is always pushed to the next line.
15316   verifyFormat("SomeFunction(\n"
15317                "    [this] {\n"
15318                "      //\n"
15319                "    },\n"
15320                "    1);\n");
15321 
15322   // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like
15323   // the arg0 case above.
15324   auto Style = getGoogleStyle();
15325   Style.BinPackArguments = false;
15326   verifyFormat("SomeFunction(\n"
15327                "    a,\n"
15328                "    [this] {\n"
15329                "      //\n"
15330                "    },\n"
15331                "    b);\n",
15332                Style);
15333   verifyFormat("SomeFunction(\n"
15334                "    a,\n"
15335                "    [this] {\n"
15336                "      //\n"
15337                "    },\n"
15338                "    b);\n");
15339 
15340   // A lambda with a very long line forces arg0 to be pushed out irrespective of
15341   // the BinPackArguments value (as long as the code is wide enough).
15342   verifyFormat(
15343       "something->SomeFunction(\n"
15344       "    a,\n"
15345       "    [this] {\n"
15346       "      "
15347       "D0000000000000000000000000000000000000000000000000000000000001();\n"
15348       "    },\n"
15349       "    b);\n");
15350 
15351   // A multi-line lambda is pulled up as long as the introducer fits on the
15352   // previous line and there are no further args.
15353   verifyFormat("function(1, [this, that] {\n"
15354                "  //\n"
15355                "});\n");
15356   verifyFormat("function([this, that] {\n"
15357                "  //\n"
15358                "});\n");
15359   // FIXME: this format is not ideal and we should consider forcing the first
15360   // arg onto its own line.
15361   verifyFormat("function(a, b, c, //\n"
15362                "         d, [this, that] {\n"
15363                "           //\n"
15364                "         });\n");
15365 
15366   // Multiple lambdas are treated correctly even when there is a short arg0.
15367   verifyFormat("SomeFunction(\n"
15368                "    1,\n"
15369                "    [this] {\n"
15370                "      //\n"
15371                "    },\n"
15372                "    [this] {\n"
15373                "      //\n"
15374                "    },\n"
15375                "    1);\n");
15376 
15377   // More complex introducers.
15378   verifyFormat("return [i, args...] {};");
15379 
15380   // Not lambdas.
15381   verifyFormat("constexpr char hello[]{\"hello\"};");
15382   verifyFormat("double &operator[](int i) { return 0; }\n"
15383                "int i;");
15384   verifyFormat("std::unique_ptr<int[]> foo() {}");
15385   verifyFormat("int i = a[a][a]->f();");
15386   verifyFormat("int i = (*b)[a]->f();");
15387 
15388   // Other corner cases.
15389   verifyFormat("void f() {\n"
15390                "  bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
15391                "  );\n"
15392                "}");
15393 
15394   // Lambdas created through weird macros.
15395   verifyFormat("void f() {\n"
15396                "  MACRO((const AA &a) { return 1; });\n"
15397                "  MACRO((AA &a) { return 1; });\n"
15398                "}");
15399 
15400   verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
15401                "      doo_dah();\n"
15402                "      doo_dah();\n"
15403                "    })) {\n"
15404                "}");
15405   verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
15406                "                doo_dah();\n"
15407                "                doo_dah();\n"
15408                "              })) {\n"
15409                "}");
15410   verifyFormat("if CONSTEXPR (blah_blah(whatever, whatever, [] {\n"
15411                "                doo_dah();\n"
15412                "                doo_dah();\n"
15413                "              })) {\n"
15414                "}");
15415   verifyFormat("auto lambda = []() {\n"
15416                "  int a = 2\n"
15417                "#if A\n"
15418                "          + 2\n"
15419                "#endif\n"
15420                "      ;\n"
15421                "};");
15422 
15423   // Lambdas with complex multiline introducers.
15424   verifyFormat(
15425       "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
15426       "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
15427       "        -> ::std::unordered_set<\n"
15428       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
15429       "      //\n"
15430       "    });");
15431 
15432   FormatStyle DoNotMerge = getLLVMStyle();
15433   DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None;
15434   verifyFormat("auto c = []() {\n"
15435                "  return b;\n"
15436                "};",
15437                "auto c = []() { return b; };", DoNotMerge);
15438   verifyFormat("auto c = []() {\n"
15439                "};",
15440                " auto c = []() {};", DoNotMerge);
15441 
15442   FormatStyle MergeEmptyOnly = getLLVMStyle();
15443   MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty;
15444   verifyFormat("auto c = []() {\n"
15445                "  return b;\n"
15446                "};",
15447                "auto c = []() {\n"
15448                "  return b;\n"
15449                " };",
15450                MergeEmptyOnly);
15451   verifyFormat("auto c = []() {};",
15452                "auto c = []() {\n"
15453                "};",
15454                MergeEmptyOnly);
15455 
15456   FormatStyle MergeInline = getLLVMStyle();
15457   MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline;
15458   verifyFormat("auto c = []() {\n"
15459                "  return b;\n"
15460                "};",
15461                "auto c = []() { return b; };", MergeInline);
15462   verifyFormat("function([]() { return b; })", "function([]() { return b; })",
15463                MergeInline);
15464   verifyFormat("function([]() { return b; }, a)",
15465                "function([]() { return b; }, a)", MergeInline);
15466   verifyFormat("function(a, []() { return b; })",
15467                "function(a, []() { return b; })", MergeInline);
15468 
15469   // Check option "BraceWrapping.BeforeLambdaBody" and different state of
15470   // AllowShortLambdasOnASingleLine
15471   FormatStyle LLVMWithBeforeLambdaBody = getLLVMStyle();
15472   LLVMWithBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom;
15473   LLVMWithBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true;
15474   LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine =
15475       FormatStyle::ShortLambdaStyle::SLS_None;
15476   verifyFormat("FctWithOneNestedLambdaInline_SLS_None(\n"
15477                "    []()\n"
15478                "    {\n"
15479                "      return 17;\n"
15480                "    });",
15481                LLVMWithBeforeLambdaBody);
15482   verifyFormat("FctWithOneNestedLambdaEmpty_SLS_None(\n"
15483                "    []()\n"
15484                "    {\n"
15485                "    });",
15486                LLVMWithBeforeLambdaBody);
15487   verifyFormat("auto fct_SLS_None = []()\n"
15488                "{\n"
15489                "  return 17;\n"
15490                "};",
15491                LLVMWithBeforeLambdaBody);
15492   verifyFormat("TwoNestedLambdas_SLS_None(\n"
15493                "    []()\n"
15494                "    {\n"
15495                "      return Call(\n"
15496                "          []()\n"
15497                "          {\n"
15498                "            return 17;\n"
15499                "          });\n"
15500                "    });",
15501                LLVMWithBeforeLambdaBody);
15502   verifyFormat("void Fct()\n"
15503                "{\n"
15504                "  return {[]()\n"
15505                "          {\n"
15506                "            return 17;\n"
15507                "          }};\n"
15508                "}",
15509                LLVMWithBeforeLambdaBody);
15510 
15511   LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine =
15512       FormatStyle::ShortLambdaStyle::SLS_Empty;
15513   verifyFormat("FctWithOneNestedLambdaInline_SLS_Empty(\n"
15514                "    []()\n"
15515                "    {\n"
15516                "      return 17;\n"
15517                "    });",
15518                LLVMWithBeforeLambdaBody);
15519   verifyFormat("FctWithOneNestedLambdaEmpty_SLS_Empty([]() {});",
15520                LLVMWithBeforeLambdaBody);
15521   verifyFormat("FctWithOneNestedLambdaEmptyInsideAVeryVeryVeryVeryVeryVeryVeryL"
15522                "ongFunctionName_SLS_Empty(\n"
15523                "    []() {});",
15524                LLVMWithBeforeLambdaBody);
15525   verifyFormat("FctWithMultipleParams_SLS_Empty(A, B,\n"
15526                "                                []()\n"
15527                "                                {\n"
15528                "                                  return 17;\n"
15529                "                                });",
15530                LLVMWithBeforeLambdaBody);
15531   verifyFormat("auto fct_SLS_Empty = []()\n"
15532                "{\n"
15533                "  return 17;\n"
15534                "};",
15535                LLVMWithBeforeLambdaBody);
15536   verifyFormat("TwoNestedLambdas_SLS_Empty(\n"
15537                "    []()\n"
15538                "    {\n"
15539                "      return Call([]() {});\n"
15540                "    });",
15541                LLVMWithBeforeLambdaBody);
15542   verifyFormat("TwoNestedLambdas_SLS_Empty(A,\n"
15543                "                           []()\n"
15544                "                           {\n"
15545                "                             return Call([]() {});\n"
15546                "                           });",
15547                LLVMWithBeforeLambdaBody);
15548   verifyFormat(
15549       "FctWithLongLineInLambda_SLS_Empty(\n"
15550       "    []()\n"
15551       "    {\n"
15552       "      return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n"
15553       "                               AndShouldNotBeConsiderAsInline,\n"
15554       "                               LambdaBodyMustBeBreak);\n"
15555       "    });",
15556       LLVMWithBeforeLambdaBody);
15557 
15558   LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine =
15559       FormatStyle::ShortLambdaStyle::SLS_Inline;
15560   verifyFormat("FctWithOneNestedLambdaInline_SLS_Inline([]() { return 17; });",
15561                LLVMWithBeforeLambdaBody);
15562   verifyFormat("FctWithOneNestedLambdaEmpty_SLS_Inline([]() {});",
15563                LLVMWithBeforeLambdaBody);
15564   verifyFormat("auto fct_SLS_Inline = []()\n"
15565                "{\n"
15566                "  return 17;\n"
15567                "};",
15568                LLVMWithBeforeLambdaBody);
15569   verifyFormat("TwoNestedLambdas_SLS_Inline([]() { return Call([]() { return "
15570                "17; }); });",
15571                LLVMWithBeforeLambdaBody);
15572   verifyFormat(
15573       "FctWithLongLineInLambda_SLS_Inline(\n"
15574       "    []()\n"
15575       "    {\n"
15576       "      return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n"
15577       "                               AndShouldNotBeConsiderAsInline,\n"
15578       "                               LambdaBodyMustBeBreak);\n"
15579       "    });",
15580       LLVMWithBeforeLambdaBody);
15581   verifyFormat("FctWithMultipleParams_SLS_Inline("
15582                "VeryLongParameterThatShouldAskToBeOnMultiLine,\n"
15583                "                                 []() { return 17; });",
15584                LLVMWithBeforeLambdaBody);
15585   verifyFormat(
15586       "FctWithMultipleParams_SLS_Inline(FirstParam, []() { return 17; });",
15587       LLVMWithBeforeLambdaBody);
15588 
15589   LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine =
15590       FormatStyle::ShortLambdaStyle::SLS_All;
15591   verifyFormat("FctWithOneNestedLambdaInline_SLS_All([]() { return 17; });",
15592                LLVMWithBeforeLambdaBody);
15593   verifyFormat("FctWithOneNestedLambdaEmpty_SLS_All([]() {});",
15594                LLVMWithBeforeLambdaBody);
15595   verifyFormat("auto fct_SLS_All = []() { return 17; };",
15596                LLVMWithBeforeLambdaBody);
15597   verifyFormat("FctWithOneParam_SLS_All(\n"
15598                "    []()\n"
15599                "    {\n"
15600                "      // A cool function...\n"
15601                "      return 43;\n"
15602                "    });",
15603                LLVMWithBeforeLambdaBody);
15604   verifyFormat("FctWithMultipleParams_SLS_All("
15605                "VeryLongParameterThatShouldAskToBeOnMultiLine,\n"
15606                "                              []() { return 17; });",
15607                LLVMWithBeforeLambdaBody);
15608   verifyFormat("FctWithMultipleParams_SLS_All(A, []() { return 17; });",
15609                LLVMWithBeforeLambdaBody);
15610   verifyFormat("FctWithMultipleParams_SLS_All(A, B, []() { return 17; });",
15611                LLVMWithBeforeLambdaBody);
15612   verifyFormat(
15613       "FctWithLongLineInLambda_SLS_All(\n"
15614       "    []()\n"
15615       "    {\n"
15616       "      return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n"
15617       "                               AndShouldNotBeConsiderAsInline,\n"
15618       "                               LambdaBodyMustBeBreak);\n"
15619       "    });",
15620       LLVMWithBeforeLambdaBody);
15621   verifyFormat(
15622       "auto fct_SLS_All = []()\n"
15623       "{\n"
15624       "  return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n"
15625       "                           AndShouldNotBeConsiderAsInline,\n"
15626       "                           LambdaBodyMustBeBreak);\n"
15627       "};",
15628       LLVMWithBeforeLambdaBody);
15629   LLVMWithBeforeLambdaBody.BinPackParameters = false;
15630   verifyFormat("FctAllOnSameLine_SLS_All([]() { return S; }, Fst, Second);",
15631                LLVMWithBeforeLambdaBody);
15632   verifyFormat(
15633       "FctWithLongLineInLambda_SLS_All([]() { return SomeValueNotSoLong; },\n"
15634       "                                FirstParam,\n"
15635       "                                SecondParam,\n"
15636       "                                ThirdParam,\n"
15637       "                                FourthParam);",
15638       LLVMWithBeforeLambdaBody);
15639   verifyFormat("FctWithLongLineInLambda_SLS_All(\n"
15640                "    []() { return "
15641                "SomeValueVeryVeryVeryVeryVeryVeryVeryVeryVeryLong; },\n"
15642                "    FirstParam,\n"
15643                "    SecondParam,\n"
15644                "    ThirdParam,\n"
15645                "    FourthParam);",
15646                LLVMWithBeforeLambdaBody);
15647   verifyFormat(
15648       "FctWithLongLineInLambda_SLS_All(FirstParam,\n"
15649       "                                SecondParam,\n"
15650       "                                ThirdParam,\n"
15651       "                                FourthParam,\n"
15652       "                                []() { return SomeValueNotSoLong; });",
15653       LLVMWithBeforeLambdaBody);
15654   verifyFormat("FctWithLongLineInLambda_SLS_All(\n"
15655                "    []()\n"
15656                "    {\n"
15657                "      return "
15658                "HereAVeryLongLineThatWillBeFormattedOnMultipleLineAndShouldNotB"
15659                "eConsiderAsInline;\n"
15660                "    });",
15661                LLVMWithBeforeLambdaBody);
15662   verifyFormat(
15663       "FctWithLongLineInLambda_SLS_All(\n"
15664       "    []()\n"
15665       "    {\n"
15666       "      return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n"
15667       "                               AndShouldNotBeConsiderAsInline,\n"
15668       "                               LambdaBodyMustBeBreak);\n"
15669       "    });",
15670       LLVMWithBeforeLambdaBody);
15671   verifyFormat("FctWithTwoParams_SLS_All(\n"
15672                "    []()\n"
15673                "    {\n"
15674                "      // A cool function...\n"
15675                "      return 43;\n"
15676                "    },\n"
15677                "    87);",
15678                LLVMWithBeforeLambdaBody);
15679   verifyFormat("FctWithTwoParams_SLS_All([]() { return 43; }, 87);",
15680                LLVMWithBeforeLambdaBody);
15681   verifyFormat("FctWithOneNestedLambdas_SLS_All([]() { return 17; });",
15682                LLVMWithBeforeLambdaBody);
15683   verifyFormat(
15684       "TwoNestedLambdas_SLS_All([]() { return Call([]() { return 17; }); });",
15685       LLVMWithBeforeLambdaBody);
15686   verifyFormat("TwoNestedLambdas_SLS_All([]() { return Call([]() { return 17; "
15687                "}); }, x);",
15688                LLVMWithBeforeLambdaBody);
15689   verifyFormat("TwoNestedLambdas_SLS_All(\n"
15690                "    []()\n"
15691                "    {\n"
15692                "      // A cool function...\n"
15693                "      return Call([]() { return 17; });\n"
15694                "    });",
15695                LLVMWithBeforeLambdaBody);
15696   verifyFormat("TwoNestedLambdas_SLS_All(\n"
15697                "    []()\n"
15698                "    {\n"
15699                "      return Call(\n"
15700                "          []()\n"
15701                "          {\n"
15702                "            // A cool function...\n"
15703                "            return 17;\n"
15704                "          });\n"
15705                "    });",
15706                LLVMWithBeforeLambdaBody);
15707 }
15708 
15709 TEST_F(FormatTest, LambdaWithLineComments) {
15710   FormatStyle LLVMWithBeforeLambdaBody = getLLVMStyle();
15711   LLVMWithBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom;
15712   LLVMWithBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true;
15713   LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine =
15714       FormatStyle::ShortLambdaStyle::SLS_All;
15715 
15716   verifyFormat("auto k = []() { return; }", LLVMWithBeforeLambdaBody);
15717   verifyFormat("auto k = []() // comment\n"
15718                "{ return; }",
15719                LLVMWithBeforeLambdaBody);
15720   verifyFormat("auto k = []() /* comment */ { return; }",
15721                LLVMWithBeforeLambdaBody);
15722   verifyFormat("auto k = []() /* comment */ /* comment */ { return; }",
15723                LLVMWithBeforeLambdaBody);
15724   verifyFormat("auto k = []() // X\n"
15725                "{ return; }",
15726                LLVMWithBeforeLambdaBody);
15727   verifyFormat(
15728       "auto k = []() // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"
15729       "{ return; }",
15730       LLVMWithBeforeLambdaBody);
15731 }
15732 
15733 TEST_F(FormatTest, EmptyLinesInLambdas) {
15734   verifyFormat("auto lambda = []() {\n"
15735                "  x(); //\n"
15736                "};",
15737                "auto lambda = []() {\n"
15738                "\n"
15739                "  x(); //\n"
15740                "\n"
15741                "};");
15742 }
15743 
15744 TEST_F(FormatTest, FormatsBlocks) {
15745   FormatStyle ShortBlocks = getLLVMStyle();
15746   ShortBlocks.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always;
15747   verifyFormat("int (^Block)(int, int);", ShortBlocks);
15748   verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
15749   verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
15750   verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
15751   verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
15752   verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
15753 
15754   verifyFormat("foo(^{ bar(); });", ShortBlocks);
15755   verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
15756   verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
15757 
15758   verifyFormat("[operation setCompletionBlock:^{\n"
15759                "  [self onOperationDone];\n"
15760                "}];");
15761   verifyFormat("int i = {[operation setCompletionBlock:^{\n"
15762                "  [self onOperationDone];\n"
15763                "}]};");
15764   verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
15765                "  f();\n"
15766                "}];");
15767   verifyFormat("int a = [operation block:^int(int *i) {\n"
15768                "  return 1;\n"
15769                "}];");
15770   verifyFormat("[myObject doSomethingWith:arg1\n"
15771                "                      aaa:^int(int *a) {\n"
15772                "                        return 1;\n"
15773                "                      }\n"
15774                "                      bbb:f(a * bbbbbbbb)];");
15775 
15776   verifyFormat("[operation setCompletionBlock:^{\n"
15777                "  [self.delegate newDataAvailable];\n"
15778                "}];",
15779                getLLVMStyleWithColumns(60));
15780   verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
15781                "  NSString *path = [self sessionFilePath];\n"
15782                "  if (path) {\n"
15783                "    // ...\n"
15784                "  }\n"
15785                "});");
15786   verifyFormat("[[SessionService sharedService]\n"
15787                "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
15788                "      if (window) {\n"
15789                "        [self windowDidLoad:window];\n"
15790                "      } else {\n"
15791                "        [self errorLoadingWindow];\n"
15792                "      }\n"
15793                "    }];");
15794   verifyFormat("void (^largeBlock)(void) = ^{\n"
15795                "  // ...\n"
15796                "};\n",
15797                getLLVMStyleWithColumns(40));
15798   verifyFormat("[[SessionService sharedService]\n"
15799                "    loadWindowWithCompletionBlock: //\n"
15800                "        ^(SessionWindow *window) {\n"
15801                "          if (window) {\n"
15802                "            [self windowDidLoad:window];\n"
15803                "          } else {\n"
15804                "            [self errorLoadingWindow];\n"
15805                "          }\n"
15806                "        }];",
15807                getLLVMStyleWithColumns(60));
15808   verifyFormat("[myObject doSomethingWith:arg1\n"
15809                "    firstBlock:^(Foo *a) {\n"
15810                "      // ...\n"
15811                "      int i;\n"
15812                "    }\n"
15813                "    secondBlock:^(Bar *b) {\n"
15814                "      // ...\n"
15815                "      int i;\n"
15816                "    }\n"
15817                "    thirdBlock:^Foo(Bar *b) {\n"
15818                "      // ...\n"
15819                "      int i;\n"
15820                "    }];");
15821   verifyFormat("[myObject doSomethingWith:arg1\n"
15822                "               firstBlock:-1\n"
15823                "              secondBlock:^(Bar *b) {\n"
15824                "                // ...\n"
15825                "                int i;\n"
15826                "              }];");
15827 
15828   verifyFormat("f(^{\n"
15829                "  @autoreleasepool {\n"
15830                "    if (a) {\n"
15831                "      g();\n"
15832                "    }\n"
15833                "  }\n"
15834                "});");
15835   verifyFormat("Block b = ^int *(A *a, B *b) {}");
15836   verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
15837                "};");
15838 
15839   FormatStyle FourIndent = getLLVMStyle();
15840   FourIndent.ObjCBlockIndentWidth = 4;
15841   verifyFormat("[operation setCompletionBlock:^{\n"
15842                "    [self onOperationDone];\n"
15843                "}];",
15844                FourIndent);
15845 }
15846 
15847 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
15848   FormatStyle ZeroColumn = getLLVMStyle();
15849   ZeroColumn.ColumnLimit = 0;
15850 
15851   verifyFormat("[[SessionService sharedService] "
15852                "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
15853                "  if (window) {\n"
15854                "    [self windowDidLoad:window];\n"
15855                "  } else {\n"
15856                "    [self errorLoadingWindow];\n"
15857                "  }\n"
15858                "}];",
15859                ZeroColumn);
15860   EXPECT_EQ("[[SessionService sharedService]\n"
15861             "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
15862             "      if (window) {\n"
15863             "        [self windowDidLoad:window];\n"
15864             "      } else {\n"
15865             "        [self errorLoadingWindow];\n"
15866             "      }\n"
15867             "    }];",
15868             format("[[SessionService sharedService]\n"
15869                    "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
15870                    "                if (window) {\n"
15871                    "    [self windowDidLoad:window];\n"
15872                    "  } else {\n"
15873                    "    [self errorLoadingWindow];\n"
15874                    "  }\n"
15875                    "}];",
15876                    ZeroColumn));
15877   verifyFormat("[myObject doSomethingWith:arg1\n"
15878                "    firstBlock:^(Foo *a) {\n"
15879                "      // ...\n"
15880                "      int i;\n"
15881                "    }\n"
15882                "    secondBlock:^(Bar *b) {\n"
15883                "      // ...\n"
15884                "      int i;\n"
15885                "    }\n"
15886                "    thirdBlock:^Foo(Bar *b) {\n"
15887                "      // ...\n"
15888                "      int i;\n"
15889                "    }];",
15890                ZeroColumn);
15891   verifyFormat("f(^{\n"
15892                "  @autoreleasepool {\n"
15893                "    if (a) {\n"
15894                "      g();\n"
15895                "    }\n"
15896                "  }\n"
15897                "});",
15898                ZeroColumn);
15899   verifyFormat("void (^largeBlock)(void) = ^{\n"
15900                "  // ...\n"
15901                "};",
15902                ZeroColumn);
15903 
15904   ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always;
15905   EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
15906             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
15907   ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never;
15908   EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
15909             "  int i;\n"
15910             "};",
15911             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
15912 }
15913 
15914 TEST_F(FormatTest, SupportsCRLF) {
15915   EXPECT_EQ("int a;\r\n"
15916             "int b;\r\n"
15917             "int c;\r\n",
15918             format("int a;\r\n"
15919                    "  int b;\r\n"
15920                    "    int c;\r\n",
15921                    getLLVMStyle()));
15922   EXPECT_EQ("int a;\r\n"
15923             "int b;\r\n"
15924             "int c;\r\n",
15925             format("int a;\r\n"
15926                    "  int b;\n"
15927                    "    int c;\r\n",
15928                    getLLVMStyle()));
15929   EXPECT_EQ("int a;\n"
15930             "int b;\n"
15931             "int c;\n",
15932             format("int a;\r\n"
15933                    "  int b;\n"
15934                    "    int c;\n",
15935                    getLLVMStyle()));
15936   EXPECT_EQ("\"aaaaaaa \"\r\n"
15937             "\"bbbbbbb\";\r\n",
15938             format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
15939   EXPECT_EQ("#define A \\\r\n"
15940             "  b;      \\\r\n"
15941             "  c;      \\\r\n"
15942             "  d;\r\n",
15943             format("#define A \\\r\n"
15944                    "  b; \\\r\n"
15945                    "  c; d; \r\n",
15946                    getGoogleStyle()));
15947 
15948   EXPECT_EQ("/*\r\n"
15949             "multi line block comments\r\n"
15950             "should not introduce\r\n"
15951             "an extra carriage return\r\n"
15952             "*/\r\n",
15953             format("/*\r\n"
15954                    "multi line block comments\r\n"
15955                    "should not introduce\r\n"
15956                    "an extra carriage return\r\n"
15957                    "*/\r\n"));
15958   EXPECT_EQ("/*\r\n"
15959             "\r\n"
15960             "*/",
15961             format("/*\r\n"
15962                    "    \r\r\r\n"
15963                    "*/"));
15964 
15965   FormatStyle style = getLLVMStyle();
15966 
15967   style.DeriveLineEnding = true;
15968   style.UseCRLF = false;
15969   EXPECT_EQ("union FooBarBazQux {\n"
15970             "  int foo;\n"
15971             "  int bar;\n"
15972             "  int baz;\n"
15973             "};",
15974             format("union FooBarBazQux {\r\n"
15975                    "  int foo;\n"
15976                    "  int bar;\r\n"
15977                    "  int baz;\n"
15978                    "};",
15979                    style));
15980   style.UseCRLF = true;
15981   EXPECT_EQ("union FooBarBazQux {\r\n"
15982             "  int foo;\r\n"
15983             "  int bar;\r\n"
15984             "  int baz;\r\n"
15985             "};",
15986             format("union FooBarBazQux {\r\n"
15987                    "  int foo;\n"
15988                    "  int bar;\r\n"
15989                    "  int baz;\n"
15990                    "};",
15991                    style));
15992 
15993   style.DeriveLineEnding = false;
15994   style.UseCRLF = false;
15995   EXPECT_EQ("union FooBarBazQux {\n"
15996             "  int foo;\n"
15997             "  int bar;\n"
15998             "  int baz;\n"
15999             "  int qux;\n"
16000             "};",
16001             format("union FooBarBazQux {\r\n"
16002                    "  int foo;\n"
16003                    "  int bar;\r\n"
16004                    "  int baz;\n"
16005                    "  int qux;\r\n"
16006                    "};",
16007                    style));
16008   style.UseCRLF = true;
16009   EXPECT_EQ("union FooBarBazQux {\r\n"
16010             "  int foo;\r\n"
16011             "  int bar;\r\n"
16012             "  int baz;\r\n"
16013             "  int qux;\r\n"
16014             "};",
16015             format("union FooBarBazQux {\r\n"
16016                    "  int foo;\n"
16017                    "  int bar;\r\n"
16018                    "  int baz;\n"
16019                    "  int qux;\n"
16020                    "};",
16021                    style));
16022 
16023   style.DeriveLineEnding = true;
16024   style.UseCRLF = false;
16025   EXPECT_EQ("union FooBarBazQux {\r\n"
16026             "  int foo;\r\n"
16027             "  int bar;\r\n"
16028             "  int baz;\r\n"
16029             "  int qux;\r\n"
16030             "};",
16031             format("union FooBarBazQux {\r\n"
16032                    "  int foo;\n"
16033                    "  int bar;\r\n"
16034                    "  int baz;\n"
16035                    "  int qux;\r\n"
16036                    "};",
16037                    style));
16038   style.UseCRLF = true;
16039   EXPECT_EQ("union FooBarBazQux {\n"
16040             "  int foo;\n"
16041             "  int bar;\n"
16042             "  int baz;\n"
16043             "  int qux;\n"
16044             "};",
16045             format("union FooBarBazQux {\r\n"
16046                    "  int foo;\n"
16047                    "  int bar;\r\n"
16048                    "  int baz;\n"
16049                    "  int qux;\n"
16050                    "};",
16051                    style));
16052 }
16053 
16054 TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
16055   verifyFormat("MY_CLASS(C) {\n"
16056                "  int i;\n"
16057                "  int j;\n"
16058                "};");
16059 }
16060 
16061 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
16062   FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
16063   TwoIndent.ContinuationIndentWidth = 2;
16064 
16065   EXPECT_EQ("int i =\n"
16066             "  longFunction(\n"
16067             "    arg);",
16068             format("int i = longFunction(arg);", TwoIndent));
16069 
16070   FormatStyle SixIndent = getLLVMStyleWithColumns(20);
16071   SixIndent.ContinuationIndentWidth = 6;
16072 
16073   EXPECT_EQ("int i =\n"
16074             "      longFunction(\n"
16075             "            arg);",
16076             format("int i = longFunction(arg);", SixIndent));
16077 }
16078 
16079 TEST_F(FormatTest, WrappedClosingParenthesisIndent) {
16080   FormatStyle Style = getLLVMStyle();
16081   verifyFormat("int Foo::getter(\n"
16082                "    //\n"
16083                ") const {\n"
16084                "  return foo;\n"
16085                "}",
16086                Style);
16087   verifyFormat("void Foo::setter(\n"
16088                "    //\n"
16089                ") {\n"
16090                "  foo = 1;\n"
16091                "}",
16092                Style);
16093 }
16094 
16095 TEST_F(FormatTest, SpacesInAngles) {
16096   FormatStyle Spaces = getLLVMStyle();
16097   Spaces.SpacesInAngles = true;
16098 
16099   verifyFormat("static_cast< int >(arg);", Spaces);
16100   verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
16101   verifyFormat("f< int, float >();", Spaces);
16102   verifyFormat("template <> g() {}", Spaces);
16103   verifyFormat("template < std::vector< int > > f() {}", Spaces);
16104   verifyFormat("std::function< void(int, int) > fct;", Spaces);
16105   verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
16106                Spaces);
16107 
16108   Spaces.Standard = FormatStyle::LS_Cpp03;
16109   Spaces.SpacesInAngles = true;
16110   verifyFormat("A< A< int > >();", Spaces);
16111 
16112   Spaces.SpacesInAngles = false;
16113   verifyFormat("A<A<int> >();", Spaces);
16114 
16115   Spaces.Standard = FormatStyle::LS_Cpp11;
16116   Spaces.SpacesInAngles = true;
16117   verifyFormat("A< A< int > >();", Spaces);
16118 
16119   Spaces.SpacesInAngles = false;
16120   verifyFormat("A<A<int>>();", Spaces);
16121 }
16122 
16123 TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
16124   FormatStyle Style = getLLVMStyle();
16125   Style.SpaceAfterTemplateKeyword = false;
16126   verifyFormat("template<int> void foo();", Style);
16127 }
16128 
16129 TEST_F(FormatTest, TripleAngleBrackets) {
16130   verifyFormat("f<<<1, 1>>>();");
16131   verifyFormat("f<<<1, 1, 1, s>>>();");
16132   verifyFormat("f<<<a, b, c, d>>>();");
16133   EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
16134   verifyFormat("f<param><<<1, 1>>>();");
16135   verifyFormat("f<1><<<1, 1>>>();");
16136   EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
16137   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
16138                "aaaaaaaaaaa<<<\n    1, 1>>>();");
16139   verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
16140                "    <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
16141 }
16142 
16143 TEST_F(FormatTest, MergeLessLessAtEnd) {
16144   verifyFormat("<<");
16145   EXPECT_EQ("< < <", format("\\\n<<<"));
16146   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
16147                "aaallvm::outs() <<");
16148   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
16149                "aaaallvm::outs()\n    <<");
16150 }
16151 
16152 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
16153   std::string code = "#if A\n"
16154                      "#if B\n"
16155                      "a.\n"
16156                      "#endif\n"
16157                      "    a = 1;\n"
16158                      "#else\n"
16159                      "#endif\n"
16160                      "#if C\n"
16161                      "#else\n"
16162                      "#endif\n";
16163   EXPECT_EQ(code, format(code));
16164 }
16165 
16166 TEST_F(FormatTest, HandleConflictMarkers) {
16167   // Git/SVN conflict markers.
16168   EXPECT_EQ("int a;\n"
16169             "void f() {\n"
16170             "  callme(some(parameter1,\n"
16171             "<<<<<<< text by the vcs\n"
16172             "              parameter2),\n"
16173             "||||||| text by the vcs\n"
16174             "              parameter2),\n"
16175             "         parameter3,\n"
16176             "======= text by the vcs\n"
16177             "              parameter2, parameter3),\n"
16178             ">>>>>>> text by the vcs\n"
16179             "         otherparameter);\n",
16180             format("int a;\n"
16181                    "void f() {\n"
16182                    "  callme(some(parameter1,\n"
16183                    "<<<<<<< text by the vcs\n"
16184                    "  parameter2),\n"
16185                    "||||||| text by the vcs\n"
16186                    "  parameter2),\n"
16187                    "  parameter3,\n"
16188                    "======= text by the vcs\n"
16189                    "  parameter2,\n"
16190                    "  parameter3),\n"
16191                    ">>>>>>> text by the vcs\n"
16192                    "  otherparameter);\n"));
16193 
16194   // Perforce markers.
16195   EXPECT_EQ("void f() {\n"
16196             "  function(\n"
16197             ">>>> text by the vcs\n"
16198             "      parameter,\n"
16199             "==== text by the vcs\n"
16200             "      parameter,\n"
16201             "==== text by the vcs\n"
16202             "      parameter,\n"
16203             "<<<< text by the vcs\n"
16204             "      parameter);\n",
16205             format("void f() {\n"
16206                    "  function(\n"
16207                    ">>>> text by the vcs\n"
16208                    "  parameter,\n"
16209                    "==== text by the vcs\n"
16210                    "  parameter,\n"
16211                    "==== text by the vcs\n"
16212                    "  parameter,\n"
16213                    "<<<< text by the vcs\n"
16214                    "  parameter);\n"));
16215 
16216   EXPECT_EQ("<<<<<<<\n"
16217             "|||||||\n"
16218             "=======\n"
16219             ">>>>>>>",
16220             format("<<<<<<<\n"
16221                    "|||||||\n"
16222                    "=======\n"
16223                    ">>>>>>>"));
16224 
16225   EXPECT_EQ("<<<<<<<\n"
16226             "|||||||\n"
16227             "int i;\n"
16228             "=======\n"
16229             ">>>>>>>",
16230             format("<<<<<<<\n"
16231                    "|||||||\n"
16232                    "int i;\n"
16233                    "=======\n"
16234                    ">>>>>>>"));
16235 
16236   // FIXME: Handle parsing of macros around conflict markers correctly:
16237   EXPECT_EQ("#define Macro \\\n"
16238             "<<<<<<<\n"
16239             "Something \\\n"
16240             "|||||||\n"
16241             "Else \\\n"
16242             "=======\n"
16243             "Other \\\n"
16244             ">>>>>>>\n"
16245             "    End int i;\n",
16246             format("#define Macro \\\n"
16247                    "<<<<<<<\n"
16248                    "  Something \\\n"
16249                    "|||||||\n"
16250                    "  Else \\\n"
16251                    "=======\n"
16252                    "  Other \\\n"
16253                    ">>>>>>>\n"
16254                    "  End\n"
16255                    "int i;\n"));
16256 }
16257 
16258 TEST_F(FormatTest, DisableRegions) {
16259   EXPECT_EQ("int i;\n"
16260             "// clang-format off\n"
16261             "  int j;\n"
16262             "// clang-format on\n"
16263             "int k;",
16264             format(" int  i;\n"
16265                    "   // clang-format off\n"
16266                    "  int j;\n"
16267                    " // clang-format on\n"
16268                    "   int   k;"));
16269   EXPECT_EQ("int i;\n"
16270             "/* clang-format off */\n"
16271             "  int j;\n"
16272             "/* clang-format on */\n"
16273             "int k;",
16274             format(" int  i;\n"
16275                    "   /* clang-format off */\n"
16276                    "  int j;\n"
16277                    " /* clang-format on */\n"
16278                    "   int   k;"));
16279 
16280   // Don't reflow comments within disabled regions.
16281   EXPECT_EQ("// clang-format off\n"
16282             "// long long long long long long line\n"
16283             "/* clang-format on */\n"
16284             "/* long long long\n"
16285             " * long long long\n"
16286             " * line */\n"
16287             "int i;\n"
16288             "/* clang-format off */\n"
16289             "/* long long long long long long line */\n",
16290             format("// clang-format off\n"
16291                    "// long long long long long long line\n"
16292                    "/* clang-format on */\n"
16293                    "/* long long long long long long line */\n"
16294                    "int i;\n"
16295                    "/* clang-format off */\n"
16296                    "/* long long long long long long line */\n",
16297                    getLLVMStyleWithColumns(20)));
16298 }
16299 
16300 TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
16301   format("? ) =");
16302   verifyNoCrash("#define a\\\n /**/}");
16303 }
16304 
16305 TEST_F(FormatTest, FormatsTableGenCode) {
16306   FormatStyle Style = getLLVMStyle();
16307   Style.Language = FormatStyle::LK_TableGen;
16308   verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
16309 }
16310 
16311 TEST_F(FormatTest, ArrayOfTemplates) {
16312   EXPECT_EQ("auto a = new unique_ptr<int>[10];",
16313             format("auto a = new unique_ptr<int > [ 10];"));
16314 
16315   FormatStyle Spaces = getLLVMStyle();
16316   Spaces.SpacesInSquareBrackets = true;
16317   EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
16318             format("auto a = new unique_ptr<int > [10];", Spaces));
16319 }
16320 
16321 TEST_F(FormatTest, ArrayAsTemplateType) {
16322   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
16323             format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
16324 
16325   FormatStyle Spaces = getLLVMStyle();
16326   Spaces.SpacesInSquareBrackets = true;
16327   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
16328             format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
16329 }
16330 
16331 TEST_F(FormatTest, NoSpaceAfterSuper) { verifyFormat("__super::FooBar();"); }
16332 
16333 TEST(FormatStyle, GetStyleWithEmptyFileName) {
16334   llvm::vfs::InMemoryFileSystem FS;
16335   auto Style1 = getStyle("file", "", "Google", "", &FS);
16336   ASSERT_TRUE((bool)Style1);
16337   ASSERT_EQ(*Style1, getGoogleStyle());
16338 }
16339 
16340 TEST(FormatStyle, GetStyleOfFile) {
16341   llvm::vfs::InMemoryFileSystem FS;
16342   // Test 1: format file in the same directory.
16343   ASSERT_TRUE(
16344       FS.addFile("/a/.clang-format", 0,
16345                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
16346   ASSERT_TRUE(
16347       FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
16348   auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
16349   ASSERT_TRUE((bool)Style1);
16350   ASSERT_EQ(*Style1, getLLVMStyle());
16351 
16352   // Test 2.1: fallback to default.
16353   ASSERT_TRUE(
16354       FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
16355   auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
16356   ASSERT_TRUE((bool)Style2);
16357   ASSERT_EQ(*Style2, getMozillaStyle());
16358 
16359   // Test 2.2: no format on 'none' fallback style.
16360   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
16361   ASSERT_TRUE((bool)Style2);
16362   ASSERT_EQ(*Style2, getNoStyle());
16363 
16364   // Test 2.3: format if config is found with no based style while fallback is
16365   // 'none'.
16366   ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
16367                          llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
16368   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
16369   ASSERT_TRUE((bool)Style2);
16370   ASSERT_EQ(*Style2, getLLVMStyle());
16371 
16372   // Test 2.4: format if yaml with no based style, while fallback is 'none'.
16373   Style2 = getStyle("{}", "a.h", "none", "", &FS);
16374   ASSERT_TRUE((bool)Style2);
16375   ASSERT_EQ(*Style2, getLLVMStyle());
16376 
16377   // Test 3: format file in parent directory.
16378   ASSERT_TRUE(
16379       FS.addFile("/c/.clang-format", 0,
16380                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
16381   ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
16382                          llvm::MemoryBuffer::getMemBuffer("int i;")));
16383   auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
16384   ASSERT_TRUE((bool)Style3);
16385   ASSERT_EQ(*Style3, getGoogleStyle());
16386 
16387   // Test 4: error on invalid fallback style
16388   auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
16389   ASSERT_FALSE((bool)Style4);
16390   llvm::consumeError(Style4.takeError());
16391 
16392   // Test 5: error on invalid yaml on command line
16393   auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
16394   ASSERT_FALSE((bool)Style5);
16395   llvm::consumeError(Style5.takeError());
16396 
16397   // Test 6: error on invalid style
16398   auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
16399   ASSERT_FALSE((bool)Style6);
16400   llvm::consumeError(Style6.takeError());
16401 
16402   // Test 7: found config file, error on parsing it
16403   ASSERT_TRUE(
16404       FS.addFile("/d/.clang-format", 0,
16405                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
16406                                                   "InvalidKey: InvalidValue")));
16407   ASSERT_TRUE(
16408       FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
16409   auto Style7a = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
16410   ASSERT_FALSE((bool)Style7a);
16411   llvm::consumeError(Style7a.takeError());
16412 
16413   auto Style7b = getStyle("file", "/d/.clang-format", "LLVM", "", &FS, true);
16414   ASSERT_TRUE((bool)Style7b);
16415 
16416   // Test 8: inferred per-language defaults apply.
16417   auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS);
16418   ASSERT_TRUE((bool)StyleTd);
16419   ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen));
16420 }
16421 
16422 TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
16423   // Column limit is 20.
16424   std::string Code = "Type *a =\n"
16425                      "    new Type();\n"
16426                      "g(iiiii, 0, jjjjj,\n"
16427                      "  0, kkkkk, 0, mm);\n"
16428                      "int  bad     = format   ;";
16429   std::string Expected = "auto a = new Type();\n"
16430                          "g(iiiii, nullptr,\n"
16431                          "  jjjjj, nullptr,\n"
16432                          "  kkkkk, nullptr,\n"
16433                          "  mm);\n"
16434                          "int  bad     = format   ;";
16435   FileID ID = Context.createInMemoryFile("format.cpp", Code);
16436   tooling::Replacements Replaces = toReplacements(
16437       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
16438                             "auto "),
16439        tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
16440                             "nullptr"),
16441        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
16442                             "nullptr"),
16443        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
16444                             "nullptr")});
16445 
16446   format::FormatStyle Style = format::getLLVMStyle();
16447   Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
16448   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
16449   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
16450       << llvm::toString(FormattedReplaces.takeError()) << "\n";
16451   auto Result = applyAllReplacements(Code, *FormattedReplaces);
16452   EXPECT_TRUE(static_cast<bool>(Result));
16453   EXPECT_EQ(Expected, *Result);
16454 }
16455 
16456 TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
16457   std::string Code = "#include \"a.h\"\n"
16458                      "#include \"c.h\"\n"
16459                      "\n"
16460                      "int main() {\n"
16461                      "  return 0;\n"
16462                      "}";
16463   std::string Expected = "#include \"a.h\"\n"
16464                          "#include \"b.h\"\n"
16465                          "#include \"c.h\"\n"
16466                          "\n"
16467                          "int main() {\n"
16468                          "  return 0;\n"
16469                          "}";
16470   FileID ID = Context.createInMemoryFile("fix.cpp", Code);
16471   tooling::Replacements Replaces = toReplacements(
16472       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
16473                             "#include \"b.h\"\n")});
16474 
16475   format::FormatStyle Style = format::getLLVMStyle();
16476   Style.SortIncludes = true;
16477   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
16478   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
16479       << llvm::toString(FormattedReplaces.takeError()) << "\n";
16480   auto Result = applyAllReplacements(Code, *FormattedReplaces);
16481   EXPECT_TRUE(static_cast<bool>(Result));
16482   EXPECT_EQ(Expected, *Result);
16483 }
16484 
16485 TEST_F(FormatTest, FormatSortsUsingDeclarations) {
16486   EXPECT_EQ("using std::cin;\n"
16487             "using std::cout;",
16488             format("using std::cout;\n"
16489                    "using std::cin;",
16490                    getGoogleStyle()));
16491 }
16492 
16493 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
16494   format::FormatStyle Style = format::getLLVMStyle();
16495   Style.Standard = FormatStyle::LS_Cpp03;
16496   // cpp03 recognize this string as identifier u8 and literal character 'a'
16497   EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
16498 }
16499 
16500 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
16501   // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
16502   // all modes, including C++11, C++14 and C++17
16503   EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
16504 }
16505 
16506 TEST_F(FormatTest, DoNotFormatLikelyXml) {
16507   EXPECT_EQ("<!-- ;> -->", format("<!-- ;> -->", getGoogleStyle()));
16508   EXPECT_EQ(" <!-- >; -->", format(" <!-- >; -->", getGoogleStyle()));
16509 }
16510 
16511 TEST_F(FormatTest, StructuredBindings) {
16512   // Structured bindings is a C++17 feature.
16513   // all modes, including C++11, C++14 and C++17
16514   verifyFormat("auto [a, b] = f();");
16515   EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
16516   EXPECT_EQ("const auto [a, b] = f();", format("const   auto[a, b] = f();"));
16517   EXPECT_EQ("auto const [a, b] = f();", format("auto  const[a, b] = f();"));
16518   EXPECT_EQ("auto const volatile [a, b] = f();",
16519             format("auto  const   volatile[a, b] = f();"));
16520   EXPECT_EQ("auto [a, b, c] = f();", format("auto   [  a  ,  b,c   ] = f();"));
16521   EXPECT_EQ("auto &[a, b, c] = f();",
16522             format("auto   &[  a  ,  b,c   ] = f();"));
16523   EXPECT_EQ("auto &&[a, b, c] = f();",
16524             format("auto   &&[  a  ,  b,c   ] = f();"));
16525   EXPECT_EQ("auto const &[a, b] = f();", format("auto  const&[a, b] = f();"));
16526   EXPECT_EQ("auto const volatile &&[a, b] = f();",
16527             format("auto  const  volatile  &&[a, b] = f();"));
16528   EXPECT_EQ("auto const &&[a, b] = f();",
16529             format("auto  const   &&  [a, b] = f();"));
16530   EXPECT_EQ("const auto &[a, b] = f();",
16531             format("const  auto  &  [a, b] = f();"));
16532   EXPECT_EQ("const auto volatile &&[a, b] = f();",
16533             format("const  auto   volatile  &&[a, b] = f();"));
16534   EXPECT_EQ("volatile const auto &&[a, b] = f();",
16535             format("volatile  const  auto   &&[a, b] = f();"));
16536   EXPECT_EQ("const auto &&[a, b] = f();",
16537             format("const  auto  &&  [a, b] = f();"));
16538 
16539   // Make sure we don't mistake structured bindings for lambdas.
16540   FormatStyle PointerMiddle = getLLVMStyle();
16541   PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
16542   verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
16543   verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
16544   verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
16545   verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
16546   verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
16547   verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
16548   verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
16549   verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
16550   verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
16551   verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
16552   verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
16553   verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
16554 
16555   EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
16556             format("for (const auto   &&   [a, b] : some_range) {\n}"));
16557   EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
16558             format("for (const auto   &   [a, b] : some_range) {\n}"));
16559   EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
16560             format("for (const auto[a, b] : some_range) {\n}"));
16561   EXPECT_EQ("auto [x, y](expr);", format("auto[x,y]  (expr);"));
16562   EXPECT_EQ("auto &[x, y](expr);", format("auto  &  [x,y]  (expr);"));
16563   EXPECT_EQ("auto &&[x, y](expr);", format("auto  &&  [x,y]  (expr);"));
16564   EXPECT_EQ("auto const &[x, y](expr);",
16565             format("auto  const  &  [x,y]  (expr);"));
16566   EXPECT_EQ("auto const &&[x, y](expr);",
16567             format("auto  const  &&  [x,y]  (expr);"));
16568   EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y]     {expr};"));
16569   EXPECT_EQ("auto const &[x, y]{expr};",
16570             format("auto  const  &  [x,y]  {expr};"));
16571   EXPECT_EQ("auto const &&[x, y]{expr};",
16572             format("auto  const  &&  [x,y]  {expr};"));
16573 
16574   format::FormatStyle Spaces = format::getLLVMStyle();
16575   Spaces.SpacesInSquareBrackets = true;
16576   verifyFormat("auto [ a, b ] = f();", Spaces);
16577   verifyFormat("auto &&[ a, b ] = f();", Spaces);
16578   verifyFormat("auto &[ a, b ] = f();", Spaces);
16579   verifyFormat("auto const &&[ a, b ] = f();", Spaces);
16580   verifyFormat("auto const &[ a, b ] = f();", Spaces);
16581 }
16582 
16583 TEST_F(FormatTest, FileAndCode) {
16584   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", ""));
16585   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", ""));
16586   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", ""));
16587   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", ""));
16588   EXPECT_EQ(FormatStyle::LK_ObjC,
16589             guessLanguage("foo.h", "@interface Foo\n@end\n"));
16590   EXPECT_EQ(
16591       FormatStyle::LK_ObjC,
16592       guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }"));
16593   EXPECT_EQ(FormatStyle::LK_ObjC,
16594             guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))"));
16595   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;"));
16596   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", ""));
16597   EXPECT_EQ(FormatStyle::LK_ObjC,
16598             guessLanguage("foo", "@interface Foo\n@end\n"));
16599   EXPECT_EQ(FormatStyle::LK_ObjC,
16600             guessLanguage("foo.h", "int DoStuff(CGRect rect);\n"));
16601   EXPECT_EQ(
16602       FormatStyle::LK_ObjC,
16603       guessLanguage("foo.h",
16604                     "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n"));
16605   EXPECT_EQ(
16606       FormatStyle::LK_Cpp,
16607       guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;"));
16608 }
16609 
16610 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) {
16611   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];"));
16612   EXPECT_EQ(FormatStyle::LK_ObjC,
16613             guessLanguage("foo.h", "array[[calculator getIndex]];"));
16614   EXPECT_EQ(FormatStyle::LK_Cpp,
16615             guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];"));
16616   EXPECT_EQ(
16617       FormatStyle::LK_Cpp,
16618       guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];"));
16619   EXPECT_EQ(FormatStyle::LK_ObjC,
16620             guessLanguage("foo.h", "[[noreturn foo] bar];"));
16621   EXPECT_EQ(FormatStyle::LK_Cpp,
16622             guessLanguage("foo.h", "[[clang::fallthrough]];"));
16623   EXPECT_EQ(FormatStyle::LK_ObjC,
16624             guessLanguage("foo.h", "[[clang:fallthrough] foo];"));
16625   EXPECT_EQ(FormatStyle::LK_Cpp,
16626             guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];"));
16627   EXPECT_EQ(FormatStyle::LK_Cpp,
16628             guessLanguage("foo.h", "[[using clang: fallthrough]];"));
16629   EXPECT_EQ(FormatStyle::LK_ObjC,
16630             guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];"));
16631   EXPECT_EQ(FormatStyle::LK_Cpp,
16632             guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];"));
16633   EXPECT_EQ(
16634       FormatStyle::LK_Cpp,
16635       guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)"));
16636   EXPECT_EQ(
16637       FormatStyle::LK_Cpp,
16638       guessLanguage("foo.h",
16639                     "[[clang::callable_when(\"unconsumed\", \"unknown\")]]"));
16640   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]"));
16641 }
16642 
16643 TEST_F(FormatTest, GuessLanguageWithCaret) {
16644   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);"));
16645   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);"));
16646   EXPECT_EQ(FormatStyle::LK_ObjC,
16647             guessLanguage("foo.h", "int(^)(char, float);"));
16648   EXPECT_EQ(FormatStyle::LK_ObjC,
16649             guessLanguage("foo.h", "int(^foo)(char, float);"));
16650   EXPECT_EQ(FormatStyle::LK_ObjC,
16651             guessLanguage("foo.h", "int(^foo[10])(char, float);"));
16652   EXPECT_EQ(FormatStyle::LK_ObjC,
16653             guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);"));
16654   EXPECT_EQ(
16655       FormatStyle::LK_ObjC,
16656       guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);"));
16657 }
16658 
16659 TEST_F(FormatTest, FormatsInlineAsmSymbolicNames) {
16660   // ASM symbolic names are identifiers that must be surrounded by [] without
16661   // space in between:
16662   // https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#InputOperands
16663 
16664   // Example from https://bugs.llvm.org/show_bug.cgi?id=45108.
16665   verifyFormat(R"(//
16666 asm volatile("mrs %x[result], FPCR" : [result] "=r"(result));
16667 )");
16668 
16669   // A list of several ASM symbolic names.
16670   verifyFormat(R"(asm("mov %[e], %[d]" : [d] "=rm"(d), [e] "rm"(*e));)");
16671 
16672   // ASM symbolic names in inline ASM with inputs and outputs.
16673   verifyFormat(R"(//
16674 asm("cmoveq %1, %2, %[result]"
16675     : [result] "=r"(result)
16676     : "r"(test), "r"(new), "[result]"(old));
16677 )");
16678 
16679   // ASM symbolic names in inline ASM with no outputs.
16680   verifyFormat(R"(asm("mov %[e], %[d]" : : [d] "=rm"(d), [e] "rm"(*e));)");
16681 }
16682 
16683 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) {
16684   EXPECT_EQ(FormatStyle::LK_Cpp,
16685             guessLanguage("foo.h", "void f() {\n"
16686                                    "  asm (\"mov %[e], %[d]\"\n"
16687                                    "     : [d] \"=rm\" (d)\n"
16688                                    "       [e] \"rm\" (*e));\n"
16689                                    "}"));
16690   EXPECT_EQ(FormatStyle::LK_Cpp,
16691             guessLanguage("foo.h", "void f() {\n"
16692                                    "  _asm (\"mov %[e], %[d]\"\n"
16693                                    "     : [d] \"=rm\" (d)\n"
16694                                    "       [e] \"rm\" (*e));\n"
16695                                    "}"));
16696   EXPECT_EQ(FormatStyle::LK_Cpp,
16697             guessLanguage("foo.h", "void f() {\n"
16698                                    "  __asm (\"mov %[e], %[d]\"\n"
16699                                    "     : [d] \"=rm\" (d)\n"
16700                                    "       [e] \"rm\" (*e));\n"
16701                                    "}"));
16702   EXPECT_EQ(FormatStyle::LK_Cpp,
16703             guessLanguage("foo.h", "void f() {\n"
16704                                    "  __asm__ (\"mov %[e], %[d]\"\n"
16705                                    "     : [d] \"=rm\" (d)\n"
16706                                    "       [e] \"rm\" (*e));\n"
16707                                    "}"));
16708   EXPECT_EQ(FormatStyle::LK_Cpp,
16709             guessLanguage("foo.h", "void f() {\n"
16710                                    "  asm (\"mov %[e], %[d]\"\n"
16711                                    "     : [d] \"=rm\" (d),\n"
16712                                    "       [e] \"rm\" (*e));\n"
16713                                    "}"));
16714   EXPECT_EQ(FormatStyle::LK_Cpp,
16715             guessLanguage("foo.h", "void f() {\n"
16716                                    "  asm volatile (\"mov %[e], %[d]\"\n"
16717                                    "     : [d] \"=rm\" (d)\n"
16718                                    "       [e] \"rm\" (*e));\n"
16719                                    "}"));
16720 }
16721 
16722 TEST_F(FormatTest, GuessLanguageWithChildLines) {
16723   EXPECT_EQ(FormatStyle::LK_Cpp,
16724             guessLanguage("foo.h", "#define FOO ({ std::string s; })"));
16725   EXPECT_EQ(FormatStyle::LK_ObjC,
16726             guessLanguage("foo.h", "#define FOO ({ NSString *s; })"));
16727   EXPECT_EQ(
16728       FormatStyle::LK_Cpp,
16729       guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })"));
16730   EXPECT_EQ(
16731       FormatStyle::LK_ObjC,
16732       guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })"));
16733 }
16734 
16735 TEST_F(FormatTest, TypenameMacros) {
16736   std::vector<std::string> TypenameMacros = {"STACK_OF", "LIST", "TAILQ_ENTRY"};
16737 
16738   // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=30353
16739   FormatStyle Google = getGoogleStyleWithColumns(0);
16740   Google.TypenameMacros = TypenameMacros;
16741   verifyFormat("struct foo {\n"
16742                "  int bar;\n"
16743                "  TAILQ_ENTRY(a) bleh;\n"
16744                "};",
16745                Google);
16746 
16747   FormatStyle Macros = getLLVMStyle();
16748   Macros.TypenameMacros = TypenameMacros;
16749 
16750   verifyFormat("STACK_OF(int) a;", Macros);
16751   verifyFormat("STACK_OF(int) *a;", Macros);
16752   verifyFormat("STACK_OF(int const *) *a;", Macros);
16753   verifyFormat("STACK_OF(int *const) *a;", Macros);
16754   verifyFormat("STACK_OF(int, string) a;", Macros);
16755   verifyFormat("STACK_OF(LIST(int)) a;", Macros);
16756   verifyFormat("STACK_OF(LIST(int)) a, b;", Macros);
16757   verifyFormat("for (LIST(int) *a = NULL; a;) {\n}", Macros);
16758   verifyFormat("STACK_OF(int) f(LIST(int) *arg);", Macros);
16759   verifyFormat("vector<LIST(uint64_t) *attr> x;", Macros);
16760   verifyFormat("vector<LIST(uint64_t) *const> f(LIST(uint64_t) *arg);", Macros);
16761 
16762   Macros.PointerAlignment = FormatStyle::PAS_Left;
16763   verifyFormat("STACK_OF(int)* a;", Macros);
16764   verifyFormat("STACK_OF(int*)* a;", Macros);
16765   verifyFormat("x = (STACK_OF(uint64_t))*a;", Macros);
16766   verifyFormat("x = (STACK_OF(uint64_t))&a;", Macros);
16767   verifyFormat("vector<STACK_OF(uint64_t)* attr> x;", Macros);
16768 }
16769 
16770 TEST_F(FormatTest, AtomicQualifier) {
16771   // Check that we treate _Atomic as a type and not a function call
16772   FormatStyle Google = getGoogleStyleWithColumns(0);
16773   verifyFormat("struct foo {\n"
16774                "  int a1;\n"
16775                "  _Atomic(a) a2;\n"
16776                "  _Atomic(_Atomic(int) *const) a3;\n"
16777                "};",
16778                Google);
16779   verifyFormat("_Atomic(uint64_t) a;");
16780   verifyFormat("_Atomic(uint64_t) *a;");
16781   verifyFormat("_Atomic(uint64_t const *) *a;");
16782   verifyFormat("_Atomic(uint64_t *const) *a;");
16783   verifyFormat("_Atomic(const uint64_t *) *a;");
16784   verifyFormat("_Atomic(uint64_t) a;");
16785   verifyFormat("_Atomic(_Atomic(uint64_t)) a;");
16786   verifyFormat("_Atomic(_Atomic(uint64_t)) a, b;");
16787   verifyFormat("for (_Atomic(uint64_t) *a = NULL; a;) {\n}");
16788   verifyFormat("_Atomic(uint64_t) f(_Atomic(uint64_t) *arg);");
16789 
16790   verifyFormat("_Atomic(uint64_t) *s(InitValue);");
16791   verifyFormat("_Atomic(uint64_t) *s{InitValue};");
16792   FormatStyle Style = getLLVMStyle();
16793   Style.PointerAlignment = FormatStyle::PAS_Left;
16794   verifyFormat("_Atomic(uint64_t)* s(InitValue);", Style);
16795   verifyFormat("_Atomic(uint64_t)* s{InitValue};", Style);
16796   verifyFormat("_Atomic(int)* a;", Style);
16797   verifyFormat("_Atomic(int*)* a;", Style);
16798   verifyFormat("vector<_Atomic(uint64_t)* attr> x;", Style);
16799 
16800   Style.SpacesInCStyleCastParentheses = true;
16801   Style.SpacesInParentheses = false;
16802   verifyFormat("x = ( _Atomic(uint64_t) )*a;", Style);
16803   Style.SpacesInCStyleCastParentheses = false;
16804   Style.SpacesInParentheses = true;
16805   verifyFormat("x = (_Atomic( uint64_t ))*a;", Style);
16806   verifyFormat("x = (_Atomic( uint64_t ))&a;", Style);
16807 }
16808 
16809 TEST_F(FormatTest, AmbersandInLamda) {
16810   // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=41899
16811   FormatStyle AlignStyle = getLLVMStyle();
16812   AlignStyle.PointerAlignment = FormatStyle::PAS_Left;
16813   verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle);
16814   AlignStyle.PointerAlignment = FormatStyle::PAS_Right;
16815   verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle);
16816 }
16817 
16818 TEST_F(FormatTest, SpacesInConditionalStatement) {
16819   FormatStyle Spaces = getLLVMStyle();
16820   Spaces.SpacesInConditionalStatement = true;
16821   verifyFormat("for ( int i = 0; i; i++ )\n  continue;", Spaces);
16822   verifyFormat("if ( !a )\n  return;", Spaces);
16823   verifyFormat("if ( a )\n  return;", Spaces);
16824   verifyFormat("if constexpr ( a )\n  return;", Spaces);
16825   verifyFormat("switch ( a )\ncase 1:\n  return;", Spaces);
16826   verifyFormat("while ( a )\n  return;", Spaces);
16827   verifyFormat("while ( (a && b) )\n  return;", Spaces);
16828   verifyFormat("do {\n} while ( 1 != 0 );", Spaces);
16829   verifyFormat("try {\n} catch ( const std::exception & ) {\n}", Spaces);
16830   // Check that space on the left of "::" is inserted as expected at beginning
16831   // of condition.
16832   verifyFormat("while ( ::func() )\n  return;", Spaces);
16833 }
16834 
16835 TEST_F(FormatTest, AlternativeOperators) {
16836   // Test case for ensuring alternate operators are not
16837   // combined with their right most neighbour.
16838   verifyFormat("int a and b;");
16839   verifyFormat("int a and_eq b;");
16840   verifyFormat("int a bitand b;");
16841   verifyFormat("int a bitor b;");
16842   verifyFormat("int a compl b;");
16843   verifyFormat("int a not b;");
16844   verifyFormat("int a not_eq b;");
16845   verifyFormat("int a or b;");
16846   verifyFormat("int a xor b;");
16847   verifyFormat("int a xor_eq b;");
16848   verifyFormat("return this not_eq bitand other;");
16849   verifyFormat("bool operator not_eq(const X bitand other)");
16850 
16851   verifyFormat("int a and 5;");
16852   verifyFormat("int a and_eq 5;");
16853   verifyFormat("int a bitand 5;");
16854   verifyFormat("int a bitor 5;");
16855   verifyFormat("int a compl 5;");
16856   verifyFormat("int a not 5;");
16857   verifyFormat("int a not_eq 5;");
16858   verifyFormat("int a or 5;");
16859   verifyFormat("int a xor 5;");
16860   verifyFormat("int a xor_eq 5;");
16861 
16862   verifyFormat("int a compl(5);");
16863   verifyFormat("int a not(5);");
16864 
16865   /* FIXME handle alternate tokens
16866    * https://en.cppreference.com/w/cpp/language/operator_alternative
16867   // alternative tokens
16868   verifyFormat("compl foo();");     //  ~foo();
16869   verifyFormat("foo() <%%>;");      // foo();
16870   verifyFormat("void foo() <%%>;"); // void foo(){}
16871   verifyFormat("int a <:1:>;");     // int a[1];[
16872   verifyFormat("%:define ABC abc"); // #define ABC abc
16873   verifyFormat("%:%:");             // ##
16874   */
16875 }
16876 
16877 TEST_F(FormatTest, STLWhileNotDefineChed) {
16878   verifyFormat("#if defined(while)\n"
16879                "#define while EMIT WARNING C4005\n"
16880                "#endif // while");
16881 }
16882 
16883 TEST_F(FormatTest, OperatorSpacing) {
16884   FormatStyle Style = getLLVMStyle();
16885   Style.PointerAlignment = FormatStyle::PAS_Right;
16886   verifyFormat("Foo::operator*();", Style);
16887   verifyFormat("Foo::operator void *();", Style);
16888   verifyFormat("Foo::operator void **();", Style);
16889   verifyFormat("Foo::operator void *&();", Style);
16890   verifyFormat("Foo::operator void *&&();", Style);
16891   verifyFormat("Foo::operator()(void *);", Style);
16892   verifyFormat("Foo::operator*(void *);", Style);
16893   verifyFormat("Foo::operator*();", Style);
16894   verifyFormat("Foo::operator**();", Style);
16895   verifyFormat("Foo::operator&();", Style);
16896   verifyFormat("Foo::operator<int> *();", Style);
16897   verifyFormat("Foo::operator<Foo> *();", Style);
16898   verifyFormat("Foo::operator<int> **();", Style);
16899   verifyFormat("Foo::operator<Foo> **();", Style);
16900   verifyFormat("Foo::operator<int> &();", Style);
16901   verifyFormat("Foo::operator<Foo> &();", Style);
16902   verifyFormat("Foo::operator<int> &&();", Style);
16903   verifyFormat("Foo::operator<Foo> &&();", Style);
16904   verifyFormat("Foo::operator<int> *&();", Style);
16905   verifyFormat("Foo::operator<Foo> *&();", Style);
16906   verifyFormat("Foo::operator<int> *&&();", Style);
16907   verifyFormat("Foo::operator<Foo> *&&();", Style);
16908   verifyFormat("operator*(int (*)(), class Foo);", Style);
16909 
16910   verifyFormat("Foo::operator&();", Style);
16911   verifyFormat("Foo::operator void &();", Style);
16912   verifyFormat("Foo::operator()(void &);", Style);
16913   verifyFormat("Foo::operator&(void &);", Style);
16914   verifyFormat("Foo::operator&();", Style);
16915   verifyFormat("operator&(int (&)(), class Foo);", Style);
16916 
16917   verifyFormat("Foo::operator&&();", Style);
16918   verifyFormat("Foo::operator**();", Style);
16919   verifyFormat("Foo::operator void &&();", Style);
16920   verifyFormat("Foo::operator()(void &&);", Style);
16921   verifyFormat("Foo::operator&&(void &&);", Style);
16922   verifyFormat("Foo::operator&&();", Style);
16923   verifyFormat("operator&&(int(&&)(), class Foo);", Style);
16924   verifyFormat("operator const nsTArrayRight<E> &()", Style);
16925   verifyFormat("[[nodiscard]] operator const nsTArrayRight<E, Allocator> &()",
16926                Style);
16927   verifyFormat("operator void **()", Style);
16928   verifyFormat("operator const FooRight<Object> &()", Style);
16929   verifyFormat("operator const FooRight<Object> *()", Style);
16930   verifyFormat("operator const FooRight<Object> **()", Style);
16931   verifyFormat("operator const FooRight<Object> *&()", Style);
16932   verifyFormat("operator const FooRight<Object> *&&()", Style);
16933 
16934   Style.PointerAlignment = FormatStyle::PAS_Left;
16935   verifyFormat("Foo::operator*();", Style);
16936   verifyFormat("Foo::operator**();", Style);
16937   verifyFormat("Foo::operator void*();", Style);
16938   verifyFormat("Foo::operator void**();", Style);
16939   verifyFormat("Foo::operator void*&();", Style);
16940   verifyFormat("Foo::operator/*comment*/ void*();", Style);
16941   verifyFormat("Foo::operator/*a*/ const /*b*/ void*();", Style);
16942   verifyFormat("Foo::operator/*a*/ volatile /*b*/ void*();", Style);
16943   verifyFormat("Foo::operator()(void*);", Style);
16944   verifyFormat("Foo::operator*(void*);", Style);
16945   verifyFormat("Foo::operator*();", Style);
16946   verifyFormat("Foo::operator<int>*();", Style);
16947   verifyFormat("Foo::operator<Foo>*();", Style);
16948   verifyFormat("Foo::operator<int>**();", Style);
16949   verifyFormat("Foo::operator<Foo>**();", Style);
16950   verifyFormat("Foo::operator<Foo>*&();", Style);
16951   verifyFormat("Foo::operator<int>&();", Style);
16952   verifyFormat("Foo::operator<Foo>&();", Style);
16953   verifyFormat("Foo::operator<int>&&();", Style);
16954   verifyFormat("Foo::operator<Foo>&&();", Style);
16955   verifyFormat("Foo::operator<int>*&();", Style);
16956   verifyFormat("Foo::operator<Foo>*&();", Style);
16957   verifyFormat("operator*(int (*)(), class Foo);", Style);
16958 
16959   verifyFormat("Foo::operator&();", Style);
16960   verifyFormat("Foo::operator void&();", Style);
16961   verifyFormat("Foo::operator/*comment*/ void&();", Style);
16962   verifyFormat("Foo::operator/*a*/ const /*b*/ void&();", Style);
16963   verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&();", Style);
16964   verifyFormat("Foo::operator()(void&);", Style);
16965   verifyFormat("Foo::operator&(void&);", Style);
16966   verifyFormat("Foo::operator&();", Style);
16967   verifyFormat("operator&(int (&)(), class Foo);", Style);
16968 
16969   verifyFormat("Foo::operator&&();", Style);
16970   verifyFormat("Foo::operator void&&();", Style);
16971   verifyFormat("Foo::operator/*comment*/ void&&();", Style);
16972   verifyFormat("Foo::operator/*a*/ const /*b*/ void&&();", Style);
16973   verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&&();", Style);
16974   verifyFormat("Foo::operator()(void&&);", Style);
16975   verifyFormat("Foo::operator&&(void&&);", Style);
16976   verifyFormat("Foo::operator&&();", Style);
16977   verifyFormat("operator&&(int(&&)(), class Foo);", Style);
16978   verifyFormat("operator const nsTArrayLeft<E>&()", Style);
16979   verifyFormat("[[nodiscard]] operator const nsTArrayLeft<E, Allocator>&()",
16980                Style);
16981   verifyFormat("operator void**()", Style);
16982   verifyFormat("operator const FooLeft<Object>&()", Style);
16983   verifyFormat("operator const FooLeft<Object>*()", Style);
16984   verifyFormat("operator const FooLeft<Object>**()", Style);
16985   verifyFormat("operator const FooLeft<Object>*&()", Style);
16986   verifyFormat("operator const FooLeft<Object>*&&()", Style);
16987 
16988   // PR45107
16989   verifyFormat("operator Vector<String>&();", Style);
16990   verifyFormat("operator const Vector<String>&();", Style);
16991   verifyFormat("operator foo::Bar*();", Style);
16992   verifyFormat("operator const Foo<X>::Bar<Y>*();", Style);
16993   verifyFormat("operator/*a*/ const /*b*/ Foo /*c*/<X> /*d*/ ::Bar<Y>*();",
16994                Style);
16995 
16996   Style.PointerAlignment = FormatStyle::PAS_Middle;
16997   verifyFormat("Foo::operator*();", Style);
16998   verifyFormat("Foo::operator void *();", Style);
16999   verifyFormat("Foo::operator()(void *);", Style);
17000   verifyFormat("Foo::operator*(void *);", Style);
17001   verifyFormat("Foo::operator*();", Style);
17002   verifyFormat("operator*(int (*)(), class Foo);", Style);
17003 
17004   verifyFormat("Foo::operator&();", Style);
17005   verifyFormat("Foo::operator void &();", Style);
17006   verifyFormat("Foo::operator()(void &);", Style);
17007   verifyFormat("Foo::operator&(void &);", Style);
17008   verifyFormat("Foo::operator&();", Style);
17009   verifyFormat("operator&(int (&)(), class Foo);", Style);
17010 
17011   verifyFormat("Foo::operator&&();", Style);
17012   verifyFormat("Foo::operator void &&();", Style);
17013   verifyFormat("Foo::operator()(void &&);", Style);
17014   verifyFormat("Foo::operator&&(void &&);", Style);
17015   verifyFormat("Foo::operator&&();", Style);
17016   verifyFormat("operator&&(int(&&)(), class Foo);", Style);
17017 }
17018 
17019 TEST_F(FormatTest, OperatorPassedAsAFunctionPtr) {
17020   FormatStyle Style = getLLVMStyle();
17021   // PR46157
17022   verifyFormat("foo(operator+, -42);", Style);
17023   verifyFormat("foo(operator++, -42);", Style);
17024   verifyFormat("foo(operator--, -42);", Style);
17025   verifyFormat("foo(-42, operator--);", Style);
17026   verifyFormat("foo(-42, operator, );", Style);
17027   verifyFormat("foo(operator, , -42);", Style);
17028 }
17029 
17030 TEST_F(FormatTest, WhitespaceSensitiveMacros) {
17031   FormatStyle Style = getLLVMStyle();
17032   Style.WhitespaceSensitiveMacros.push_back("FOO");
17033 
17034   // Don't use the helpers here, since 'mess up' will change the whitespace
17035   // and these are all whitespace sensitive by definition
17036   EXPECT_EQ("FOO(String-ized&Messy+But(: :Still)=Intentional);",
17037             format("FOO(String-ized&Messy+But(: :Still)=Intentional);", Style));
17038   EXPECT_EQ(
17039       "FOO(String-ized&Messy+But\\(: :Still)=Intentional);",
17040       format("FOO(String-ized&Messy+But\\(: :Still)=Intentional);", Style));
17041   EXPECT_EQ("FOO(String-ized&Messy+But,: :Still=Intentional);",
17042             format("FOO(String-ized&Messy+But,: :Still=Intentional);", Style));
17043   EXPECT_EQ("FOO(String-ized&Messy+But,: :\n"
17044             "       Still=Intentional);",
17045             format("FOO(String-ized&Messy+But,: :\n"
17046                    "       Still=Intentional);",
17047                    Style));
17048   Style.AlignConsecutiveAssignments = true;
17049   EXPECT_EQ("FOO(String-ized=&Messy+But,: :\n"
17050             "       Still=Intentional);",
17051             format("FOO(String-ized=&Messy+But,: :\n"
17052                    "       Still=Intentional);",
17053                    Style));
17054 
17055   Style.ColumnLimit = 21;
17056   EXPECT_EQ("FOO(String-ized&Messy+But: :Still=Intentional);",
17057             format("FOO(String-ized&Messy+But: :Still=Intentional);", Style));
17058 }
17059 
17060 TEST_F(FormatTest, VeryLongNamespaceCommentSplit) {
17061   // These tests are not in NamespaceFixer because that doesn't
17062   // test its interaction with line wrapping
17063   FormatStyle Style = getLLVMStyle();
17064   Style.ColumnLimit = 80;
17065   verifyFormat("namespace {\n"
17066                "int i;\n"
17067                "int j;\n"
17068                "} // namespace",
17069                Style);
17070 
17071   verifyFormat("namespace AAA {\n"
17072                "int i;\n"
17073                "int j;\n"
17074                "} // namespace AAA",
17075                Style);
17076 
17077   EXPECT_EQ("namespace Averyveryveryverylongnamespace {\n"
17078             "int i;\n"
17079             "int j;\n"
17080             "} // namespace Averyveryveryverylongnamespace",
17081             format("namespace Averyveryveryverylongnamespace {\n"
17082                    "int i;\n"
17083                    "int j;\n"
17084                    "}",
17085                    Style));
17086 
17087   EXPECT_EQ(
17088       "namespace "
17089       "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::\n"
17090       "    went::mad::now {\n"
17091       "int i;\n"
17092       "int j;\n"
17093       "} // namespace\n"
17094       "  // "
17095       "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::"
17096       "went::mad::now",
17097       format("namespace "
17098              "would::it::save::you::a::lot::of::time::if_::i::"
17099              "just::gave::up::and_::went::mad::now {\n"
17100              "int i;\n"
17101              "int j;\n"
17102              "}",
17103              Style));
17104 
17105   // This used to duplicate the comment again and again on subsequent runs
17106   EXPECT_EQ(
17107       "namespace "
17108       "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::\n"
17109       "    went::mad::now {\n"
17110       "int i;\n"
17111       "int j;\n"
17112       "} // namespace\n"
17113       "  // "
17114       "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::"
17115       "went::mad::now",
17116       format("namespace "
17117              "would::it::save::you::a::lot::of::time::if_::i::"
17118              "just::gave::up::and_::went::mad::now {\n"
17119              "int i;\n"
17120              "int j;\n"
17121              "} // namespace\n"
17122              "  // "
17123              "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::"
17124              "and_::went::mad::now",
17125              Style));
17126 }
17127 
17128 TEST_F(FormatTest, LikelyUnlikely) {
17129   FormatStyle Style = getLLVMStyle();
17130 
17131   verifyFormat("if (argc > 5) [[unlikely]] {\n"
17132                "  return 29;\n"
17133                "}",
17134                Style);
17135 
17136   verifyFormat("if (argc > 5) [[likely]] {\n"
17137                "  return 29;\n"
17138                "}",
17139                Style);
17140 
17141   verifyFormat("if (argc > 5) [[unlikely]] {\n"
17142                "  return 29;\n"
17143                "} else [[likely]] {\n"
17144                "  return 42;\n"
17145                "}\n",
17146                Style);
17147 
17148   verifyFormat("if (argc > 5) [[unlikely]] {\n"
17149                "  return 29;\n"
17150                "} else if (argc > 10) [[likely]] {\n"
17151                "  return 99;\n"
17152                "} else {\n"
17153                "  return 42;\n"
17154                "}\n",
17155                Style);
17156 
17157   verifyFormat("if (argc > 5) [[gnu::unused]] {\n"
17158                "  return 29;\n"
17159                "}",
17160                Style);
17161 }
17162 
17163 TEST_F(FormatTest, LLVMDefaultStyle) {
17164   FormatStyle Style = getLLVMStyle();
17165   verifyFormat("extern \"C\" {\n"
17166                "int foo();\n"
17167                "}",
17168                Style);
17169 }
17170 TEST_F(FormatTest, GNUDefaultStyle) {
17171   FormatStyle Style = getGNUStyle();
17172   verifyFormat("extern \"C\"\n"
17173                "{\n"
17174                "  int foo ();\n"
17175                "}",
17176                Style);
17177 }
17178 TEST_F(FormatTest, MozillaDefaultStyle) {
17179   FormatStyle Style = getMozillaStyle();
17180   verifyFormat("extern \"C\"\n"
17181                "{\n"
17182                "  int foo();\n"
17183                "}",
17184                Style);
17185 }
17186 TEST_F(FormatTest, GoogleDefaultStyle) {
17187   FormatStyle Style = getGoogleStyle();
17188   verifyFormat("extern \"C\" {\n"
17189                "int foo();\n"
17190                "}",
17191                Style);
17192 }
17193 TEST_F(FormatTest, ChromiumDefaultStyle) {
17194   FormatStyle Style = getChromiumStyle(FormatStyle::LanguageKind::LK_Cpp);
17195   verifyFormat("extern \"C\" {\n"
17196                "int foo();\n"
17197                "}",
17198                Style);
17199 }
17200 TEST_F(FormatTest, MicrosoftDefaultStyle) {
17201   FormatStyle Style = getMicrosoftStyle(FormatStyle::LanguageKind::LK_Cpp);
17202   verifyFormat("extern \"C\"\n"
17203                "{\n"
17204                "    int foo();\n"
17205                "}",
17206                Style);
17207 }
17208 TEST_F(FormatTest, WebKitDefaultStyle) {
17209   FormatStyle Style = getWebKitStyle();
17210   verifyFormat("extern \"C\" {\n"
17211                "int foo();\n"
17212                "}",
17213                Style);
17214 }
17215 } // namespace
17216 } // namespace format
17217 } // namespace clang
17218