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, AllowAllArgumentsOnNextLineDontAlign) {
4996   // Check that AllowAllArgumentsOnNextLine is respected for both BAS_DontAlign
4997   // and BAS_Align.
4998   auto Style = getLLVMStyle();
4999   Style.ColumnLimit = 35;
5000   StringRef Input = "functionCall(paramA, paramB, paramC);\n"
5001                     "void functionDecl(int A, int B, int C);";
5002   Style.AllowAllArgumentsOnNextLine = false;
5003   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5004   EXPECT_EQ(StringRef("functionCall(paramA, paramB,\n"
5005                       "    paramC);\n"
5006                       "void functionDecl(int A, int B,\n"
5007                       "    int C);"),
5008             format(Input, Style));
5009   Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
5010   EXPECT_EQ(StringRef("functionCall(paramA, paramB,\n"
5011                       "             paramC);\n"
5012                       "void functionDecl(int A, int B,\n"
5013                       "                  int C);"),
5014             format(Input, Style));
5015   // However, BAS_AlwaysBreak should take precedence over
5016   // AllowAllArgumentsOnNextLine.
5017   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5018   EXPECT_EQ(StringRef("functionCall(\n"
5019                       "    paramA, paramB, paramC);\n"
5020                       "void functionDecl(\n"
5021                       "    int A, int B, int C);"),
5022             format(Input, Style));
5023 
5024   // When AllowAllArgumentsOnNextLine is set, we prefer breaking before the
5025   // first argument.
5026   Style.AllowAllArgumentsOnNextLine = true;
5027   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5028   EXPECT_EQ(StringRef("functionCall(\n"
5029                       "    paramA, paramB, paramC);\n"
5030                       "void functionDecl(\n"
5031                       "    int A, int B, int C);"),
5032             format(Input, Style));
5033   // It wouldn't fit on one line with aligned parameters so this setting
5034   // doesn't change anything for BAS_Align.
5035   Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
5036   EXPECT_EQ(StringRef("functionCall(paramA, paramB,\n"
5037                       "             paramC);\n"
5038                       "void functionDecl(int A, int B,\n"
5039                       "                  int C);"),
5040             format(Input, Style));
5041   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5042   EXPECT_EQ(StringRef("functionCall(\n"
5043                       "    paramA, paramB, paramC);\n"
5044                       "void functionDecl(\n"
5045                       "    int A, int B, int C);"),
5046             format(Input, Style));
5047 }
5048 
5049 TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
5050   FormatStyle Style = getLLVMStyle();
5051   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
5052 
5053   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
5054   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
5055                getStyleWithColumns(Style, 45));
5056   verifyFormat("Constructor() :\n"
5057                "    Initializer(FitsOnTheLine) {}",
5058                getStyleWithColumns(Style, 44));
5059   verifyFormat("Constructor() :\n"
5060                "    Initializer(FitsOnTheLine) {}",
5061                getStyleWithColumns(Style, 43));
5062 
5063   verifyFormat("template <typename T>\n"
5064                "Constructor() : Initializer(FitsOnTheLine) {}",
5065                getStyleWithColumns(Style, 50));
5066   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
5067   verifyFormat(
5068       "SomeClass::Constructor() :\n"
5069       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
5070       Style);
5071 
5072   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = false;
5073   verifyFormat(
5074       "SomeClass::Constructor() :\n"
5075       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
5076       Style);
5077 
5078   verifyFormat(
5079       "SomeClass::Constructor() :\n"
5080       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
5081       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
5082       Style);
5083   verifyFormat(
5084       "SomeClass::Constructor() :\n"
5085       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5086       "    aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
5087       Style);
5088   verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5089                "            aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5090                "    aaaaaaaaaa(aaaaaa) {}",
5091                Style);
5092 
5093   verifyFormat("Constructor() :\n"
5094                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5095                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5096                "                             aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5097                "    aaaaaaaaaaaaaaaaaaaaaaa() {}",
5098                Style);
5099 
5100   verifyFormat("Constructor() :\n"
5101                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5102                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5103                Style);
5104 
5105   verifyFormat("Constructor(int Parameter = 0) :\n"
5106                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
5107                "    aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
5108                Style);
5109   verifyFormat("Constructor() :\n"
5110                "    aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
5111                "}",
5112                getStyleWithColumns(Style, 60));
5113   verifyFormat("Constructor() :\n"
5114                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5115                "        aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
5116                Style);
5117 
5118   // Here a line could be saved by splitting the second initializer onto two
5119   // lines, but that is not desirable.
5120   verifyFormat("Constructor() :\n"
5121                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
5122                "    aaaaaaaaaaa(aaaaaaaaaaa),\n"
5123                "    aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5124                Style);
5125 
5126   FormatStyle OnePerLine = Style;
5127   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
5128   OnePerLine.AllowAllConstructorInitializersOnNextLine = false;
5129   verifyFormat("SomeClass::Constructor() :\n"
5130                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
5131                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
5132                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
5133                OnePerLine);
5134   verifyFormat("SomeClass::Constructor() :\n"
5135                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
5136                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
5137                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
5138                OnePerLine);
5139   verifyFormat("MyClass::MyClass(int var) :\n"
5140                "    some_var_(var),            // 4 space indent\n"
5141                "    some_other_var_(var + 1) { // lined up\n"
5142                "}",
5143                OnePerLine);
5144   verifyFormat("Constructor() :\n"
5145                "    aaaaa(aaaaaa),\n"
5146                "    aaaaa(aaaaaa),\n"
5147                "    aaaaa(aaaaaa),\n"
5148                "    aaaaa(aaaaaa),\n"
5149                "    aaaaa(aaaaaa) {}",
5150                OnePerLine);
5151   verifyFormat("Constructor() :\n"
5152                "    aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5153                "          aaaaaaaaaaaaaaaaaaaaaa) {}",
5154                OnePerLine);
5155   OnePerLine.BinPackParameters = false;
5156   verifyFormat("Constructor() :\n"
5157                "    aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5158                "        aaaaaaaaaaa().aaa(),\n"
5159                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5160                OnePerLine);
5161   OnePerLine.ColumnLimit = 60;
5162   verifyFormat("Constructor() :\n"
5163                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
5164                "    bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
5165                OnePerLine);
5166 
5167   EXPECT_EQ("Constructor() :\n"
5168             "    // Comment forcing unwanted break.\n"
5169             "    aaaa(aaaa) {}",
5170             format("Constructor() :\n"
5171                    "    // Comment forcing unwanted break.\n"
5172                    "    aaaa(aaaa) {}",
5173                    Style));
5174 
5175   Style.ColumnLimit = 0;
5176   verifyFormat("SomeClass::Constructor() :\n"
5177                "    a(a) {}",
5178                Style);
5179   verifyFormat("SomeClass::Constructor() noexcept :\n"
5180                "    a(a) {}",
5181                Style);
5182   verifyFormat("SomeClass::Constructor() :\n"
5183                "    a(a), b(b), c(c) {}",
5184                Style);
5185   verifyFormat("SomeClass::Constructor() :\n"
5186                "    a(a) {\n"
5187                "  foo();\n"
5188                "  bar();\n"
5189                "}",
5190                Style);
5191 
5192   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
5193   verifyFormat("SomeClass::Constructor() :\n"
5194                "    a(a), b(b), c(c) {\n"
5195                "}",
5196                Style);
5197   verifyFormat("SomeClass::Constructor() :\n"
5198                "    a(a) {\n"
5199                "}",
5200                Style);
5201 
5202   Style.ColumnLimit = 80;
5203   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
5204   Style.ConstructorInitializerIndentWidth = 2;
5205   verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}", Style);
5206   verifyFormat("SomeClass::Constructor() :\n"
5207                "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5208                "  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
5209                Style);
5210 
5211   // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as
5212   // well
5213   Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
5214   verifyFormat(
5215       "class SomeClass\n"
5216       "  : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5217       "    public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
5218       Style);
5219   Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
5220   verifyFormat(
5221       "class SomeClass\n"
5222       "  : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5223       "  , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
5224       Style);
5225   Style.BreakInheritanceList = FormatStyle::BILS_AfterColon;
5226   verifyFormat(
5227       "class SomeClass :\n"
5228       "  public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5229       "  public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
5230       Style);
5231 }
5232 
5233 #ifndef EXPENSIVE_CHECKS
5234 // Expensive checks enables libstdc++ checking which includes validating the
5235 // state of ranges used in std::priority_queue - this blows out the
5236 // runtime/scalability of the function and makes this test unacceptably slow.
5237 TEST_F(FormatTest, MemoizationTests) {
5238   // This breaks if the memoization lookup does not take \c Indent and
5239   // \c LastSpace into account.
5240   verifyFormat(
5241       "extern CFRunLoopTimerRef\n"
5242       "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
5243       "                     CFTimeInterval interval, CFOptionFlags flags,\n"
5244       "                     CFIndex order, CFRunLoopTimerCallBack callout,\n"
5245       "                     CFRunLoopTimerContext *context) {}");
5246 
5247   // Deep nesting somewhat works around our memoization.
5248   verifyFormat(
5249       "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
5250       "    aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
5251       "        aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
5252       "            aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
5253       "                aaaaa())))))))))))))))))))))))))))))))))))))));",
5254       getLLVMStyleWithColumns(65));
5255   verifyFormat(
5256       "aaaaa(\n"
5257       "    aaaaa,\n"
5258       "    aaaaa(\n"
5259       "        aaaaa,\n"
5260       "        aaaaa(\n"
5261       "            aaaaa,\n"
5262       "            aaaaa(\n"
5263       "                aaaaa,\n"
5264       "                aaaaa(\n"
5265       "                    aaaaa,\n"
5266       "                    aaaaa(\n"
5267       "                        aaaaa,\n"
5268       "                        aaaaa(\n"
5269       "                            aaaaa,\n"
5270       "                            aaaaa(\n"
5271       "                                aaaaa,\n"
5272       "                                aaaaa(\n"
5273       "                                    aaaaa,\n"
5274       "                                    aaaaa(\n"
5275       "                                        aaaaa,\n"
5276       "                                        aaaaa(\n"
5277       "                                            aaaaa,\n"
5278       "                                            aaaaa(\n"
5279       "                                                aaaaa,\n"
5280       "                                                aaaaa))))))))))));",
5281       getLLVMStyleWithColumns(65));
5282   verifyFormat(
5283       "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"
5284       "                                  a),\n"
5285       "                                a),\n"
5286       "                              a),\n"
5287       "                            a),\n"
5288       "                          a),\n"
5289       "                        a),\n"
5290       "                      a),\n"
5291       "                    a),\n"
5292       "                  a),\n"
5293       "                a),\n"
5294       "              a),\n"
5295       "            a),\n"
5296       "          a),\n"
5297       "        a),\n"
5298       "      a),\n"
5299       "    a),\n"
5300       "  a)",
5301       getLLVMStyleWithColumns(65));
5302 
5303   // This test takes VERY long when memoization is broken.
5304   FormatStyle OnePerLine = getLLVMStyle();
5305   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
5306   OnePerLine.BinPackParameters = false;
5307   std::string input = "Constructor()\n"
5308                       "    : aaaa(a,\n";
5309   for (unsigned i = 0, e = 80; i != e; ++i) {
5310     input += "           a,\n";
5311   }
5312   input += "           a) {}";
5313   verifyFormat(input, OnePerLine);
5314 }
5315 #endif
5316 
5317 TEST_F(FormatTest, BreaksAsHighAsPossible) {
5318   verifyFormat(
5319       "void f() {\n"
5320       "  if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
5321       "      (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
5322       "    f();\n"
5323       "}");
5324   verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
5325                "    Intervals[i - 1].getRange().getLast()) {\n}");
5326 }
5327 
5328 TEST_F(FormatTest, BreaksFunctionDeclarations) {
5329   // Principially, we break function declarations in a certain order:
5330   // 1) break amongst arguments.
5331   verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
5332                "                              Cccccccccccccc cccccccccccccc);");
5333   verifyFormat("template <class TemplateIt>\n"
5334                "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
5335                "                            TemplateIt *stop) {}");
5336 
5337   // 2) break after return type.
5338   verifyFormat(
5339       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5340       "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
5341       getGoogleStyle());
5342 
5343   // 3) break after (.
5344   verifyFormat(
5345       "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
5346       "    Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
5347       getGoogleStyle());
5348 
5349   // 4) break before after nested name specifiers.
5350   verifyFormat(
5351       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5352       "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
5353       "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
5354       getGoogleStyle());
5355 
5356   // However, there are exceptions, if a sufficient amount of lines can be
5357   // saved.
5358   // FIXME: The precise cut-offs wrt. the number of saved lines might need some
5359   // more adjusting.
5360   verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
5361                "                                  Cccccccccccccc cccccccccc,\n"
5362                "                                  Cccccccccccccc cccccccccc,\n"
5363                "                                  Cccccccccccccc cccccccccc,\n"
5364                "                                  Cccccccccccccc cccccccccc);");
5365   verifyFormat(
5366       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5367       "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
5368       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
5369       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
5370       getGoogleStyle());
5371   verifyFormat(
5372       "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
5373       "                                          Cccccccccccccc cccccccccc,\n"
5374       "                                          Cccccccccccccc cccccccccc,\n"
5375       "                                          Cccccccccccccc cccccccccc,\n"
5376       "                                          Cccccccccccccc cccccccccc,\n"
5377       "                                          Cccccccccccccc cccccccccc,\n"
5378       "                                          Cccccccccccccc cccccccccc);");
5379   verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
5380                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
5381                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
5382                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
5383                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
5384 
5385   // Break after multi-line parameters.
5386   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5387                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5388                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5389                "    bbbb bbbb);");
5390   verifyFormat("void SomeLoooooooooooongFunction(\n"
5391                "    std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
5392                "        aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5393                "    int bbbbbbbbbbbbb);");
5394 
5395   // Treat overloaded operators like other functions.
5396   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
5397                "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
5398   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
5399                "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
5400   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
5401                "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
5402   verifyGoogleFormat(
5403       "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
5404       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
5405   verifyGoogleFormat(
5406       "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
5407       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
5408   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5409                "    int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
5410   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
5411                "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
5412   verifyGoogleFormat(
5413       "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
5414       "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5415       "    bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
5416   verifyGoogleFormat("template <typename T>\n"
5417                      "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5418                      "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
5419                      "    aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
5420 
5421   FormatStyle Style = getLLVMStyle();
5422   Style.PointerAlignment = FormatStyle::PAS_Left;
5423   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5424                "    aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
5425                Style);
5426   verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
5427                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5428                Style);
5429 }
5430 
5431 TEST_F(FormatTest, DontBreakBeforeQualifiedOperator) {
5432   // Regression test for https://bugs.llvm.org/show_bug.cgi?id=40516:
5433   // Prefer keeping `::` followed by `operator` together.
5434   EXPECT_EQ("const aaaa::bbbbbbb &\n"
5435             "ccccccccc::operator++() {\n"
5436             "  stuff();\n"
5437             "}",
5438             format("const aaaa::bbbbbbb\n"
5439                    "&ccccccccc::operator++() { stuff(); }",
5440                    getLLVMStyleWithColumns(40)));
5441 }
5442 
5443 TEST_F(FormatTest, TrailingReturnType) {
5444   verifyFormat("auto foo() -> int;\n");
5445   // correct trailing return type spacing
5446   verifyFormat("auto operator->() -> int;\n");
5447   verifyFormat("auto operator++(int) -> int;\n");
5448 
5449   verifyFormat("struct S {\n"
5450                "  auto bar() const -> int;\n"
5451                "};");
5452   verifyFormat("template <size_t Order, typename T>\n"
5453                "auto load_img(const std::string &filename)\n"
5454                "    -> alias::tensor<Order, T, mem::tag::cpu> {}");
5455   verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
5456                "    -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
5457   verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
5458   verifyFormat("template <typename T>\n"
5459                "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
5460                "    -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
5461 
5462   // Not trailing return types.
5463   verifyFormat("void f() { auto a = b->c(); }");
5464 }
5465 
5466 TEST_F(FormatTest, DeductionGuides) {
5467   verifyFormat("template <class T> A(const T &, const T &) -> A<T &>;");
5468   verifyFormat("template <class T> explicit A(T &, T &&) -> A<T>;");
5469   verifyFormat("template <class... Ts> S(Ts...) -> S<Ts...>;");
5470   verifyFormat(
5471       "template <class... T>\n"
5472       "array(T &&...t) -> array<std::common_type_t<T...>, sizeof...(T)>;");
5473   verifyFormat("template <class T> A() -> A<decltype(p->foo<3>())>;");
5474   verifyFormat("template <class T> A() -> A<decltype(foo<traits<1>>)>;");
5475   verifyFormat("template <class T> A() -> A<sizeof(p->foo<1>)>;");
5476   verifyFormat("template <class T> A() -> A<(3 < 2)>;");
5477   verifyFormat("template <class T> A() -> A<((3) < (2))>;");
5478   verifyFormat("template <class T> x() -> x<1>;");
5479   verifyFormat("template <class T> explicit x(T &) -> x<1>;");
5480 
5481   // Ensure not deduction guides.
5482   verifyFormat("c()->f<int>();");
5483   verifyFormat("x()->foo<1>;");
5484   verifyFormat("x = p->foo<3>();");
5485   verifyFormat("x()->x<1>();");
5486   verifyFormat("x()->x<1>;");
5487 }
5488 
5489 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
5490   // Avoid breaking before trailing 'const' or other trailing annotations, if
5491   // they are not function-like.
5492   FormatStyle Style = getGoogleStyle();
5493   Style.ColumnLimit = 47;
5494   verifyFormat("void someLongFunction(\n"
5495                "    int someLoooooooooooooongParameter) const {\n}",
5496                getLLVMStyleWithColumns(47));
5497   verifyFormat("LoooooongReturnType\n"
5498                "someLoooooooongFunction() const {}",
5499                getLLVMStyleWithColumns(47));
5500   verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
5501                "    const {}",
5502                Style);
5503   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
5504                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
5505   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
5506                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
5507   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
5508                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
5509   verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
5510                "                   aaaaaaaaaaa aaaaa) const override;");
5511   verifyGoogleFormat(
5512       "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5513       "    const override;");
5514 
5515   // Even if the first parameter has to be wrapped.
5516   verifyFormat("void someLongFunction(\n"
5517                "    int someLongParameter) const {}",
5518                getLLVMStyleWithColumns(46));
5519   verifyFormat("void someLongFunction(\n"
5520                "    int someLongParameter) const {}",
5521                Style);
5522   verifyFormat("void someLongFunction(\n"
5523                "    int someLongParameter) override {}",
5524                Style);
5525   verifyFormat("void someLongFunction(\n"
5526                "    int someLongParameter) OVERRIDE {}",
5527                Style);
5528   verifyFormat("void someLongFunction(\n"
5529                "    int someLongParameter) final {}",
5530                Style);
5531   verifyFormat("void someLongFunction(\n"
5532                "    int someLongParameter) FINAL {}",
5533                Style);
5534   verifyFormat("void someLongFunction(\n"
5535                "    int parameter) const override {}",
5536                Style);
5537 
5538   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
5539   verifyFormat("void someLongFunction(\n"
5540                "    int someLongParameter) const\n"
5541                "{\n"
5542                "}",
5543                Style);
5544 
5545   Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths;
5546   verifyFormat("void someLongFunction(\n"
5547                "    int someLongParameter) const\n"
5548                "  {\n"
5549                "  }",
5550                Style);
5551 
5552   // Unless these are unknown annotations.
5553   verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
5554                "                  aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5555                "    LONG_AND_UGLY_ANNOTATION;");
5556 
5557   // Breaking before function-like trailing annotations is fine to keep them
5558   // close to their arguments.
5559   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5560                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
5561   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
5562                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
5563   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
5564                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
5565   verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
5566                      "    AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
5567   verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
5568 
5569   verifyFormat(
5570       "void aaaaaaaaaaaaaaaaaa()\n"
5571       "    __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
5572       "                   aaaaaaaaaaaaaaaaaaaaaaaaa));");
5573   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5574                "    __attribute__((unused));");
5575   verifyGoogleFormat(
5576       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5577       "    GUARDED_BY(aaaaaaaaaaaa);");
5578   verifyGoogleFormat(
5579       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5580       "    GUARDED_BY(aaaaaaaaaaaa);");
5581   verifyGoogleFormat(
5582       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
5583       "    aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5584   verifyGoogleFormat(
5585       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
5586       "    aaaaaaaaaaaaaaaaaaaaaaaaa;");
5587 }
5588 
5589 TEST_F(FormatTest, FunctionAnnotations) {
5590   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
5591                "int OldFunction(const string &parameter) {}");
5592   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
5593                "string OldFunction(const string &parameter) {}");
5594   verifyFormat("template <typename T>\n"
5595                "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
5596                "string OldFunction(const string &parameter) {}");
5597 
5598   // Not function annotations.
5599   verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5600                "                << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
5601   verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
5602                "       ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
5603   verifyFormat("MACRO(abc).function() // wrap\n"
5604                "    << abc;");
5605   verifyFormat("MACRO(abc)->function() // wrap\n"
5606                "    << abc;");
5607   verifyFormat("MACRO(abc)::function() // wrap\n"
5608                "    << abc;");
5609 }
5610 
5611 TEST_F(FormatTest, BreaksDesireably) {
5612   verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
5613                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
5614                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
5615   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5616                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
5617                "}");
5618 
5619   verifyFormat(
5620       "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5621       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
5622 
5623   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5624                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5625                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
5626 
5627   verifyFormat(
5628       "aaaaaaaa(aaaaaaaaaaaaa,\n"
5629       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5630       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
5631       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5632       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
5633 
5634   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
5635                "    (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5636 
5637   verifyFormat(
5638       "void f() {\n"
5639       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
5640       "                                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5641       "}");
5642   verifyFormat(
5643       "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5644       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
5645   verifyFormat(
5646       "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5647       "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
5648   verifyFormat(
5649       "aaaaaa(aaa,\n"
5650       "       new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5651       "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5652       "       aaaa);");
5653   verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5654                "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5655                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5656 
5657   // Indent consistently independent of call expression and unary operator.
5658   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
5659                "    dddddddddddddddddddddddddddddd));");
5660   verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
5661                "    dddddddddddddddddddddddddddddd));");
5662   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
5663                "    dddddddddddddddddddddddddddddd));");
5664 
5665   // This test case breaks on an incorrect memoization, i.e. an optimization not
5666   // taking into account the StopAt value.
5667   verifyFormat(
5668       "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
5669       "       aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
5670       "       aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
5671       "       (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5672 
5673   verifyFormat("{\n  {\n    {\n"
5674                "      Annotation.SpaceRequiredBefore =\n"
5675                "          Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
5676                "          Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
5677                "    }\n  }\n}");
5678 
5679   // Break on an outer level if there was a break on an inner level.
5680   EXPECT_EQ("f(g(h(a, // comment\n"
5681             "      b, c),\n"
5682             "    d, e),\n"
5683             "  x, y);",
5684             format("f(g(h(a, // comment\n"
5685                    "    b, c), d, e), x, y);"));
5686 
5687   // Prefer breaking similar line breaks.
5688   verifyFormat(
5689       "const int kTrackingOptions = NSTrackingMouseMoved |\n"
5690       "                             NSTrackingMouseEnteredAndExited |\n"
5691       "                             NSTrackingActiveAlways;");
5692 }
5693 
5694 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
5695   FormatStyle NoBinPacking = getGoogleStyle();
5696   NoBinPacking.BinPackParameters = false;
5697   NoBinPacking.BinPackArguments = true;
5698   verifyFormat("void f() {\n"
5699                "  f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
5700                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5701                "}",
5702                NoBinPacking);
5703   verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
5704                "       int aaaaaaaaaaaaaaaaaaaa,\n"
5705                "       int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5706                NoBinPacking);
5707 
5708   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
5709   verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5710                "                        vector<int> bbbbbbbbbbbbbbb);",
5711                NoBinPacking);
5712   // FIXME: This behavior difference is probably not wanted. However, currently
5713   // we cannot distinguish BreakBeforeParameter being set because of the wrapped
5714   // template arguments from BreakBeforeParameter being set because of the
5715   // one-per-line formatting.
5716   verifyFormat(
5717       "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
5718       "                                             aaaaaaaaaa> aaaaaaaaaa);",
5719       NoBinPacking);
5720   verifyFormat(
5721       "void fffffffffff(\n"
5722       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
5723       "        aaaaaaaaaa);");
5724 }
5725 
5726 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
5727   FormatStyle NoBinPacking = getGoogleStyle();
5728   NoBinPacking.BinPackParameters = false;
5729   NoBinPacking.BinPackArguments = false;
5730   verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
5731                "  aaaaaaaaaaaaaaaaaaaa,\n"
5732                "  aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
5733                NoBinPacking);
5734   verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
5735                "        aaaaaaaaaaaaa,\n"
5736                "        aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
5737                NoBinPacking);
5738   verifyFormat(
5739       "aaaaaaaa(aaaaaaaaaaaaa,\n"
5740       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5741       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
5742       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5743       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
5744       NoBinPacking);
5745   verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
5746                "    .aaaaaaaaaaaaaaaaaa();",
5747                NoBinPacking);
5748   verifyFormat("void f() {\n"
5749                "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5750                "      aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
5751                "}",
5752                NoBinPacking);
5753 
5754   verifyFormat(
5755       "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5756       "             aaaaaaaaaaaa,\n"
5757       "             aaaaaaaaaaaa);",
5758       NoBinPacking);
5759   verifyFormat(
5760       "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
5761       "                               ddddddddddddddddddddddddddddd),\n"
5762       "             test);",
5763       NoBinPacking);
5764 
5765   verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
5766                "            aaaaaaaaaaaaaaaaaaaaaaa,\n"
5767                "            aaaaaaaaaaaaaaaaaaaaaaa>\n"
5768                "    aaaaaaaaaaaaaaaaaa;",
5769                NoBinPacking);
5770   verifyFormat("a(\"a\"\n"
5771                "  \"a\",\n"
5772                "  a);");
5773 
5774   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
5775   verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
5776                "                aaaaaaaaa,\n"
5777                "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5778                NoBinPacking);
5779   verifyFormat(
5780       "void f() {\n"
5781       "  aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
5782       "      .aaaaaaa();\n"
5783       "}",
5784       NoBinPacking);
5785   verifyFormat(
5786       "template <class SomeType, class SomeOtherType>\n"
5787       "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
5788       NoBinPacking);
5789 }
5790 
5791 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
5792   FormatStyle Style = getLLVMStyleWithColumns(15);
5793   Style.ExperimentalAutoDetectBinPacking = true;
5794   EXPECT_EQ("aaa(aaaa,\n"
5795             "    aaaa,\n"
5796             "    aaaa);\n"
5797             "aaa(aaaa,\n"
5798             "    aaaa,\n"
5799             "    aaaa);",
5800             format("aaa(aaaa,\n" // one-per-line
5801                    "  aaaa,\n"
5802                    "    aaaa  );\n"
5803                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
5804                    Style));
5805   EXPECT_EQ("aaa(aaaa, aaaa,\n"
5806             "    aaaa);\n"
5807             "aaa(aaaa, aaaa,\n"
5808             "    aaaa);",
5809             format("aaa(aaaa,  aaaa,\n" // bin-packed
5810                    "    aaaa  );\n"
5811                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
5812                    Style));
5813 }
5814 
5815 TEST_F(FormatTest, FormatsBuilderPattern) {
5816   verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
5817                "    .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
5818                "    .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
5819                "    .StartsWith(\".init\", ORDER_INIT)\n"
5820                "    .StartsWith(\".fini\", ORDER_FINI)\n"
5821                "    .StartsWith(\".hash\", ORDER_HASH)\n"
5822                "    .Default(ORDER_TEXT);\n");
5823 
5824   verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
5825                "       aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
5826   verifyFormat("aaaaaaa->aaaaaaa\n"
5827                "    ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5828                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5829                "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
5830   verifyFormat(
5831       "aaaaaaa->aaaaaaa\n"
5832       "    ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5833       "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
5834   verifyFormat(
5835       "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
5836       "    aaaaaaaaaaaaaa);");
5837   verifyFormat(
5838       "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
5839       "    aaaaaa->aaaaaaaaaaaa()\n"
5840       "        ->aaaaaaaaaaaaaaaa(\n"
5841       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5842       "        ->aaaaaaaaaaaaaaaaa();");
5843   verifyGoogleFormat(
5844       "void f() {\n"
5845       "  someo->Add((new util::filetools::Handler(dir))\n"
5846       "                 ->OnEvent1(NewPermanentCallback(\n"
5847       "                     this, &HandlerHolderClass::EventHandlerCBA))\n"
5848       "                 ->OnEvent2(NewPermanentCallback(\n"
5849       "                     this, &HandlerHolderClass::EventHandlerCBB))\n"
5850       "                 ->OnEvent3(NewPermanentCallback(\n"
5851       "                     this, &HandlerHolderClass::EventHandlerCBC))\n"
5852       "                 ->OnEvent5(NewPermanentCallback(\n"
5853       "                     this, &HandlerHolderClass::EventHandlerCBD))\n"
5854       "                 ->OnEvent6(NewPermanentCallback(\n"
5855       "                     this, &HandlerHolderClass::EventHandlerCBE)));\n"
5856       "}");
5857 
5858   verifyFormat(
5859       "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
5860   verifyFormat("aaaaaaaaaaaaaaa()\n"
5861                "    .aaaaaaaaaaaaaaa()\n"
5862                "    .aaaaaaaaaaaaaaa()\n"
5863                "    .aaaaaaaaaaaaaaa()\n"
5864                "    .aaaaaaaaaaaaaaa();");
5865   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
5866                "    .aaaaaaaaaaaaaaa()\n"
5867                "    .aaaaaaaaaaaaaaa()\n"
5868                "    .aaaaaaaaaaaaaaa();");
5869   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
5870                "    .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
5871                "    .aaaaaaaaaaaaaaa();");
5872   verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
5873                "    ->aaaaaaaaaaaaaae(0)\n"
5874                "    ->aaaaaaaaaaaaaaa();");
5875 
5876   // Don't linewrap after very short segments.
5877   verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5878                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5879                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5880   verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5881                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5882                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5883   verifyFormat("aaa()\n"
5884                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5885                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5886                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5887 
5888   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
5889                "    .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5890                "    .has<bbbbbbbbbbbbbbbbbbbbb>();");
5891   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
5892                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
5893                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
5894 
5895   // Prefer not to break after empty parentheses.
5896   verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
5897                "    First->LastNewlineOffset);");
5898 
5899   // Prefer not to create "hanging" indents.
5900   verifyFormat(
5901       "return !soooooooooooooome_map\n"
5902       "            .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5903       "            .second;");
5904   verifyFormat(
5905       "return aaaaaaaaaaaaaaaa\n"
5906       "    .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
5907       "    .aaaa(aaaaaaaaaaaaaa);");
5908   // No hanging indent here.
5909   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
5910                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5911   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
5912                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5913   verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
5914                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5915                getLLVMStyleWithColumns(60));
5916   verifyFormat("aaaaaaaaaaaaaaaaaa\n"
5917                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
5918                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5919                getLLVMStyleWithColumns(59));
5920   verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5921                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5922                "    .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5923 
5924   // Dont break if only closing statements before member call
5925   verifyFormat("test() {\n"
5926                "  ([]() -> {\n"
5927                "    int b = 32;\n"
5928                "    return 3;\n"
5929                "  }).foo();\n"
5930                "}");
5931   verifyFormat("test() {\n"
5932                "  (\n"
5933                "      []() -> {\n"
5934                "        int b = 32;\n"
5935                "        return 3;\n"
5936                "      },\n"
5937                "      foo, bar)\n"
5938                "      .foo();\n"
5939                "}");
5940   verifyFormat("test() {\n"
5941                "  ([]() -> {\n"
5942                "    int b = 32;\n"
5943                "    return 3;\n"
5944                "  })\n"
5945                "      .foo()\n"
5946                "      .bar();\n"
5947                "}");
5948   verifyFormat("test() {\n"
5949                "  ([]() -> {\n"
5950                "    int b = 32;\n"
5951                "    return 3;\n"
5952                "  })\n"
5953                "      .foo(\"aaaaaaaaaaaaaaaaa\"\n"
5954                "           \"bbbb\");\n"
5955                "}",
5956                getLLVMStyleWithColumns(30));
5957 }
5958 
5959 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
5960   verifyFormat(
5961       "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
5962       "    bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
5963   verifyFormat(
5964       "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
5965       "    bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
5966 
5967   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
5968                "    ccccccccccccccccccccccccc) {\n}");
5969   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
5970                "    ccccccccccccccccccccccccc) {\n}");
5971 
5972   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
5973                "    ccccccccccccccccccccccccc) {\n}");
5974   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
5975                "    ccccccccccccccccccccccccc) {\n}");
5976 
5977   verifyFormat(
5978       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
5979       "    ccccccccccccccccccccccccc) {\n}");
5980   verifyFormat(
5981       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
5982       "    ccccccccccccccccccccccccc) {\n}");
5983 
5984   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
5985                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
5986                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
5987                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
5988   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
5989                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
5990                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
5991                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
5992 
5993   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
5994                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
5995                "    aaaaaaaaaaaaaaa != aa) {\n}");
5996   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
5997                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
5998                "    aaaaaaaaaaaaaaa != aa) {\n}");
5999 }
6000 
6001 TEST_F(FormatTest, BreaksAfterAssignments) {
6002   verifyFormat(
6003       "unsigned Cost =\n"
6004       "    TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
6005       "                        SI->getPointerAddressSpaceee());\n");
6006   verifyFormat(
6007       "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
6008       "    Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
6009 
6010   verifyFormat(
6011       "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
6012       "    aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
6013   verifyFormat("unsigned OriginalStartColumn =\n"
6014                "    SourceMgr.getSpellingColumnNumber(\n"
6015                "        Current.FormatTok.getStartOfNonWhitespace()) -\n"
6016                "    1;");
6017 }
6018 
6019 TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
6020   FormatStyle Style = getLLVMStyle();
6021   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6022                "    bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
6023                Style);
6024 
6025   Style.PenaltyBreakAssignment = 20;
6026   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
6027                "                                 cccccccccccccccccccccccccc;",
6028                Style);
6029 }
6030 
6031 TEST_F(FormatTest, AlignsAfterAssignments) {
6032   verifyFormat(
6033       "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
6034       "             aaaaaaaaaaaaaaaaaaaaaaaaa;");
6035   verifyFormat(
6036       "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
6037       "          aaaaaaaaaaaaaaaaaaaaaaaaa;");
6038   verifyFormat(
6039       "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
6040       "           aaaaaaaaaaaaaaaaaaaaaaaaa;");
6041   verifyFormat(
6042       "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
6043       "              aaaaaaaaaaaaaaaaaaaaaaaaa);");
6044   verifyFormat(
6045       "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
6046       "                                            aaaaaaaaaaaaaaaaaaaaaaaa +\n"
6047       "                                            aaaaaaaaaaaaaaaaaaaaaaaa;");
6048 }
6049 
6050 TEST_F(FormatTest, AlignsAfterReturn) {
6051   verifyFormat(
6052       "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
6053       "       aaaaaaaaaaaaaaaaaaaaaaaaa;");
6054   verifyFormat(
6055       "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
6056       "        aaaaaaaaaaaaaaaaaaaaaaaaa);");
6057   verifyFormat(
6058       "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
6059       "       aaaaaaaaaaaaaaaaaaaaaa();");
6060   verifyFormat(
6061       "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
6062       "        aaaaaaaaaaaaaaaaaaaaaa());");
6063   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6064                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6065   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6066                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
6067                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6068   verifyFormat("return\n"
6069                "    // true if code is one of a or b.\n"
6070                "    code == a || code == b;");
6071 }
6072 
6073 TEST_F(FormatTest, AlignsAfterOpenBracket) {
6074   verifyFormat(
6075       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
6076       "                                                aaaaaaaaa aaaaaaa) {}");
6077   verifyFormat(
6078       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
6079       "                                               aaaaaaaaaaa aaaaaaaaa);");
6080   verifyFormat(
6081       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
6082       "                                             aaaaaaaaaaaaaaaaaaaaa));");
6083   FormatStyle Style = getLLVMStyle();
6084   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
6085   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6086                "    aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
6087                Style);
6088   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
6089                "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
6090                Style);
6091   verifyFormat("SomeLongVariableName->someFunction(\n"
6092                "    foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
6093                Style);
6094   verifyFormat(
6095       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
6096       "    aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
6097       Style);
6098   verifyFormat(
6099       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
6100       "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6101       Style);
6102   verifyFormat(
6103       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
6104       "    aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
6105       Style);
6106 
6107   verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
6108                "    ccccccc(aaaaaaaaaaaaaaaaa,         //\n"
6109                "        b));",
6110                Style);
6111 
6112   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
6113   Style.BinPackArguments = false;
6114   Style.BinPackParameters = false;
6115   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6116                "    aaaaaaaaaaa aaaaaaaa,\n"
6117                "    aaaaaaaaa aaaaaaa,\n"
6118                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
6119                Style);
6120   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
6121                "    aaaaaaaaaaa aaaaaaaaa,\n"
6122                "    aaaaaaaaaaa aaaaaaaaa,\n"
6123                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6124                Style);
6125   verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
6126                "    aaaaaaaaaaaaaaa,\n"
6127                "    aaaaaaaaaaaaaaaaaaaaa,\n"
6128                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
6129                Style);
6130   verifyFormat(
6131       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
6132       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
6133       Style);
6134   verifyFormat(
6135       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
6136       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
6137       Style);
6138   verifyFormat(
6139       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
6140       "    aaaaaaaaaaaaaaaaaaaaa(\n"
6141       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
6142       "    aaaaaaaaaaaaaaaa);",
6143       Style);
6144   verifyFormat(
6145       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
6146       "    aaaaaaaaaaaaaaaaaaaaa(\n"
6147       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
6148       "    aaaaaaaaaaaaaaaa);",
6149       Style);
6150 }
6151 
6152 TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
6153   FormatStyle Style = getLLVMStyleWithColumns(40);
6154   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
6155                "          bbbbbbbbbbbbbbbbbbbbbb);",
6156                Style);
6157   Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
6158   Style.AlignOperands = FormatStyle::OAS_DontAlign;
6159   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
6160                "          bbbbbbbbbbbbbbbbbbbbbb);",
6161                Style);
6162   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
6163   Style.AlignOperands = FormatStyle::OAS_Align;
6164   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
6165                "          bbbbbbbbbbbbbbbbbbbbbb);",
6166                Style);
6167   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
6168   Style.AlignOperands = FormatStyle::OAS_DontAlign;
6169   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
6170                "    bbbbbbbbbbbbbbbbbbbbbb);",
6171                Style);
6172 }
6173 
6174 TEST_F(FormatTest, BreaksConditionalExpressions) {
6175   verifyFormat(
6176       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6177       "                               ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6178       "                               : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6179   verifyFormat(
6180       "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
6181       "     aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6182       "                                : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6183   verifyFormat(
6184       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6185       "                                   : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6186   verifyFormat("aaaa(aaaaaaaaa, aaaaaaaaa,\n"
6187                "     aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6188                "             : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6189   verifyFormat(
6190       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
6191       "                                                    : aaaaaaaaaaaaa);");
6192   verifyFormat(
6193       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6194       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6195       "                                    : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6196       "                   aaaaaaaaaaaaa);");
6197   verifyFormat(
6198       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6199       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6200       "                   aaaaaaaaaaaaa);");
6201   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6202                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6203                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6204                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6205                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6206   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6207                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6208                "           ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6209                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6210                "           : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6211                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
6212                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6213   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6214                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6215                "           ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6216                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
6217                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6218   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6219                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6220                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6221   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
6222                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6223                "        ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6224                "        : aaaaaaaaaaaaaaaa;");
6225   verifyFormat(
6226       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6227       "    ? aaaaaaaaaaaaaaa\n"
6228       "    : aaaaaaaaaaaaaaa;");
6229   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
6230                "          aaaaaaaaa\n"
6231                "      ? b\n"
6232                "      : c);");
6233   verifyFormat("return aaaa == bbbb\n"
6234                "           // comment\n"
6235                "           ? aaaa\n"
6236                "           : bbbb;");
6237   verifyFormat("unsigned Indent =\n"
6238                "    format(TheLine.First,\n"
6239                "           IndentForLevel[TheLine.Level] >= 0\n"
6240                "               ? IndentForLevel[TheLine.Level]\n"
6241                "               : TheLine * 2,\n"
6242                "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
6243                getLLVMStyleWithColumns(60));
6244   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
6245                "                  ? aaaaaaaaaaaaaaa\n"
6246                "                  : bbbbbbbbbbbbbbb //\n"
6247                "                        ? ccccccccccccccc\n"
6248                "                        : ddddddddddddddd;");
6249   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
6250                "                  ? aaaaaaaaaaaaaaa\n"
6251                "                  : (bbbbbbbbbbbbbbb //\n"
6252                "                         ? ccccccccccccccc\n"
6253                "                         : ddddddddddddddd);");
6254   verifyFormat(
6255       "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6256       "                                      ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
6257       "                                            aaaaaaaaaaaaaaaaaaaaa +\n"
6258       "                                            aaaaaaaaaaaaaaaaaaaaa\n"
6259       "                                      : aaaaaaaaaa;");
6260   verifyFormat(
6261       "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6262       "                                   : aaaaaaaaaaaaaaaaaaaaaa\n"
6263       "                      : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6264 
6265   FormatStyle NoBinPacking = getLLVMStyle();
6266   NoBinPacking.BinPackArguments = false;
6267   verifyFormat(
6268       "void f() {\n"
6269       "  g(aaa,\n"
6270       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
6271       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6272       "        ? aaaaaaaaaaaaaaa\n"
6273       "        : aaaaaaaaaaaaaaa);\n"
6274       "}",
6275       NoBinPacking);
6276   verifyFormat(
6277       "void f() {\n"
6278       "  g(aaa,\n"
6279       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
6280       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6281       "        ?: aaaaaaaaaaaaaaa);\n"
6282       "}",
6283       NoBinPacking);
6284 
6285   verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
6286                "             // comment.\n"
6287                "             ccccccccccccccccccccccccccccccccccccccc\n"
6288                "                 ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6289                "                 : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
6290 
6291   // Assignments in conditional expressions. Apparently not uncommon :-(.
6292   verifyFormat("return a != b\n"
6293                "           // comment\n"
6294                "           ? a = b\n"
6295                "           : a = b;");
6296   verifyFormat("return a != b\n"
6297                "           // comment\n"
6298                "           ? a = a != b\n"
6299                "                     // comment\n"
6300                "                     ? a = b\n"
6301                "                     : a\n"
6302                "           : a;\n");
6303   verifyFormat("return a != b\n"
6304                "           // comment\n"
6305                "           ? a\n"
6306                "           : a = a != b\n"
6307                "                     // comment\n"
6308                "                     ? a = b\n"
6309                "                     : a;");
6310 
6311   // Chained conditionals
6312   FormatStyle Style = getLLVMStyle();
6313   Style.ColumnLimit = 70;
6314   Style.AlignOperands = FormatStyle::OAS_Align;
6315   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n"
6316                "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6317                "                        : 3333333333333333;",
6318                Style);
6319   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n"
6320                "       : bbbbbbbbbb     ? 2222222222222222\n"
6321                "                        : 3333333333333333;",
6322                Style);
6323   verifyFormat("return aaaaaaaaaa         ? 1111111111111111\n"
6324                "       : bbbbbbbbbbbbbbbb ? 2222222222222222\n"
6325                "                          : 3333333333333333;",
6326                Style);
6327   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n"
6328                "       : bbbbbbbbbbbbbb ? 222222\n"
6329                "                        : 333333;",
6330                Style);
6331   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n"
6332                "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6333                "       : cccccccccccccc ? 3333333333333333\n"
6334                "                        : 4444444444444444;",
6335                Style);
6336   verifyFormat("return aaaaaaaaaaaaaaaa ? (aaa ? bbb : ccc)\n"
6337                "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6338                "                        : 3333333333333333;",
6339                Style);
6340   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n"
6341                "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6342                "                        : (aaa ? bbb : ccc);",
6343                Style);
6344   verifyFormat(
6345       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6346       "                                             : cccccccccccccccccc)\n"
6347       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6348       "                        : 3333333333333333;",
6349       Style);
6350   verifyFormat(
6351       "return aaaaaaaaa        ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6352       "                                             : cccccccccccccccccc)\n"
6353       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6354       "                        : 3333333333333333;",
6355       Style);
6356   verifyFormat(
6357       "return aaaaaaaaa        ? a = (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6358       "                                             : dddddddddddddddddd)\n"
6359       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6360       "                        : 3333333333333333;",
6361       Style);
6362   verifyFormat(
6363       "return aaaaaaaaa        ? a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6364       "                                             : dddddddddddddddddd)\n"
6365       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6366       "                        : 3333333333333333;",
6367       Style);
6368   verifyFormat(
6369       "return aaaaaaaaa        ? 1111111111111111\n"
6370       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6371       "                        : a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6372       "                                             : dddddddddddddddddd)\n",
6373       Style);
6374   verifyFormat(
6375       "return aaaaaaaaaaaaaaaa ? 1111111111111111\n"
6376       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6377       "                        : (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6378       "                                             : cccccccccccccccccc);",
6379       Style);
6380   verifyFormat(
6381       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6382       "                           : ccccccccccccccc ? dddddddddddddddddd\n"
6383       "                                             : eeeeeeeeeeeeeeeeee)\n"
6384       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6385       "                        : 3333333333333333;",
6386       Style);
6387   verifyFormat(
6388       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaa    ? bbbbbbbbbbbbbbbbbb\n"
6389       "                           : ccccccccccccccc ? dddddddddddddddddd\n"
6390       "                                             : eeeeeeeeeeeeeeeeee)\n"
6391       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6392       "                        : 3333333333333333;",
6393       Style);
6394   verifyFormat(
6395       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6396       "                           : cccccccccccc    ? dddddddddddddddddd\n"
6397       "                                             : eeeeeeeeeeeeeeeeee)\n"
6398       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6399       "                        : 3333333333333333;",
6400       Style);
6401   verifyFormat(
6402       "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6403       "                                             : cccccccccccccccccc\n"
6404       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6405       "                        : 3333333333333333;",
6406       Style);
6407   verifyFormat(
6408       "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6409       "                          : cccccccccccccccc ? dddddddddddddddddd\n"
6410       "                                             : eeeeeeeeeeeeeeeeee\n"
6411       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6412       "                        : 3333333333333333;",
6413       Style);
6414   verifyFormat("return aaaaaaaaaaaaaaaaaaaaa\n"
6415                "           ? (aaaaaaaaaaaaaaaaaa   ? bbbbbbbbbbbbbbbbbb\n"
6416                "              : cccccccccccccccccc ? dddddddddddddddddd\n"
6417                "                                   : eeeeeeeeeeeeeeeeee)\n"
6418                "       : bbbbbbbbbbbbbbbbbbb ? 2222222222222222\n"
6419                "                             : 3333333333333333;",
6420                Style);
6421   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaa\n"
6422                "           ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6423                "             : cccccccccccccccc ? dddddddddddddddddd\n"
6424                "                                : eeeeeeeeeeeeeeeeee\n"
6425                "       : bbbbbbbbbbbbbbbbbbbbbbb ? 2222222222222222\n"
6426                "                                 : 3333333333333333;",
6427                Style);
6428 
6429   Style.AlignOperands = FormatStyle::OAS_DontAlign;
6430   Style.BreakBeforeTernaryOperators = false;
6431   // FIXME: Aligning the question marks is weird given DontAlign.
6432   // Consider disabling this alignment in this case. Also check whether this
6433   // will render the adjustment from https://reviews.llvm.org/D82199
6434   // unnecessary.
6435   verifyFormat("int x = aaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa :\n"
6436                "    bbbb                ? cccccccccccccccccc :\n"
6437                "                          ddddd;\n",
6438                Style);
6439 }
6440 
6441 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
6442   FormatStyle Style = getLLVMStyle();
6443   Style.BreakBeforeTernaryOperators = false;
6444   Style.ColumnLimit = 70;
6445   verifyFormat(
6446       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6447       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6448       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6449       Style);
6450   verifyFormat(
6451       "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
6452       "     aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6453       "                                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6454       Style);
6455   verifyFormat(
6456       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6457       "                                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6458       Style);
6459   verifyFormat("aaaa(aaaaaaaa, aaaaaaaaaa,\n"
6460                "     aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6461                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6462                Style);
6463   verifyFormat(
6464       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
6465       "                                                      aaaaaaaaaaaaa);",
6466       Style);
6467   verifyFormat(
6468       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6469       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6470       "                                      aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6471       "                   aaaaaaaaaaaaa);",
6472       Style);
6473   verifyFormat(
6474       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6475       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6476       "                   aaaaaaaaaaaaa);",
6477       Style);
6478   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6479                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6480                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
6481                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6482                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6483                Style);
6484   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6485                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6486                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6487                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
6488                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6489                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
6490                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6491                Style);
6492   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6493                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
6494                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6495                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
6496                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6497                Style);
6498   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6499                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6500                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
6501                Style);
6502   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
6503                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6504                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6505                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
6506                Style);
6507   verifyFormat(
6508       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6509       "    aaaaaaaaaaaaaaa :\n"
6510       "    aaaaaaaaaaaaaaa;",
6511       Style);
6512   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
6513                "          aaaaaaaaa ?\n"
6514                "      b :\n"
6515                "      c);",
6516                Style);
6517   verifyFormat("unsigned Indent =\n"
6518                "    format(TheLine.First,\n"
6519                "           IndentForLevel[TheLine.Level] >= 0 ?\n"
6520                "               IndentForLevel[TheLine.Level] :\n"
6521                "               TheLine * 2,\n"
6522                "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
6523                Style);
6524   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
6525                "                  aaaaaaaaaaaaaaa :\n"
6526                "                  bbbbbbbbbbbbbbb ? //\n"
6527                "                      ccccccccccccccc :\n"
6528                "                      ddddddddddddddd;",
6529                Style);
6530   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
6531                "                  aaaaaaaaaaaaaaa :\n"
6532                "                  (bbbbbbbbbbbbbbb ? //\n"
6533                "                       ccccccccccccccc :\n"
6534                "                       ddddddddddddddd);",
6535                Style);
6536   verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6537                "            /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
6538                "            ccccccccccccccccccccccccccc;",
6539                Style);
6540   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6541                "           aaaaa :\n"
6542                "           bbbbbbbbbbbbbbb + cccccccccccccccc;",
6543                Style);
6544 
6545   // Chained conditionals
6546   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n"
6547                "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6548                "                          3333333333333333;",
6549                Style);
6550   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n"
6551                "       bbbbbbbbbb       ? 2222222222222222 :\n"
6552                "                          3333333333333333;",
6553                Style);
6554   verifyFormat("return aaaaaaaaaa       ? 1111111111111111 :\n"
6555                "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6556                "                          3333333333333333;",
6557                Style);
6558   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n"
6559                "       bbbbbbbbbbbbbbbb ? 222222 :\n"
6560                "                          333333;",
6561                Style);
6562   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n"
6563                "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6564                "       cccccccccccccccc ? 3333333333333333 :\n"
6565                "                          4444444444444444;",
6566                Style);
6567   verifyFormat("return aaaaaaaaaaaaaaaa ? (aaa ? bbb : ccc) :\n"
6568                "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6569                "                          3333333333333333;",
6570                Style);
6571   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n"
6572                "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6573                "                          (aaa ? bbb : ccc);",
6574                Style);
6575   verifyFormat(
6576       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6577       "                                               cccccccccccccccccc) :\n"
6578       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6579       "                          3333333333333333;",
6580       Style);
6581   verifyFormat(
6582       "return aaaaaaaaa        ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6583       "                                               cccccccccccccccccc) :\n"
6584       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6585       "                          3333333333333333;",
6586       Style);
6587   verifyFormat(
6588       "return aaaaaaaaa        ? a = (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6589       "                                               dddddddddddddddddd) :\n"
6590       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6591       "                          3333333333333333;",
6592       Style);
6593   verifyFormat(
6594       "return aaaaaaaaa        ? a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6595       "                                               dddddddddddddddddd) :\n"
6596       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6597       "                          3333333333333333;",
6598       Style);
6599   verifyFormat(
6600       "return aaaaaaaaa        ? 1111111111111111 :\n"
6601       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6602       "                          a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6603       "                                               dddddddddddddddddd)\n",
6604       Style);
6605   verifyFormat(
6606       "return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n"
6607       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6608       "                          (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6609       "                                               cccccccccccccccccc);",
6610       Style);
6611   verifyFormat(
6612       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6613       "                           ccccccccccccccccc ? dddddddddddddddddd :\n"
6614       "                                               eeeeeeeeeeeeeeeeee) :\n"
6615       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6616       "                          3333333333333333;",
6617       Style);
6618   verifyFormat(
6619       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6620       "                           ccccccccccccc     ? dddddddddddddddddd :\n"
6621       "                                               eeeeeeeeeeeeeeeeee) :\n"
6622       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6623       "                          3333333333333333;",
6624       Style);
6625   verifyFormat(
6626       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaa     ? bbbbbbbbbbbbbbbbbb :\n"
6627       "                           ccccccccccccccccc ? dddddddddddddddddd :\n"
6628       "                                               eeeeeeeeeeeeeeeeee) :\n"
6629       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6630       "                          3333333333333333;",
6631       Style);
6632   verifyFormat(
6633       "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6634       "                                               cccccccccccccccccc :\n"
6635       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6636       "                          3333333333333333;",
6637       Style);
6638   verifyFormat(
6639       "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6640       "                          cccccccccccccccccc ? dddddddddddddddddd :\n"
6641       "                                               eeeeeeeeeeeeeeeeee :\n"
6642       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6643       "                          3333333333333333;",
6644       Style);
6645   verifyFormat("return aaaaaaaaaaaaaaaaaaaaa ?\n"
6646                "           (aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6647                "            cccccccccccccccccc ? dddddddddddddddddd :\n"
6648                "                                 eeeeeeeeeeeeeeeeee) :\n"
6649                "       bbbbbbbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6650                "                               3333333333333333;",
6651                Style);
6652   verifyFormat("return aaaaaaaaaaaaaaaaaaaaa ?\n"
6653                "           aaaaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6654                "           cccccccccccccccccccc ? dddddddddddddddddd :\n"
6655                "                                  eeeeeeeeeeeeeeeeee :\n"
6656                "       bbbbbbbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6657                "                               3333333333333333;",
6658                Style);
6659 }
6660 
6661 TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
6662   verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
6663                "     aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
6664   verifyFormat("bool a = true, b = false;");
6665 
6666   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6667                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
6668                "     bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
6669                "         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
6670   verifyFormat(
6671       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
6672       "         bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
6673       "     d = e && f;");
6674   verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
6675                "          c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
6676   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
6677                "          *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
6678   verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
6679                "          ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
6680 
6681   FormatStyle Style = getGoogleStyle();
6682   Style.PointerAlignment = FormatStyle::PAS_Left;
6683   Style.DerivePointerAlignment = false;
6684   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6685                "    *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
6686                "    *b = bbbbbbbbbbbbbbbbbbb;",
6687                Style);
6688   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
6689                "          *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
6690                Style);
6691   verifyFormat("vector<int*> a, b;", Style);
6692   verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
6693 }
6694 
6695 TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
6696   verifyFormat("arr[foo ? bar : baz];");
6697   verifyFormat("f()[foo ? bar : baz];");
6698   verifyFormat("(a + b)[foo ? bar : baz];");
6699   verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
6700 }
6701 
6702 TEST_F(FormatTest, AlignsStringLiterals) {
6703   verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
6704                "                                      \"short literal\");");
6705   verifyFormat(
6706       "looooooooooooooooooooooooongFunction(\n"
6707       "    \"short literal\"\n"
6708       "    \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
6709   verifyFormat("someFunction(\"Always break between multi-line\"\n"
6710                "             \" string literals\",\n"
6711                "             and, other, parameters);");
6712   EXPECT_EQ("fun + \"1243\" /* comment */\n"
6713             "      \"5678\";",
6714             format("fun + \"1243\" /* comment */\n"
6715                    "    \"5678\";",
6716                    getLLVMStyleWithColumns(28)));
6717   EXPECT_EQ(
6718       "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6719       "         \"aaaaaaaaaaaaaaaaaaaaa\"\n"
6720       "         \"aaaaaaaaaaaaaaaa\";",
6721       format("aaaaaa ="
6722              "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
6723              "aaaaaaaaaaaaaaaaaaaaa\" "
6724              "\"aaaaaaaaaaaaaaaa\";"));
6725   verifyFormat("a = a + \"a\"\n"
6726                "        \"a\"\n"
6727                "        \"a\";");
6728   verifyFormat("f(\"a\", \"b\"\n"
6729                "       \"c\");");
6730 
6731   verifyFormat(
6732       "#define LL_FORMAT \"ll\"\n"
6733       "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
6734       "       \"d, ddddddddd: %\" LL_FORMAT \"d\");");
6735 
6736   verifyFormat("#define A(X)          \\\n"
6737                "  \"aaaaa\" #X \"bbbbbb\" \\\n"
6738                "  \"ccccc\"",
6739                getLLVMStyleWithColumns(23));
6740   verifyFormat("#define A \"def\"\n"
6741                "f(\"abc\" A \"ghi\"\n"
6742                "  \"jkl\");");
6743 
6744   verifyFormat("f(L\"a\"\n"
6745                "  L\"b\");");
6746   verifyFormat("#define A(X)            \\\n"
6747                "  L\"aaaaa\" #X L\"bbbbbb\" \\\n"
6748                "  L\"ccccc\"",
6749                getLLVMStyleWithColumns(25));
6750 
6751   verifyFormat("f(@\"a\"\n"
6752                "  @\"b\");");
6753   verifyFormat("NSString s = @\"a\"\n"
6754                "             @\"b\"\n"
6755                "             @\"c\";");
6756   verifyFormat("NSString s = @\"a\"\n"
6757                "              \"b\"\n"
6758                "              \"c\";");
6759 }
6760 
6761 TEST_F(FormatTest, ReturnTypeBreakingStyle) {
6762   FormatStyle Style = getLLVMStyle();
6763   // No declarations or definitions should be moved to own line.
6764   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
6765   verifyFormat("class A {\n"
6766                "  int f() { return 1; }\n"
6767                "  int g();\n"
6768                "};\n"
6769                "int f() { return 1; }\n"
6770                "int g();\n",
6771                Style);
6772 
6773   // All declarations and definitions should have the return type moved to its
6774   // own line.
6775   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
6776   Style.TypenameMacros = {"LIST"};
6777   verifyFormat("SomeType\n"
6778                "funcdecl(LIST(uint64_t));",
6779                Style);
6780   verifyFormat("class E {\n"
6781                "  int\n"
6782                "  f() {\n"
6783                "    return 1;\n"
6784                "  }\n"
6785                "  int\n"
6786                "  g();\n"
6787                "};\n"
6788                "int\n"
6789                "f() {\n"
6790                "  return 1;\n"
6791                "}\n"
6792                "int\n"
6793                "g();\n",
6794                Style);
6795 
6796   // Top-level definitions, and no kinds of declarations should have the
6797   // return type moved to its own line.
6798   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
6799   verifyFormat("class B {\n"
6800                "  int f() { return 1; }\n"
6801                "  int g();\n"
6802                "};\n"
6803                "int\n"
6804                "f() {\n"
6805                "  return 1;\n"
6806                "}\n"
6807                "int g();\n",
6808                Style);
6809 
6810   // Top-level definitions and declarations should have the return type moved
6811   // to its own line.
6812   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
6813   verifyFormat("class C {\n"
6814                "  int f() { return 1; }\n"
6815                "  int g();\n"
6816                "};\n"
6817                "int\n"
6818                "f() {\n"
6819                "  return 1;\n"
6820                "}\n"
6821                "int\n"
6822                "g();\n",
6823                Style);
6824 
6825   // All definitions should have the return type moved to its own line, but no
6826   // kinds of declarations.
6827   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
6828   verifyFormat("class D {\n"
6829                "  int\n"
6830                "  f() {\n"
6831                "    return 1;\n"
6832                "  }\n"
6833                "  int g();\n"
6834                "};\n"
6835                "int\n"
6836                "f() {\n"
6837                "  return 1;\n"
6838                "}\n"
6839                "int g();\n",
6840                Style);
6841   verifyFormat("const char *\n"
6842                "f(void) {\n" // Break here.
6843                "  return \"\";\n"
6844                "}\n"
6845                "const char *bar(void);\n", // No break here.
6846                Style);
6847   verifyFormat("template <class T>\n"
6848                "T *\n"
6849                "f(T &c) {\n" // Break here.
6850                "  return NULL;\n"
6851                "}\n"
6852                "template <class T> T *f(T &c);\n", // No break here.
6853                Style);
6854   verifyFormat("class C {\n"
6855                "  int\n"
6856                "  operator+() {\n"
6857                "    return 1;\n"
6858                "  }\n"
6859                "  int\n"
6860                "  operator()() {\n"
6861                "    return 1;\n"
6862                "  }\n"
6863                "};\n",
6864                Style);
6865   verifyFormat("void\n"
6866                "A::operator()() {}\n"
6867                "void\n"
6868                "A::operator>>() {}\n"
6869                "void\n"
6870                "A::operator+() {}\n"
6871                "void\n"
6872                "A::operator*() {}\n"
6873                "void\n"
6874                "A::operator->() {}\n"
6875                "void\n"
6876                "A::operator void *() {}\n"
6877                "void\n"
6878                "A::operator void &() {}\n"
6879                "void\n"
6880                "A::operator void &&() {}\n"
6881                "void\n"
6882                "A::operator char *() {}\n"
6883                "void\n"
6884                "A::operator[]() {}\n"
6885                "void\n"
6886                "A::operator!() {}\n"
6887                "void\n"
6888                "A::operator**() {}\n"
6889                "void\n"
6890                "A::operator<Foo> *() {}\n"
6891                "void\n"
6892                "A::operator<Foo> **() {}\n"
6893                "void\n"
6894                "A::operator<Foo> &() {}\n"
6895                "void\n"
6896                "A::operator void **() {}\n",
6897                Style);
6898   verifyFormat("constexpr auto\n"
6899                "operator()() const -> reference {}\n"
6900                "constexpr auto\n"
6901                "operator>>() const -> reference {}\n"
6902                "constexpr auto\n"
6903                "operator+() const -> reference {}\n"
6904                "constexpr auto\n"
6905                "operator*() const -> reference {}\n"
6906                "constexpr auto\n"
6907                "operator->() const -> reference {}\n"
6908                "constexpr auto\n"
6909                "operator++() const -> reference {}\n"
6910                "constexpr auto\n"
6911                "operator void *() const -> reference {}\n"
6912                "constexpr auto\n"
6913                "operator void **() const -> reference {}\n"
6914                "constexpr auto\n"
6915                "operator void *() const -> reference {}\n"
6916                "constexpr auto\n"
6917                "operator void &() const -> reference {}\n"
6918                "constexpr auto\n"
6919                "operator void &&() const -> reference {}\n"
6920                "constexpr auto\n"
6921                "operator char *() const -> reference {}\n"
6922                "constexpr auto\n"
6923                "operator!() const -> reference {}\n"
6924                "constexpr auto\n"
6925                "operator[]() const -> reference {}\n",
6926                Style);
6927   verifyFormat("void *operator new(std::size_t s);", // No break here.
6928                Style);
6929   verifyFormat("void *\n"
6930                "operator new(std::size_t s) {}",
6931                Style);
6932   verifyFormat("void *\n"
6933                "operator delete[](void *ptr) {}",
6934                Style);
6935   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
6936   verifyFormat("const char *\n"
6937                "f(void)\n" // Break here.
6938                "{\n"
6939                "  return \"\";\n"
6940                "}\n"
6941                "const char *bar(void);\n", // No break here.
6942                Style);
6943   verifyFormat("template <class T>\n"
6944                "T *\n"     // Problem here: no line break
6945                "f(T &c)\n" // Break here.
6946                "{\n"
6947                "  return NULL;\n"
6948                "}\n"
6949                "template <class T> T *f(T &c);\n", // No break here.
6950                Style);
6951   verifyFormat("int\n"
6952                "foo(A<bool> a)\n"
6953                "{\n"
6954                "  return a;\n"
6955                "}\n",
6956                Style);
6957   verifyFormat("int\n"
6958                "foo(A<8> a)\n"
6959                "{\n"
6960                "  return a;\n"
6961                "}\n",
6962                Style);
6963   verifyFormat("int\n"
6964                "foo(A<B<bool>, 8> a)\n"
6965                "{\n"
6966                "  return a;\n"
6967                "}\n",
6968                Style);
6969   verifyFormat("int\n"
6970                "foo(A<B<8>, bool> a)\n"
6971                "{\n"
6972                "  return a;\n"
6973                "}\n",
6974                Style);
6975   verifyFormat("int\n"
6976                "foo(A<B<bool>, bool> a)\n"
6977                "{\n"
6978                "  return a;\n"
6979                "}\n",
6980                Style);
6981   verifyFormat("int\n"
6982                "foo(A<B<8>, 8> a)\n"
6983                "{\n"
6984                "  return a;\n"
6985                "}\n",
6986                Style);
6987 
6988   Style = getGNUStyle();
6989 
6990   // Test for comments at the end of function declarations.
6991   verifyFormat("void\n"
6992                "foo (int a, /*abc*/ int b) // def\n"
6993                "{\n"
6994                "}\n",
6995                Style);
6996 
6997   verifyFormat("void\n"
6998                "foo (int a, /* abc */ int b) /* def */\n"
6999                "{\n"
7000                "}\n",
7001                Style);
7002 
7003   // Definitions that should not break after return type
7004   verifyFormat("void foo (int a, int b); // def\n", Style);
7005   verifyFormat("void foo (int a, int b); /* def */\n", Style);
7006   verifyFormat("void foo (int a, int b);\n", Style);
7007 }
7008 
7009 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
7010   FormatStyle NoBreak = getLLVMStyle();
7011   NoBreak.AlwaysBreakBeforeMultilineStrings = false;
7012   FormatStyle Break = getLLVMStyle();
7013   Break.AlwaysBreakBeforeMultilineStrings = true;
7014   verifyFormat("aaaa = \"bbbb\"\n"
7015                "       \"cccc\";",
7016                NoBreak);
7017   verifyFormat("aaaa =\n"
7018                "    \"bbbb\"\n"
7019                "    \"cccc\";",
7020                Break);
7021   verifyFormat("aaaa(\"bbbb\"\n"
7022                "     \"cccc\");",
7023                NoBreak);
7024   verifyFormat("aaaa(\n"
7025                "    \"bbbb\"\n"
7026                "    \"cccc\");",
7027                Break);
7028   verifyFormat("aaaa(qqq, \"bbbb\"\n"
7029                "          \"cccc\");",
7030                NoBreak);
7031   verifyFormat("aaaa(qqq,\n"
7032                "     \"bbbb\"\n"
7033                "     \"cccc\");",
7034                Break);
7035   verifyFormat("aaaa(qqq,\n"
7036                "     L\"bbbb\"\n"
7037                "     L\"cccc\");",
7038                Break);
7039   verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
7040                "                      \"bbbb\"));",
7041                Break);
7042   verifyFormat("string s = someFunction(\n"
7043                "    \"abc\"\n"
7044                "    \"abc\");",
7045                Break);
7046 
7047   // As we break before unary operators, breaking right after them is bad.
7048   verifyFormat("string foo = abc ? \"x\"\n"
7049                "                   \"blah blah blah blah blah blah\"\n"
7050                "                 : \"y\";",
7051                Break);
7052 
7053   // Don't break if there is no column gain.
7054   verifyFormat("f(\"aaaa\"\n"
7055                "  \"bbbb\");",
7056                Break);
7057 
7058   // Treat literals with escaped newlines like multi-line string literals.
7059   EXPECT_EQ("x = \"a\\\n"
7060             "b\\\n"
7061             "c\";",
7062             format("x = \"a\\\n"
7063                    "b\\\n"
7064                    "c\";",
7065                    NoBreak));
7066   EXPECT_EQ("xxxx =\n"
7067             "    \"a\\\n"
7068             "b\\\n"
7069             "c\";",
7070             format("xxxx = \"a\\\n"
7071                    "b\\\n"
7072                    "c\";",
7073                    Break));
7074 
7075   EXPECT_EQ("NSString *const kString =\n"
7076             "    @\"aaaa\"\n"
7077             "    @\"bbbb\";",
7078             format("NSString *const kString = @\"aaaa\"\n"
7079                    "@\"bbbb\";",
7080                    Break));
7081 
7082   Break.ColumnLimit = 0;
7083   verifyFormat("const char *hello = \"hello llvm\";", Break);
7084 }
7085 
7086 TEST_F(FormatTest, AlignsPipes) {
7087   verifyFormat(
7088       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7089       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7090       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7091   verifyFormat(
7092       "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
7093       "                     << aaaaaaaaaaaaaaaaaaaa;");
7094   verifyFormat(
7095       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7096       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7097   verifyFormat(
7098       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
7099       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7100   verifyFormat(
7101       "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
7102       "                \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
7103       "             << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
7104   verifyFormat(
7105       "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7106       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
7107       "         << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7108   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7109                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7110                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
7111                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
7112   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
7113                "             << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
7114   verifyFormat(
7115       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7116       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7117   verifyFormat(
7118       "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
7119       "                                       aaaaaaaaaaaaaaaaaaaaaaaaaa);");
7120 
7121   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
7122                "             << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
7123   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7124                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7125                "                    aaaaaaaaaaaaaaaaaaaaa)\n"
7126                "             << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
7127   verifyFormat("LOG_IF(aaa == //\n"
7128                "       bbb)\n"
7129                "    << a << b;");
7130 
7131   // But sometimes, breaking before the first "<<" is desirable.
7132   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
7133                "    << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
7134   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
7135                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7136                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7137   verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
7138                "    << BEF << IsTemplate << Description << E->getType();");
7139   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
7140                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7141                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7142   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
7143                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7144                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
7145                "    << aaa;");
7146 
7147   verifyFormat(
7148       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7149       "                    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
7150 
7151   // Incomplete string literal.
7152   EXPECT_EQ("llvm::errs() << \"\n"
7153             "             << a;",
7154             format("llvm::errs() << \"\n<<a;"));
7155 
7156   verifyFormat("void f() {\n"
7157                "  CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
7158                "      << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
7159                "}");
7160 
7161   // Handle 'endl'.
7162   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
7163                "             << bbbbbbbbbbbbbbbbbbbbbb << endl;");
7164   verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
7165 
7166   // Handle '\n'.
7167   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
7168                "             << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
7169   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
7170                "             << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
7171   verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
7172                "             << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
7173   verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
7174 }
7175 
7176 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
7177   verifyFormat("return out << \"somepacket = {\\n\"\n"
7178                "           << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
7179                "           << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
7180                "           << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
7181                "           << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
7182                "           << \"}\";");
7183 
7184   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
7185                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
7186                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
7187   verifyFormat(
7188       "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
7189       "             << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
7190       "             << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
7191       "             << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
7192       "             << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
7193   verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
7194                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
7195   verifyFormat(
7196       "void f() {\n"
7197       "  llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
7198       "               << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
7199       "}");
7200 
7201   // Breaking before the first "<<" is generally not desirable.
7202   verifyFormat(
7203       "llvm::errs()\n"
7204       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7205       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7206       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7207       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
7208       getLLVMStyleWithColumns(70));
7209   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
7210                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7211                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
7212                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7213                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
7214                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
7215                getLLVMStyleWithColumns(70));
7216 
7217   verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
7218                "           \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
7219                "           \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
7220   verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
7221                "                  \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
7222                "                  \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
7223   verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
7224                "           (aaaa + aaaa);",
7225                getLLVMStyleWithColumns(40));
7226   verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
7227                "                  (aaaaaaa + aaaaa));",
7228                getLLVMStyleWithColumns(40));
7229   verifyFormat(
7230       "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
7231       "                  SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
7232       "                  bbbbbbbbbbbbbbbbbbbbbbb);");
7233 }
7234 
7235 TEST_F(FormatTest, UnderstandsEquals) {
7236   verifyFormat(
7237       "aaaaaaaaaaaaaaaaa =\n"
7238       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7239   verifyFormat(
7240       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7241       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
7242   verifyFormat(
7243       "if (a) {\n"
7244       "  f();\n"
7245       "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7246       "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
7247       "}");
7248 
7249   verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7250                "        100000000 + 10000000) {\n}");
7251 }
7252 
7253 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
7254   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
7255                "    .looooooooooooooooooooooooooooooooooooooongFunction();");
7256 
7257   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
7258                "    ->looooooooooooooooooooooooooooooooooooooongFunction();");
7259 
7260   verifyFormat(
7261       "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
7262       "                                                          Parameter2);");
7263 
7264   verifyFormat(
7265       "ShortObject->shortFunction(\n"
7266       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
7267       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
7268 
7269   verifyFormat("loooooooooooooongFunction(\n"
7270                "    LoooooooooooooongObject->looooooooooooooooongFunction());");
7271 
7272   verifyFormat(
7273       "function(LoooooooooooooooooooooooooooooooooooongObject\n"
7274       "             ->loooooooooooooooooooooooooooooooooooooooongFunction());");
7275 
7276   verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
7277                "    .WillRepeatedly(Return(SomeValue));");
7278   verifyFormat("void f() {\n"
7279                "  EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
7280                "      .Times(2)\n"
7281                "      .WillRepeatedly(Return(SomeValue));\n"
7282                "}");
7283   verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
7284                "    ccccccccccccccccccccccc);");
7285   verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7286                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
7287                "          .aaaaa(aaaaa),\n"
7288                "      aaaaaaaaaaaaaaaaaaaaa);");
7289   verifyFormat("void f() {\n"
7290                "  aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7291                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
7292                "}");
7293   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7294                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
7295                "    .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7296                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7297                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
7298   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7299                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7300                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7301                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
7302                "}");
7303 
7304   // Here, it is not necessary to wrap at "." or "->".
7305   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
7306                "    aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
7307   verifyFormat(
7308       "aaaaaaaaaaa->aaaaaaaaa(\n"
7309       "    aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7310       "    aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
7311 
7312   verifyFormat(
7313       "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7314       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
7315   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
7316                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
7317   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
7318                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
7319 
7320   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7321                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
7322                "    .a();");
7323 
7324   FormatStyle NoBinPacking = getLLVMStyle();
7325   NoBinPacking.BinPackParameters = false;
7326   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
7327                "    .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
7328                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
7329                "                         aaaaaaaaaaaaaaaaaaa,\n"
7330                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
7331                NoBinPacking);
7332 
7333   // If there is a subsequent call, change to hanging indentation.
7334   verifyFormat(
7335       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7336       "                         aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
7337       "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
7338   verifyFormat(
7339       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7340       "    aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
7341   verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7342                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
7343                "                 .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
7344   verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7345                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
7346                "               .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
7347 }
7348 
7349 TEST_F(FormatTest, WrapsTemplateDeclarations) {
7350   verifyFormat("template <typename T>\n"
7351                "virtual void loooooooooooongFunction(int Param1, int Param2);");
7352   verifyFormat("template <typename T>\n"
7353                "// T should be one of {A, B}.\n"
7354                "virtual void loooooooooooongFunction(int Param1, int Param2);");
7355   verifyFormat(
7356       "template <typename T>\n"
7357       "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
7358   verifyFormat("template <typename T>\n"
7359                "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
7360                "       int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
7361   verifyFormat(
7362       "template <typename T>\n"
7363       "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
7364       "                                      int Paaaaaaaaaaaaaaaaaaaaram2);");
7365   verifyFormat(
7366       "template <typename T>\n"
7367       "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
7368       "                    aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
7369       "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7370   verifyFormat("template <typename T>\n"
7371                "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7372                "    int aaaaaaaaaaaaaaaaaaaaaa);");
7373   verifyFormat(
7374       "template <typename T1, typename T2 = char, typename T3 = char,\n"
7375       "          typename T4 = char>\n"
7376       "void f();");
7377   verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
7378                "          template <typename> class cccccccccccccccccccccc,\n"
7379                "          typename ddddddddddddd>\n"
7380                "class C {};");
7381   verifyFormat(
7382       "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
7383       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7384 
7385   verifyFormat("void f() {\n"
7386                "  a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
7387                "      a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
7388                "}");
7389 
7390   verifyFormat("template <typename T> class C {};");
7391   verifyFormat("template <typename T> void f();");
7392   verifyFormat("template <typename T> void f() {}");
7393   verifyFormat(
7394       "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
7395       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7396       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
7397       "    new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
7398       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7399       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
7400       "        bbbbbbbbbbbbbbbbbbbbbbbb);",
7401       getLLVMStyleWithColumns(72));
7402   EXPECT_EQ("static_cast<A< //\n"
7403             "    B> *>(\n"
7404             "\n"
7405             ");",
7406             format("static_cast<A<//\n"
7407                    "    B>*>(\n"
7408                    "\n"
7409                    "    );"));
7410   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7411                "    const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
7412 
7413   FormatStyle AlwaysBreak = getLLVMStyle();
7414   AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
7415   verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
7416   verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
7417   verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
7418   verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7419                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
7420                "    ccccccccccccccccccccccccccccccccccccccccccccccc);");
7421   verifyFormat("template <template <typename> class Fooooooo,\n"
7422                "          template <typename> class Baaaaaaar>\n"
7423                "struct C {};",
7424                AlwaysBreak);
7425   verifyFormat("template <typename T> // T can be A, B or C.\n"
7426                "struct C {};",
7427                AlwaysBreak);
7428   verifyFormat("template <enum E> class A {\n"
7429                "public:\n"
7430                "  E *f();\n"
7431                "};");
7432 
7433   FormatStyle NeverBreak = getLLVMStyle();
7434   NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No;
7435   verifyFormat("template <typename T> class C {};", NeverBreak);
7436   verifyFormat("template <typename T> void f();", NeverBreak);
7437   verifyFormat("template <typename T> void f() {}", NeverBreak);
7438   verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa "
7439                "bbbbbbbbbbbbbbbbbbbb) {}",
7440                NeverBreak);
7441   verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7442                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
7443                "    ccccccccccccccccccccccccccccccccccccccccccccccc);",
7444                NeverBreak);
7445   verifyFormat("template <template <typename> class Fooooooo,\n"
7446                "          template <typename> class Baaaaaaar>\n"
7447                "struct C {};",
7448                NeverBreak);
7449   verifyFormat("template <typename T> // T can be A, B or C.\n"
7450                "struct C {};",
7451                NeverBreak);
7452   verifyFormat("template <enum E> class A {\n"
7453                "public:\n"
7454                "  E *f();\n"
7455                "};",
7456                NeverBreak);
7457   NeverBreak.PenaltyBreakTemplateDeclaration = 100;
7458   verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa "
7459                "bbbbbbbbbbbbbbbbbbbb) {}",
7460                NeverBreak);
7461 }
7462 
7463 TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) {
7464   FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
7465   Style.ColumnLimit = 60;
7466   EXPECT_EQ("// Baseline - no comments.\n"
7467             "template <\n"
7468             "    typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
7469             "void f() {}",
7470             format("// Baseline - no comments.\n"
7471                    "template <\n"
7472                    "    typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
7473                    "void f() {}",
7474                    Style));
7475 
7476   EXPECT_EQ("template <\n"
7477             "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  // trailing\n"
7478             "void f() {}",
7479             format("template <\n"
7480                    "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
7481                    "void f() {}",
7482                    Style));
7483 
7484   EXPECT_EQ(
7485       "template <\n"
7486       "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n"
7487       "void f() {}",
7488       format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  /* line */\n"
7489              "void f() {}",
7490              Style));
7491 
7492   EXPECT_EQ(
7493       "template <\n"
7494       "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  // trailing\n"
7495       "                                               // multiline\n"
7496       "void f() {}",
7497       format("template <\n"
7498              "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
7499              "                                              // multiline\n"
7500              "void f() {}",
7501              Style));
7502 
7503   EXPECT_EQ(
7504       "template <typename aaaaaaaaaa<\n"
7505       "    bbbbbbbbbbbb>::value>  // trailing loooong\n"
7506       "void f() {}",
7507       format(
7508           "template <\n"
7509           "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n"
7510           "void f() {}",
7511           Style));
7512 }
7513 
7514 TEST_F(FormatTest, WrapsTemplateParameters) {
7515   FormatStyle Style = getLLVMStyle();
7516   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
7517   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
7518   verifyFormat(
7519       "template <typename... a> struct q {};\n"
7520       "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
7521       "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
7522       "    y;",
7523       Style);
7524   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
7525   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
7526   verifyFormat(
7527       "template <typename... a> struct r {};\n"
7528       "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
7529       "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
7530       "    y;",
7531       Style);
7532   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
7533   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
7534   verifyFormat("template <typename... a> struct s {};\n"
7535                "extern s<\n"
7536                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
7537                "aaaaaaaaaaaaaaaaaaaaaa,\n"
7538                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
7539                "aaaaaaaaaaaaaaaaaaaaaa>\n"
7540                "    y;",
7541                Style);
7542   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
7543   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
7544   verifyFormat("template <typename... a> struct t {};\n"
7545                "extern t<\n"
7546                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
7547                "aaaaaaaaaaaaaaaaaaaaaa,\n"
7548                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
7549                "aaaaaaaaaaaaaaaaaaaaaa>\n"
7550                "    y;",
7551                Style);
7552 }
7553 
7554 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
7555   verifyFormat(
7556       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
7557       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
7558   verifyFormat(
7559       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
7560       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7561       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
7562 
7563   // FIXME: Should we have the extra indent after the second break?
7564   verifyFormat(
7565       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
7566       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
7567       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
7568 
7569   verifyFormat(
7570       "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
7571       "                    cccccccccccccccccccccccccccccccccccccccccccccc());");
7572 
7573   // Breaking at nested name specifiers is generally not desirable.
7574   verifyFormat(
7575       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7576       "    aaaaaaaaaaaaaaaaaaaaaaa);");
7577 
7578   verifyFormat("aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
7579                "                   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
7580                "                       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7581                "                   aaaaaaaaaaaaaaaaaaaaa);",
7582                getLLVMStyleWithColumns(74));
7583 
7584   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
7585                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7586                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
7587 }
7588 
7589 TEST_F(FormatTest, UnderstandsTemplateParameters) {
7590   verifyFormat("A<int> a;");
7591   verifyFormat("A<A<A<int>>> a;");
7592   verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
7593   verifyFormat("bool x = a < 1 || 2 > a;");
7594   verifyFormat("bool x = 5 < f<int>();");
7595   verifyFormat("bool x = f<int>() > 5;");
7596   verifyFormat("bool x = 5 < a<int>::x;");
7597   verifyFormat("bool x = a < 4 ? a > 2 : false;");
7598   verifyFormat("bool x = f() ? a < 2 : a > 2;");
7599 
7600   verifyGoogleFormat("A<A<int>> a;");
7601   verifyGoogleFormat("A<A<A<int>>> a;");
7602   verifyGoogleFormat("A<A<A<A<int>>>> a;");
7603   verifyGoogleFormat("A<A<int> > a;");
7604   verifyGoogleFormat("A<A<A<int> > > a;");
7605   verifyGoogleFormat("A<A<A<A<int> > > > a;");
7606   verifyGoogleFormat("A<::A<int>> a;");
7607   verifyGoogleFormat("A<::A> a;");
7608   verifyGoogleFormat("A< ::A> a;");
7609   verifyGoogleFormat("A< ::A<int> > a;");
7610   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
7611   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
7612   EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
7613   EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
7614   EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
7615             format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
7616 
7617   verifyFormat("A<A<int>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
7618 
7619   // template closer followed by a token that starts with > or =
7620   verifyFormat("bool b = a<1> > 1;");
7621   verifyFormat("bool b = a<1> >= 1;");
7622   verifyFormat("int i = a<1> >> 1;");
7623   FormatStyle Style = getLLVMStyle();
7624   Style.SpaceBeforeAssignmentOperators = false;
7625   verifyFormat("bool b= a<1> == 1;", Style);
7626   verifyFormat("a<int> = 1;", Style);
7627   verifyFormat("a<int> >>= 1;", Style);
7628 
7629   verifyFormat("test >> a >> b;");
7630   verifyFormat("test << a >> b;");
7631 
7632   verifyFormat("f<int>();");
7633   verifyFormat("template <typename T> void f() {}");
7634   verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
7635   verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
7636                "sizeof(char)>::type>;");
7637   verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
7638   verifyFormat("f(a.operator()<A>());");
7639   verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7640                "      .template operator()<A>());",
7641                getLLVMStyleWithColumns(35));
7642 
7643   // Not template parameters.
7644   verifyFormat("return a < b && c > d;");
7645   verifyFormat("void f() {\n"
7646                "  while (a < b && c > d) {\n"
7647                "  }\n"
7648                "}");
7649   verifyFormat("template <typename... Types>\n"
7650                "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
7651 
7652   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7653                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
7654                getLLVMStyleWithColumns(60));
7655   verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
7656   verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
7657   verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
7658   verifyFormat("some_templated_type<decltype([](int i) { return i; })>");
7659 }
7660 
7661 TEST_F(FormatTest, UnderstandsShiftOperators) {
7662   verifyFormat("if (i < x >> 1)");
7663   verifyFormat("while (i < x >> 1)");
7664   verifyFormat("for (unsigned i = 0; i < i; ++i, v = v >> 1)");
7665   verifyFormat("for (unsigned i = 0; i < x >> 1; ++i, v = v >> 1)");
7666   verifyFormat(
7667       "for (std::vector<int>::iterator i = 0; i < x >> 1; ++i, v = v >> 1)");
7668   verifyFormat("Foo.call<Bar<Function>>()");
7669   verifyFormat("if (Foo.call<Bar<Function>>() == 0)");
7670   verifyFormat("for (std::vector<std::pair<int>>::iterator i = 0; i < x >> 1; "
7671                "++i, v = v >> 1)");
7672   verifyFormat("if (w<u<v<x>>, 1>::t)");
7673 }
7674 
7675 TEST_F(FormatTest, BitshiftOperatorWidth) {
7676   EXPECT_EQ("int a = 1 << 2; /* foo\n"
7677             "                   bar */",
7678             format("int    a=1<<2;  /* foo\n"
7679                    "                   bar */"));
7680 
7681   EXPECT_EQ("int b = 256 >> 1; /* foo\n"
7682             "                     bar */",
7683             format("int  b  =256>>1 ;  /* foo\n"
7684                    "                      bar */"));
7685 }
7686 
7687 TEST_F(FormatTest, UnderstandsBinaryOperators) {
7688   verifyFormat("COMPARE(a, ==, b);");
7689   verifyFormat("auto s = sizeof...(Ts) - 1;");
7690 }
7691 
7692 TEST_F(FormatTest, UnderstandsPointersToMembers) {
7693   verifyFormat("int A::*x;");
7694   verifyFormat("int (S::*func)(void *);");
7695   verifyFormat("void f() { int (S::*func)(void *); }");
7696   verifyFormat("typedef bool *(Class::*Member)() const;");
7697   verifyFormat("void f() {\n"
7698                "  (a->*f)();\n"
7699                "  a->*x;\n"
7700                "  (a.*f)();\n"
7701                "  ((*a).*f)();\n"
7702                "  a.*x;\n"
7703                "}");
7704   verifyFormat("void f() {\n"
7705                "  (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
7706                "      aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
7707                "}");
7708   verifyFormat(
7709       "(aaaaaaaaaa->*bbbbbbb)(\n"
7710       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
7711   FormatStyle Style = getLLVMStyle();
7712   Style.PointerAlignment = FormatStyle::PAS_Left;
7713   verifyFormat("typedef bool* (Class::*Member)() const;", Style);
7714 }
7715 
7716 TEST_F(FormatTest, UnderstandsUnaryOperators) {
7717   verifyFormat("int a = -2;");
7718   verifyFormat("f(-1, -2, -3);");
7719   verifyFormat("a[-1] = 5;");
7720   verifyFormat("int a = 5 + -2;");
7721   verifyFormat("if (i == -1) {\n}");
7722   verifyFormat("if (i != -1) {\n}");
7723   verifyFormat("if (i > -1) {\n}");
7724   verifyFormat("if (i < -1) {\n}");
7725   verifyFormat("++(a->f());");
7726   verifyFormat("--(a->f());");
7727   verifyFormat("(a->f())++;");
7728   verifyFormat("a[42]++;");
7729   verifyFormat("if (!(a->f())) {\n}");
7730   verifyFormat("if (!+i) {\n}");
7731   verifyFormat("~&a;");
7732 
7733   verifyFormat("a-- > b;");
7734   verifyFormat("b ? -a : c;");
7735   verifyFormat("n * sizeof char16;");
7736   verifyFormat("n * alignof char16;", getGoogleStyle());
7737   verifyFormat("sizeof(char);");
7738   verifyFormat("alignof(char);", getGoogleStyle());
7739 
7740   verifyFormat("return -1;");
7741   verifyFormat("throw -1;");
7742   verifyFormat("switch (a) {\n"
7743                "case -1:\n"
7744                "  break;\n"
7745                "}");
7746   verifyFormat("#define X -1");
7747   verifyFormat("#define X -kConstant");
7748 
7749   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
7750   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
7751 
7752   verifyFormat("int a = /* confusing comment */ -1;");
7753   // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
7754   verifyFormat("int a = i /* confusing comment */++;");
7755 
7756   verifyFormat("co_yield -1;");
7757   verifyFormat("co_return -1;");
7758 
7759   // Check that * is not treated as a binary operator when we set PointerAlignment
7760   // as PAS_Left after a keyword and not a declaration.
7761   FormatStyle PASLeftStyle = getLLVMStyle();
7762   PASLeftStyle.PointerAlignment = FormatStyle::PAS_Left;
7763   verifyFormat("co_return *a;", PASLeftStyle);
7764   verifyFormat("co_await *a;", PASLeftStyle);
7765   verifyFormat("co_yield *a", PASLeftStyle);
7766   verifyFormat("return *a;", PASLeftStyle);
7767 }
7768 
7769 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
7770   verifyFormat("if (!aaaaaaaaaa( // break\n"
7771                "        aaaaa)) {\n"
7772                "}");
7773   verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
7774                "    aaaaa));");
7775   verifyFormat("*aaa = aaaaaaa( // break\n"
7776                "    bbbbbb);");
7777 }
7778 
7779 TEST_F(FormatTest, UnderstandsOverloadedOperators) {
7780   verifyFormat("bool operator<();");
7781   verifyFormat("bool operator>();");
7782   verifyFormat("bool operator=();");
7783   verifyFormat("bool operator==();");
7784   verifyFormat("bool operator!=();");
7785   verifyFormat("int operator+();");
7786   verifyFormat("int operator++();");
7787   verifyFormat("int operator++(int) volatile noexcept;");
7788   verifyFormat("bool operator,();");
7789   verifyFormat("bool operator();");
7790   verifyFormat("bool operator()();");
7791   verifyFormat("bool operator[]();");
7792   verifyFormat("operator bool();");
7793   verifyFormat("operator int();");
7794   verifyFormat("operator void *();");
7795   verifyFormat("operator SomeType<int>();");
7796   verifyFormat("operator SomeType<int, int>();");
7797   verifyFormat("operator SomeType<SomeType<int>>();");
7798   verifyFormat("void *operator new(std::size_t size);");
7799   verifyFormat("void *operator new[](std::size_t size);");
7800   verifyFormat("void operator delete(void *ptr);");
7801   verifyFormat("void operator delete[](void *ptr);");
7802   verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
7803                "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
7804   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
7805                "    aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
7806 
7807   verifyFormat(
7808       "ostream &operator<<(ostream &OutputStream,\n"
7809       "                    SomeReallyLongType WithSomeReallyLongValue);");
7810   verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
7811                "               const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
7812                "  return left.group < right.group;\n"
7813                "}");
7814   verifyFormat("SomeType &operator=(const SomeType &S);");
7815   verifyFormat("f.template operator()<int>();");
7816 
7817   verifyGoogleFormat("operator void*();");
7818   verifyGoogleFormat("operator SomeType<SomeType<int>>();");
7819   verifyGoogleFormat("operator ::A();");
7820 
7821   verifyFormat("using A::operator+;");
7822   verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
7823                "int i;");
7824 }
7825 
7826 TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
7827   verifyFormat("Deleted &operator=(const Deleted &) & = default;");
7828   verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
7829   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
7830   verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
7831   verifyFormat("Deleted &operator=(const Deleted &) &;");
7832   verifyFormat("Deleted &operator=(const Deleted &) &&;");
7833   verifyFormat("SomeType MemberFunction(const Deleted &) &;");
7834   verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
7835   verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
7836   verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
7837   verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
7838   verifyFormat("void Fn(T const &) const &;");
7839   verifyFormat("void Fn(T const volatile &&) const volatile &&;");
7840   verifyFormat("template <typename T>\n"
7841                "void F(T) && = delete;",
7842                getGoogleStyle());
7843 
7844   FormatStyle AlignLeft = getLLVMStyle();
7845   AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
7846   verifyFormat("void A::b() && {}", AlignLeft);
7847   verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
7848   verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
7849                AlignLeft);
7850   verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
7851   verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
7852   verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
7853   verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
7854   verifyFormat("auto Function(T) & -> void {}", AlignLeft);
7855   verifyFormat("auto Function(T) & -> void;", AlignLeft);
7856   verifyFormat("void Fn(T const&) const&;", AlignLeft);
7857   verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
7858 
7859   FormatStyle Spaces = getLLVMStyle();
7860   Spaces.SpacesInCStyleCastParentheses = true;
7861   verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
7862   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
7863   verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
7864   verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
7865 
7866   Spaces.SpacesInCStyleCastParentheses = false;
7867   Spaces.SpacesInParentheses = true;
7868   verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
7869   verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;",
7870                Spaces);
7871   verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
7872   verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
7873 
7874   FormatStyle BreakTemplate = getLLVMStyle();
7875   BreakTemplate.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
7876 
7877   verifyFormat("struct f {\n"
7878                "  template <class T>\n"
7879                "  int &foo(const std::string &str) &noexcept {}\n"
7880                "};",
7881                BreakTemplate);
7882 
7883   verifyFormat("struct f {\n"
7884                "  template <class T>\n"
7885                "  int &foo(const std::string &str) &&noexcept {}\n"
7886                "};",
7887                BreakTemplate);
7888 
7889   verifyFormat("struct f {\n"
7890                "  template <class T>\n"
7891                "  int &foo(const std::string &str) const &noexcept {}\n"
7892                "};",
7893                BreakTemplate);
7894 
7895   verifyFormat("struct f {\n"
7896                "  template <class T>\n"
7897                "  int &foo(const std::string &str) const &noexcept {}\n"
7898                "};",
7899                BreakTemplate);
7900 
7901   verifyFormat("struct f {\n"
7902                "  template <class T>\n"
7903                "  auto foo(const std::string &str) &&noexcept -> int & {}\n"
7904                "};",
7905                BreakTemplate);
7906 
7907   FormatStyle AlignLeftBreakTemplate = getLLVMStyle();
7908   AlignLeftBreakTemplate.AlwaysBreakTemplateDeclarations =
7909       FormatStyle::BTDS_Yes;
7910   AlignLeftBreakTemplate.PointerAlignment = FormatStyle::PAS_Left;
7911 
7912   verifyFormat("struct f {\n"
7913                "  template <class T>\n"
7914                "  int& foo(const std::string& str) & noexcept {}\n"
7915                "};",
7916                AlignLeftBreakTemplate);
7917 
7918   verifyFormat("struct f {\n"
7919                "  template <class T>\n"
7920                "  int& foo(const std::string& str) && noexcept {}\n"
7921                "};",
7922                AlignLeftBreakTemplate);
7923 
7924   verifyFormat("struct f {\n"
7925                "  template <class T>\n"
7926                "  int& foo(const std::string& str) const& noexcept {}\n"
7927                "};",
7928                AlignLeftBreakTemplate);
7929 
7930   verifyFormat("struct f {\n"
7931                "  template <class T>\n"
7932                "  int& foo(const std::string& str) const&& noexcept {}\n"
7933                "};",
7934                AlignLeftBreakTemplate);
7935 
7936   verifyFormat("struct f {\n"
7937                "  template <class T>\n"
7938                "  auto foo(const std::string& str) && noexcept -> int& {}\n"
7939                "};",
7940                AlignLeftBreakTemplate);
7941 
7942   // The `&` in `Type&` should not be confused with a trailing `&` of
7943   // DEPRECATED(reason) member function.
7944   verifyFormat("struct f {\n"
7945                "  template <class T>\n"
7946                "  DEPRECATED(reason)\n"
7947                "  Type &foo(arguments) {}\n"
7948                "};",
7949                BreakTemplate);
7950 
7951   verifyFormat("struct f {\n"
7952                "  template <class T>\n"
7953                "  DEPRECATED(reason)\n"
7954                "  Type& foo(arguments) {}\n"
7955                "};",
7956                AlignLeftBreakTemplate);
7957 
7958   verifyFormat("void (*foopt)(int) = &func;");
7959 }
7960 
7961 TEST_F(FormatTest, UnderstandsNewAndDelete) {
7962   verifyFormat("void f() {\n"
7963                "  A *a = new A;\n"
7964                "  A *a = new (placement) A;\n"
7965                "  delete a;\n"
7966                "  delete (A *)a;\n"
7967                "}");
7968   verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
7969                "    typename aaaaaaaaaaaaaaaaaaaaaaaa();");
7970   verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7971                "    new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
7972                "        typename aaaaaaaaaaaaaaaaaaaaaaaa();");
7973   verifyFormat("delete[] h->p;");
7974 }
7975 
7976 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
7977   verifyFormat("int *f(int *a) {}");
7978   verifyFormat("int main(int argc, char **argv) {}");
7979   verifyFormat("Test::Test(int b) : a(b * b) {}");
7980   verifyIndependentOfContext("f(a, *a);");
7981   verifyFormat("void g() { f(*a); }");
7982   verifyIndependentOfContext("int a = b * 10;");
7983   verifyIndependentOfContext("int a = 10 * b;");
7984   verifyIndependentOfContext("int a = b * c;");
7985   verifyIndependentOfContext("int a += b * c;");
7986   verifyIndependentOfContext("int a -= b * c;");
7987   verifyIndependentOfContext("int a *= b * c;");
7988   verifyIndependentOfContext("int a /= b * c;");
7989   verifyIndependentOfContext("int a = *b;");
7990   verifyIndependentOfContext("int a = *b * c;");
7991   verifyIndependentOfContext("int a = b * *c;");
7992   verifyIndependentOfContext("int a = b * (10);");
7993   verifyIndependentOfContext("S << b * (10);");
7994   verifyIndependentOfContext("return 10 * b;");
7995   verifyIndependentOfContext("return *b * *c;");
7996   verifyIndependentOfContext("return a & ~b;");
7997   verifyIndependentOfContext("f(b ? *c : *d);");
7998   verifyIndependentOfContext("int a = b ? *c : *d;");
7999   verifyIndependentOfContext("*b = a;");
8000   verifyIndependentOfContext("a * ~b;");
8001   verifyIndependentOfContext("a * !b;");
8002   verifyIndependentOfContext("a * +b;");
8003   verifyIndependentOfContext("a * -b;");
8004   verifyIndependentOfContext("a * ++b;");
8005   verifyIndependentOfContext("a * --b;");
8006   verifyIndependentOfContext("a[4] * b;");
8007   verifyIndependentOfContext("a[a * a] = 1;");
8008   verifyIndependentOfContext("f() * b;");
8009   verifyIndependentOfContext("a * [self dostuff];");
8010   verifyIndependentOfContext("int x = a * (a + b);");
8011   verifyIndependentOfContext("(a *)(a + b);");
8012   verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
8013   verifyIndependentOfContext("int *pa = (int *)&a;");
8014   verifyIndependentOfContext("return sizeof(int **);");
8015   verifyIndependentOfContext("return sizeof(int ******);");
8016   verifyIndependentOfContext("return (int **&)a;");
8017   verifyIndependentOfContext("f((*PointerToArray)[10]);");
8018   verifyFormat("void f(Type (*parameter)[10]) {}");
8019   verifyFormat("void f(Type (&parameter)[10]) {}");
8020   verifyGoogleFormat("return sizeof(int**);");
8021   verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
8022   verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
8023   verifyFormat("auto a = [](int **&, int ***) {};");
8024   verifyFormat("auto PointerBinding = [](const char *S) {};");
8025   verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
8026   verifyFormat("[](const decltype(*a) &value) {}");
8027   verifyFormat("[](const typeof(*a) &value) {}");
8028   verifyFormat("[](const _Atomic(a *) &value) {}");
8029   verifyFormat("[](const __underlying_type(a) &value) {}");
8030   verifyFormat("decltype(a * b) F();");
8031   verifyFormat("typeof(a * b) F();");
8032   verifyFormat("#define MACRO() [](A *a) { return 1; }");
8033   verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
8034   verifyIndependentOfContext("typedef void (*f)(int *a);");
8035   verifyIndependentOfContext("int i{a * b};");
8036   verifyIndependentOfContext("aaa && aaa->f();");
8037   verifyIndependentOfContext("int x = ~*p;");
8038   verifyFormat("Constructor() : a(a), area(width * height) {}");
8039   verifyFormat("Constructor() : a(a), area(a, width * height) {}");
8040   verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
8041   verifyFormat("void f() { f(a, c * d); }");
8042   verifyFormat("void f() { f(new a(), c * d); }");
8043   verifyFormat("void f(const MyOverride &override);");
8044   verifyFormat("void f(const MyFinal &final);");
8045   verifyIndependentOfContext("bool a = f() && override.f();");
8046   verifyIndependentOfContext("bool a = f() && final.f();");
8047 
8048   verifyIndependentOfContext("InvalidRegions[*R] = 0;");
8049 
8050   verifyIndependentOfContext("A<int *> a;");
8051   verifyIndependentOfContext("A<int **> a;");
8052   verifyIndependentOfContext("A<int *, int *> a;");
8053   verifyIndependentOfContext("A<int *[]> a;");
8054   verifyIndependentOfContext(
8055       "const char *const p = reinterpret_cast<const char *const>(q);");
8056   verifyIndependentOfContext("A<int **, int **> a;");
8057   verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
8058   verifyFormat("for (char **a = b; *a; ++a) {\n}");
8059   verifyFormat("for (; a && b;) {\n}");
8060   verifyFormat("bool foo = true && [] { return false; }();");
8061 
8062   verifyFormat(
8063       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
8064       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
8065 
8066   verifyGoogleFormat("int const* a = &b;");
8067   verifyGoogleFormat("**outparam = 1;");
8068   verifyGoogleFormat("*outparam = a * b;");
8069   verifyGoogleFormat("int main(int argc, char** argv) {}");
8070   verifyGoogleFormat("A<int*> a;");
8071   verifyGoogleFormat("A<int**> a;");
8072   verifyGoogleFormat("A<int*, int*> a;");
8073   verifyGoogleFormat("A<int**, int**> a;");
8074   verifyGoogleFormat("f(b ? *c : *d);");
8075   verifyGoogleFormat("int a = b ? *c : *d;");
8076   verifyGoogleFormat("Type* t = **x;");
8077   verifyGoogleFormat("Type* t = *++*x;");
8078   verifyGoogleFormat("*++*x;");
8079   verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
8080   verifyGoogleFormat("Type* t = x++ * y;");
8081   verifyGoogleFormat(
8082       "const char* const p = reinterpret_cast<const char* const>(q);");
8083   verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
8084   verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
8085   verifyGoogleFormat("template <typename T>\n"
8086                      "void f(int i = 0, SomeType** temps = NULL);");
8087 
8088   FormatStyle Left = getLLVMStyle();
8089   Left.PointerAlignment = FormatStyle::PAS_Left;
8090   verifyFormat("x = *a(x) = *a(y);", Left);
8091   verifyFormat("for (;; *a = b) {\n}", Left);
8092   verifyFormat("return *this += 1;", Left);
8093   verifyFormat("throw *x;", Left);
8094   verifyFormat("delete *x;", Left);
8095   verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
8096   verifyFormat("[](const decltype(*a)* ptr) {}", Left);
8097   verifyFormat("[](const typeof(*a)* ptr) {}", Left);
8098   verifyFormat("[](const _Atomic(a*)* ptr) {}", Left);
8099   verifyFormat("[](const __underlying_type(a)* ptr) {}", Left);
8100   verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
8101   verifyFormat("auto x(A&&, B&&, C&&) -> D;", Left);
8102   verifyFormat("auto x = [](A&&, B&&, C&&) -> D {};", Left);
8103   verifyFormat("template <class T> X(T&&, T&&, T&&) -> X<T>;", Left);
8104 
8105   verifyIndependentOfContext("a = *(x + y);");
8106   verifyIndependentOfContext("a = &(x + y);");
8107   verifyIndependentOfContext("*(x + y).call();");
8108   verifyIndependentOfContext("&(x + y)->call();");
8109   verifyFormat("void f() { &(*I).first; }");
8110 
8111   verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
8112   verifyFormat(
8113       "int *MyValues = {\n"
8114       "    *A, // Operator detection might be confused by the '{'\n"
8115       "    *BB // Operator detection might be confused by previous comment\n"
8116       "};");
8117 
8118   verifyIndependentOfContext("if (int *a = &b)");
8119   verifyIndependentOfContext("if (int &a = *b)");
8120   verifyIndependentOfContext("if (a & b[i])");
8121   verifyIndependentOfContext("if constexpr (a & b[i])");
8122   verifyIndependentOfContext("if CONSTEXPR (a & b[i])");
8123   verifyIndependentOfContext("if (a * (b * c))");
8124   verifyIndependentOfContext("if constexpr (a * (b * c))");
8125   verifyIndependentOfContext("if CONSTEXPR (a * (b * c))");
8126   verifyIndependentOfContext("if (a::b::c::d & b[i])");
8127   verifyIndependentOfContext("if (*b[i])");
8128   verifyIndependentOfContext("if (int *a = (&b))");
8129   verifyIndependentOfContext("while (int *a = &b)");
8130   verifyIndependentOfContext("while (a * (b * c))");
8131   verifyIndependentOfContext("size = sizeof *a;");
8132   verifyIndependentOfContext("if (a && (b = c))");
8133   verifyFormat("void f() {\n"
8134                "  for (const int &v : Values) {\n"
8135                "  }\n"
8136                "}");
8137   verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
8138   verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
8139   verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
8140 
8141   verifyFormat("#define A (!a * b)");
8142   verifyFormat("#define MACRO     \\\n"
8143                "  int *i = a * b; \\\n"
8144                "  void f(a *b);",
8145                getLLVMStyleWithColumns(19));
8146 
8147   verifyIndependentOfContext("A = new SomeType *[Length];");
8148   verifyIndependentOfContext("A = new SomeType *[Length]();");
8149   verifyIndependentOfContext("T **t = new T *;");
8150   verifyIndependentOfContext("T **t = new T *();");
8151   verifyGoogleFormat("A = new SomeType*[Length]();");
8152   verifyGoogleFormat("A = new SomeType*[Length];");
8153   verifyGoogleFormat("T** t = new T*;");
8154   verifyGoogleFormat("T** t = new T*();");
8155 
8156   verifyFormat("STATIC_ASSERT((a & b) == 0);");
8157   verifyFormat("STATIC_ASSERT(0 == (a & b));");
8158   verifyFormat("template <bool a, bool b> "
8159                "typename t::if<x && y>::type f() {}");
8160   verifyFormat("template <int *y> f() {}");
8161   verifyFormat("vector<int *> v;");
8162   verifyFormat("vector<int *const> v;");
8163   verifyFormat("vector<int *const **const *> v;");
8164   verifyFormat("vector<int *volatile> v;");
8165   verifyFormat("vector<a *_Nonnull> v;");
8166   verifyFormat("vector<a *_Nullable> v;");
8167   verifyFormat("vector<a *_Null_unspecified> v;");
8168   verifyFormat("vector<a *__ptr32> v;");
8169   verifyFormat("vector<a *__ptr64> v;");
8170   verifyFormat("vector<a *__capability> v;");
8171   FormatStyle TypeMacros = getLLVMStyle();
8172   TypeMacros.TypenameMacros = {"LIST"};
8173   verifyFormat("vector<LIST(uint64_t)> v;", TypeMacros);
8174   verifyFormat("vector<LIST(uint64_t) *> v;", TypeMacros);
8175   verifyFormat("vector<LIST(uint64_t) **> v;", TypeMacros);
8176   verifyFormat("vector<LIST(uint64_t) *attr> v;", TypeMacros);
8177   verifyFormat("vector<A(uint64_t) * attr> v;", TypeMacros); // multiplication
8178 
8179   FormatStyle CustomQualifier = getLLVMStyle();
8180   // Add indentifers that should not be parsed as a qualifier by default.
8181   CustomQualifier.AttributeMacros.push_back("__my_qualifier");
8182   CustomQualifier.AttributeMacros.push_back("_My_qualifier");
8183   CustomQualifier.AttributeMacros.push_back("my_other_qualifier");
8184   verifyFormat("vector<a * __my_qualifier> parse_as_multiply;");
8185   verifyFormat("vector<a *__my_qualifier> v;", CustomQualifier);
8186   verifyFormat("vector<a * _My_qualifier> parse_as_multiply;");
8187   verifyFormat("vector<a *_My_qualifier> v;", CustomQualifier);
8188   verifyFormat("vector<a * my_other_qualifier> parse_as_multiply;");
8189   verifyFormat("vector<a *my_other_qualifier> v;", CustomQualifier);
8190   verifyFormat("vector<a * _NotAQualifier> v;");
8191   verifyFormat("vector<a * __not_a_qualifier> v;");
8192   verifyFormat("vector<a * b> v;");
8193   verifyFormat("foo<b && false>();");
8194   verifyFormat("foo<b & 1>();");
8195   verifyFormat("decltype(*::std::declval<const T &>()) void F();");
8196   verifyFormat("typeof(*::std::declval<const T &>()) void F();");
8197   verifyFormat("_Atomic(*::std::declval<const T &>()) void F();");
8198   verifyFormat("__underlying_type(*::std::declval<const T &>()) void F();");
8199   verifyFormat(
8200       "template <class T, class = typename std::enable_if<\n"
8201       "                       std::is_integral<T>::value &&\n"
8202       "                       (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
8203       "void F();",
8204       getLLVMStyleWithColumns(70));
8205   verifyFormat("template <class T,\n"
8206                "          class = typename std::enable_if<\n"
8207                "              std::is_integral<T>::value &&\n"
8208                "              (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
8209                "          class U>\n"
8210                "void F();",
8211                getLLVMStyleWithColumns(70));
8212   verifyFormat(
8213       "template <class T,\n"
8214       "          class = typename ::std::enable_if<\n"
8215       "              ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
8216       "void F();",
8217       getGoogleStyleWithColumns(68));
8218 
8219   verifyIndependentOfContext("MACRO(int *i);");
8220   verifyIndependentOfContext("MACRO(auto *a);");
8221   verifyIndependentOfContext("MACRO(const A *a);");
8222   verifyIndependentOfContext("MACRO(_Atomic(A) *a);");
8223   verifyIndependentOfContext("MACRO(decltype(A) *a);");
8224   verifyIndependentOfContext("MACRO(typeof(A) *a);");
8225   verifyIndependentOfContext("MACRO(__underlying_type(A) *a);");
8226   verifyIndependentOfContext("MACRO(A *const a);");
8227   verifyIndependentOfContext("MACRO(A *restrict a);");
8228   verifyIndependentOfContext("MACRO(A *__restrict__ a);");
8229   verifyIndependentOfContext("MACRO(A *__restrict a);");
8230   verifyIndependentOfContext("MACRO(A *volatile a);");
8231   verifyIndependentOfContext("MACRO(A *__volatile a);");
8232   verifyIndependentOfContext("MACRO(A *__volatile__ a);");
8233   verifyIndependentOfContext("MACRO(A *_Nonnull a);");
8234   verifyIndependentOfContext("MACRO(A *_Nullable a);");
8235   verifyIndependentOfContext("MACRO(A *_Null_unspecified a);");
8236   verifyIndependentOfContext("MACRO(A *__attribute__((foo)) a);");
8237   verifyIndependentOfContext("MACRO(A *__attribute((foo)) a);");
8238   verifyIndependentOfContext("MACRO(A *[[clang::attr]] a);");
8239   verifyIndependentOfContext("MACRO(A *[[clang::attr(\"foo\")]] a);");
8240   verifyIndependentOfContext("MACRO(A *__ptr32 a);");
8241   verifyIndependentOfContext("MACRO(A *__ptr64 a);");
8242   verifyIndependentOfContext("MACRO(A *__capability);");
8243   verifyIndependentOfContext("MACRO(A &__capability);");
8244   verifyFormat("MACRO(A *__my_qualifier);");               // type declaration
8245   verifyFormat("void f() { MACRO(A * __my_qualifier); }"); // multiplication
8246   // If we add __my_qualifier to AttributeMacros it should always be parsed as
8247   // a type declaration:
8248   verifyFormat("MACRO(A *__my_qualifier);", CustomQualifier);
8249   verifyFormat("void f() { MACRO(A *__my_qualifier); }", CustomQualifier);
8250   // Also check that TypenameMacros prevents parsing it as multiplication:
8251   verifyIndependentOfContext("MACRO(LIST(uint64_t) * a);"); // multiplication
8252   verifyIndependentOfContext("MACRO(LIST(uint64_t) *a);", TypeMacros); // type
8253 
8254   verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
8255   verifyFormat("void f() { f(float{1}, a * a); }");
8256   // FIXME: Is there a way to make this work?
8257   // verifyIndependentOfContext("MACRO(A *a);");
8258   verifyFormat("MACRO(A &B);");
8259   verifyFormat("MACRO(A *B);");
8260   verifyFormat("void f() { MACRO(A * B); }");
8261   verifyFormat("void f() { MACRO(A & B); }");
8262 
8263   // This lambda was mis-formatted after D88956 (treating it as a binop):
8264   verifyFormat("auto x = [](const decltype(x) &ptr) {};");
8265   verifyFormat("auto x = [](const decltype(x) *ptr) {};");
8266   verifyFormat("#define lambda [](const decltype(x) &ptr) {}");
8267   verifyFormat("#define lambda [](const decltype(x) *ptr) {}");
8268 
8269   verifyFormat("DatumHandle const *operator->() const { return input_; }");
8270   verifyFormat("return options != nullptr && operator==(*options);");
8271 
8272   EXPECT_EQ("#define OP(x)                                    \\\n"
8273             "  ostream &operator<<(ostream &s, const A &a) {  \\\n"
8274             "    return s << a.DebugString();                 \\\n"
8275             "  }",
8276             format("#define OP(x) \\\n"
8277                    "  ostream &operator<<(ostream &s, const A &a) { \\\n"
8278                    "    return s << a.DebugString(); \\\n"
8279                    "  }",
8280                    getLLVMStyleWithColumns(50)));
8281 
8282   // FIXME: We cannot handle this case yet; we might be able to figure out that
8283   // foo<x> d > v; doesn't make sense.
8284   verifyFormat("foo<a<b && c> d> v;");
8285 
8286   FormatStyle PointerMiddle = getLLVMStyle();
8287   PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
8288   verifyFormat("delete *x;", PointerMiddle);
8289   verifyFormat("int * x;", PointerMiddle);
8290   verifyFormat("int *[] x;", PointerMiddle);
8291   verifyFormat("template <int * y> f() {}", PointerMiddle);
8292   verifyFormat("int * f(int * a) {}", PointerMiddle);
8293   verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
8294   verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
8295   verifyFormat("A<int *> a;", PointerMiddle);
8296   verifyFormat("A<int **> a;", PointerMiddle);
8297   verifyFormat("A<int *, int *> a;", PointerMiddle);
8298   verifyFormat("A<int *[]> a;", PointerMiddle);
8299   verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
8300   verifyFormat("A = new SomeType *[Length];", PointerMiddle);
8301   verifyFormat("T ** t = new T *;", PointerMiddle);
8302 
8303   // Member function reference qualifiers aren't binary operators.
8304   verifyFormat("string // break\n"
8305                "operator()() & {}");
8306   verifyFormat("string // break\n"
8307                "operator()() && {}");
8308   verifyGoogleFormat("template <typename T>\n"
8309                      "auto x() & -> int {}");
8310 }
8311 
8312 TEST_F(FormatTest, UnderstandsAttributes) {
8313   verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
8314   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
8315                "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
8316   FormatStyle AfterType = getLLVMStyle();
8317   AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
8318   verifyFormat("__attribute__((nodebug)) void\n"
8319                "foo() {}\n",
8320                AfterType);
8321   verifyFormat("__unused void\n"
8322                "foo() {}",
8323                AfterType);
8324 
8325   FormatStyle CustomAttrs = getLLVMStyle();
8326   CustomAttrs.AttributeMacros.push_back("__unused");
8327   CustomAttrs.AttributeMacros.push_back("__attr1");
8328   CustomAttrs.AttributeMacros.push_back("__attr2");
8329   CustomAttrs.AttributeMacros.push_back("no_underscore_attr");
8330   verifyFormat("vector<SomeType *__attribute((foo))> v;");
8331   verifyFormat("vector<SomeType *__attribute__((foo))> v;");
8332   verifyFormat("vector<SomeType * __not_attribute__((foo))> v;");
8333   // Check that it is parsed as a multiplication without AttributeMacros and
8334   // as a pointer qualifier when we add __attr1/__attr2 to AttributeMacros.
8335   verifyFormat("vector<SomeType * __attr1> v;");
8336   verifyFormat("vector<SomeType __attr1 *> v;");
8337   verifyFormat("vector<SomeType __attr1 *const> v;");
8338   verifyFormat("vector<SomeType __attr1 * __attr2> v;");
8339   verifyFormat("vector<SomeType *__attr1> v;", CustomAttrs);
8340   verifyFormat("vector<SomeType *__attr2> v;", CustomAttrs);
8341   verifyFormat("vector<SomeType *no_underscore_attr> v;", CustomAttrs);
8342   verifyFormat("vector<SomeType __attr1 *> v;", CustomAttrs);
8343   verifyFormat("vector<SomeType __attr1 *const> v;", CustomAttrs);
8344   verifyFormat("vector<SomeType __attr1 *__attr2> v;", CustomAttrs);
8345   verifyFormat("vector<SomeType __attr1 *no_underscore_attr> v;", CustomAttrs);
8346 
8347   // Check that these are not parsed as function declarations:
8348   CustomAttrs.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
8349   CustomAttrs.BreakBeforeBraces = FormatStyle::BS_Allman;
8350   verifyFormat("SomeType s(InitValue);", CustomAttrs);
8351   verifyFormat("SomeType s{InitValue};", CustomAttrs);
8352   verifyFormat("SomeType *__unused s(InitValue);", CustomAttrs);
8353   verifyFormat("SomeType *__unused s{InitValue};", CustomAttrs);
8354   verifyFormat("SomeType s __unused(InitValue);", CustomAttrs);
8355   verifyFormat("SomeType s __unused{InitValue};", CustomAttrs);
8356   verifyFormat("SomeType *__capability s(InitValue);", CustomAttrs);
8357   verifyFormat("SomeType *__capability s{InitValue};", CustomAttrs);
8358 }
8359 
8360 TEST_F(FormatTest, UnderstandsPointerQualifiersInCast) {
8361   // Check that qualifiers on pointers don't break parsing of casts.
8362   verifyFormat("x = (foo *const)*v;");
8363   verifyFormat("x = (foo *volatile)*v;");
8364   verifyFormat("x = (foo *restrict)*v;");
8365   verifyFormat("x = (foo *__attribute__((foo)))*v;");
8366   verifyFormat("x = (foo *_Nonnull)*v;");
8367   verifyFormat("x = (foo *_Nullable)*v;");
8368   verifyFormat("x = (foo *_Null_unspecified)*v;");
8369   verifyFormat("x = (foo *_Nonnull)*v;");
8370   verifyFormat("x = (foo *[[clang::attr]])*v;");
8371   verifyFormat("x = (foo *[[clang::attr(\"foo\")]])*v;");
8372   verifyFormat("x = (foo *__ptr32)*v;");
8373   verifyFormat("x = (foo *__ptr64)*v;");
8374   verifyFormat("x = (foo *__capability)*v;");
8375 
8376   // Check that we handle multiple trailing qualifiers and skip them all to
8377   // determine that the expression is a cast to a pointer type.
8378   FormatStyle LongPointerRight = getLLVMStyleWithColumns(999);
8379   FormatStyle LongPointerLeft = getLLVMStyleWithColumns(999);
8380   LongPointerLeft.PointerAlignment = FormatStyle::PAS_Left;
8381   StringRef AllQualifiers =
8382       "const volatile restrict __attribute__((foo)) _Nonnull _Null_unspecified "
8383       "_Nonnull [[clang::attr]] __ptr32 __ptr64 __capability";
8384   verifyFormat(("x = (foo *" + AllQualifiers + ")*v;").str(), LongPointerRight);
8385   verifyFormat(("x = (foo* " + AllQualifiers + ")*v;").str(), LongPointerLeft);
8386 
8387   // Also check that address-of is not parsed as a binary bitwise-and:
8388   verifyFormat("x = (foo *const)&v;");
8389   verifyFormat(("x = (foo *" + AllQualifiers + ")&v;").str(), LongPointerRight);
8390   verifyFormat(("x = (foo* " + AllQualifiers + ")&v;").str(), LongPointerLeft);
8391 
8392   // Check custom qualifiers:
8393   FormatStyle CustomQualifier = getLLVMStyleWithColumns(999);
8394   CustomQualifier.AttributeMacros.push_back("__my_qualifier");
8395   verifyFormat("x = (foo * __my_qualifier) * v;"); // not parsed as qualifier.
8396   verifyFormat("x = (foo *__my_qualifier)*v;", CustomQualifier);
8397   verifyFormat(("x = (foo *" + AllQualifiers + " __my_qualifier)*v;").str(),
8398                CustomQualifier);
8399   verifyFormat(("x = (foo *" + AllQualifiers + " __my_qualifier)&v;").str(),
8400                CustomQualifier);
8401 
8402   // Check that unknown identifiers result in binary operator parsing:
8403   verifyFormat("x = (foo * __unknown_qualifier) * v;");
8404   verifyFormat("x = (foo * __unknown_qualifier) & v;");
8405 }
8406 
8407 TEST_F(FormatTest, UnderstandsSquareAttributes) {
8408   verifyFormat("SomeType s [[unused]] (InitValue);");
8409   verifyFormat("SomeType s [[gnu::unused]] (InitValue);");
8410   verifyFormat("SomeType s [[using gnu: unused]] (InitValue);");
8411   verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}");
8412   verifyFormat("void f() [[deprecated(\"so sorry\")]];");
8413   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8414                "    [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);");
8415   verifyFormat("[[nodiscard]] bool f() { return false; }");
8416   verifyFormat("class [[nodiscard]] f {\npublic:\n  f() {}\n}");
8417   verifyFormat("class [[deprecated(\"so sorry\")]] f {\npublic:\n  f() {}\n}");
8418   verifyFormat("class [[gnu::unused]] f {\npublic:\n  f() {}\n}");
8419 
8420   // Make sure we do not mistake attributes for array subscripts.
8421   verifyFormat("int a() {}\n"
8422                "[[unused]] int b() {}\n");
8423   verifyFormat("NSArray *arr;\n"
8424                "arr[[Foo() bar]];");
8425 
8426   // On the other hand, we still need to correctly find array subscripts.
8427   verifyFormat("int a = std::vector<int>{1, 2, 3}[0];");
8428 
8429   // Make sure that we do not mistake Objective-C method inside array literals
8430   // as attributes, even if those method names are also keywords.
8431   verifyFormat("@[ [foo bar] ];");
8432   verifyFormat("@[ [NSArray class] ];");
8433   verifyFormat("@[ [foo enum] ];");
8434 
8435   verifyFormat("template <typename T> [[nodiscard]] int a() { return 1; }");
8436 
8437   // Make sure we do not parse attributes as lambda introducers.
8438   FormatStyle MultiLineFunctions = getLLVMStyle();
8439   MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
8440   verifyFormat("[[unused]] int b() {\n"
8441                "  return 42;\n"
8442                "}\n",
8443                MultiLineFunctions);
8444 }
8445 
8446 TEST_F(FormatTest, AttributeClass) {
8447   FormatStyle Style = getChromiumStyle(FormatStyle::LK_Cpp);
8448   verifyFormat("class S {\n"
8449                "  S(S&&) = default;\n"
8450                "};",
8451                Style);
8452   verifyFormat("class [[nodiscard]] S {\n"
8453                "  S(S&&) = default;\n"
8454                "};",
8455                Style);
8456   verifyFormat("class __attribute((maybeunused)) S {\n"
8457                "  S(S&&) = default;\n"
8458                "};",
8459                Style);
8460   verifyFormat("struct S {\n"
8461                "  S(S&&) = default;\n"
8462                "};",
8463                Style);
8464   verifyFormat("struct [[nodiscard]] S {\n"
8465                "  S(S&&) = default;\n"
8466                "};",
8467                Style);
8468 }
8469 
8470 TEST_F(FormatTest, AttributesAfterMacro) {
8471   FormatStyle Style = getLLVMStyle();
8472   verifyFormat("MACRO;\n"
8473                "__attribute__((maybe_unused)) int foo() {\n"
8474                "  //...\n"
8475                "}");
8476 
8477   verifyFormat("MACRO;\n"
8478                "[[nodiscard]] int foo() {\n"
8479                "  //...\n"
8480                "}");
8481 
8482   EXPECT_EQ("MACRO\n\n"
8483             "__attribute__((maybe_unused)) int foo() {\n"
8484             "  //...\n"
8485             "}",
8486             format("MACRO\n\n"
8487                    "__attribute__((maybe_unused)) int foo() {\n"
8488                    "  //...\n"
8489                    "}"));
8490 
8491   EXPECT_EQ("MACRO\n\n"
8492             "[[nodiscard]] int foo() {\n"
8493             "  //...\n"
8494             "}",
8495             format("MACRO\n\n"
8496                    "[[nodiscard]] int foo() {\n"
8497                    "  //...\n"
8498                    "}"));
8499 }
8500 
8501 TEST_F(FormatTest, AttributePenaltyBreaking) {
8502   FormatStyle Style = getLLVMStyle();
8503   verifyFormat("void ABCDEFGH::ABCDEFGHIJKLMN(\n"
8504                "    [[maybe_unused]] const shared_ptr<ALongTypeName> &C d) {}",
8505                Style);
8506   verifyFormat("void ABCDEFGH::ABCDEFGHIJK(\n"
8507                "    [[maybe_unused]] const shared_ptr<ALongTypeName> &C d) {}",
8508                Style);
8509   verifyFormat("void ABCDEFGH::ABCDEFGH([[maybe_unused]] const "
8510                "shared_ptr<ALongTypeName> &C d) {\n}",
8511                Style);
8512 }
8513 
8514 TEST_F(FormatTest, UnderstandsEllipsis) {
8515   FormatStyle Style = getLLVMStyle();
8516   verifyFormat("int printf(const char *fmt, ...);");
8517   verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
8518   verifyFormat("template <class... Ts> void Foo(Ts *...ts) {}");
8519 
8520   verifyFormat("template <int *...PP> a;", Style);
8521 
8522   Style.PointerAlignment = FormatStyle::PAS_Left;
8523   verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", Style);
8524 
8525   verifyFormat("template <int*... PP> a;", Style);
8526 
8527   Style.PointerAlignment = FormatStyle::PAS_Middle;
8528   verifyFormat("template <int *... PP> a;", Style);
8529 }
8530 
8531 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
8532   EXPECT_EQ("int *a;\n"
8533             "int *a;\n"
8534             "int *a;",
8535             format("int *a;\n"
8536                    "int* a;\n"
8537                    "int *a;",
8538                    getGoogleStyle()));
8539   EXPECT_EQ("int* a;\n"
8540             "int* a;\n"
8541             "int* a;",
8542             format("int* a;\n"
8543                    "int* a;\n"
8544                    "int *a;",
8545                    getGoogleStyle()));
8546   EXPECT_EQ("int *a;\n"
8547             "int *a;\n"
8548             "int *a;",
8549             format("int *a;\n"
8550                    "int * a;\n"
8551                    "int *  a;",
8552                    getGoogleStyle()));
8553   EXPECT_EQ("auto x = [] {\n"
8554             "  int *a;\n"
8555             "  int *a;\n"
8556             "  int *a;\n"
8557             "};",
8558             format("auto x=[]{int *a;\n"
8559                    "int * a;\n"
8560                    "int *  a;};",
8561                    getGoogleStyle()));
8562 }
8563 
8564 TEST_F(FormatTest, UnderstandsRvalueReferences) {
8565   verifyFormat("int f(int &&a) {}");
8566   verifyFormat("int f(int a, char &&b) {}");
8567   verifyFormat("void f() { int &&a = b; }");
8568   verifyGoogleFormat("int f(int a, char&& b) {}");
8569   verifyGoogleFormat("void f() { int&& a = b; }");
8570 
8571   verifyIndependentOfContext("A<int &&> a;");
8572   verifyIndependentOfContext("A<int &&, int &&> a;");
8573   verifyGoogleFormat("A<int&&> a;");
8574   verifyGoogleFormat("A<int&&, int&&> a;");
8575 
8576   // Not rvalue references:
8577   verifyFormat("template <bool B, bool C> class A {\n"
8578                "  static_assert(B && C, \"Something is wrong\");\n"
8579                "};");
8580   verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
8581   verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
8582   verifyFormat("#define A(a, b) (a && b)");
8583 }
8584 
8585 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
8586   verifyFormat("void f() {\n"
8587                "  x[aaaaaaaaa -\n"
8588                "    b] = 23;\n"
8589                "}",
8590                getLLVMStyleWithColumns(15));
8591 }
8592 
8593 TEST_F(FormatTest, FormatsCasts) {
8594   verifyFormat("Type *A = static_cast<Type *>(P);");
8595   verifyFormat("Type *A = (Type *)P;");
8596   verifyFormat("Type *A = (vector<Type *, int *>)P;");
8597   verifyFormat("int a = (int)(2.0f);");
8598   verifyFormat("int a = (int)2.0f;");
8599   verifyFormat("x[(int32)y];");
8600   verifyFormat("x = (int32)y;");
8601   verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
8602   verifyFormat("int a = (int)*b;");
8603   verifyFormat("int a = (int)2.0f;");
8604   verifyFormat("int a = (int)~0;");
8605   verifyFormat("int a = (int)++a;");
8606   verifyFormat("int a = (int)sizeof(int);");
8607   verifyFormat("int a = (int)+2;");
8608   verifyFormat("my_int a = (my_int)2.0f;");
8609   verifyFormat("my_int a = (my_int)sizeof(int);");
8610   verifyFormat("return (my_int)aaa;");
8611   verifyFormat("#define x ((int)-1)");
8612   verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
8613   verifyFormat("#define p(q) ((int *)&q)");
8614   verifyFormat("fn(a)(b) + 1;");
8615 
8616   verifyFormat("void f() { my_int a = (my_int)*b; }");
8617   verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
8618   verifyFormat("my_int a = (my_int)~0;");
8619   verifyFormat("my_int a = (my_int)++a;");
8620   verifyFormat("my_int a = (my_int)-2;");
8621   verifyFormat("my_int a = (my_int)1;");
8622   verifyFormat("my_int a = (my_int *)1;");
8623   verifyFormat("my_int a = (const my_int)-1;");
8624   verifyFormat("my_int a = (const my_int *)-1;");
8625   verifyFormat("my_int a = (my_int)(my_int)-1;");
8626   verifyFormat("my_int a = (ns::my_int)-2;");
8627   verifyFormat("case (my_int)ONE:");
8628   verifyFormat("auto x = (X)this;");
8629   // Casts in Obj-C style calls used to not be recognized as such.
8630   verifyFormat("int a = [(type*)[((type*)val) arg] arg];", getGoogleStyle());
8631 
8632   // FIXME: single value wrapped with paren will be treated as cast.
8633   verifyFormat("void f(int i = (kValue)*kMask) {}");
8634 
8635   verifyFormat("{ (void)F; }");
8636 
8637   // Don't break after a cast's
8638   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
8639                "    (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
8640                "                                   bbbbbbbbbbbbbbbbbbbbbb);");
8641 
8642   // These are not casts.
8643   verifyFormat("void f(int *) {}");
8644   verifyFormat("f(foo)->b;");
8645   verifyFormat("f(foo).b;");
8646   verifyFormat("f(foo)(b);");
8647   verifyFormat("f(foo)[b];");
8648   verifyFormat("[](foo) { return 4; }(bar);");
8649   verifyFormat("(*funptr)(foo)[4];");
8650   verifyFormat("funptrs[4](foo)[4];");
8651   verifyFormat("void f(int *);");
8652   verifyFormat("void f(int *) = 0;");
8653   verifyFormat("void f(SmallVector<int>) {}");
8654   verifyFormat("void f(SmallVector<int>);");
8655   verifyFormat("void f(SmallVector<int>) = 0;");
8656   verifyFormat("void f(int i = (kA * kB) & kMask) {}");
8657   verifyFormat("int a = sizeof(int) * b;");
8658   verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
8659   verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
8660   verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
8661   verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
8662 
8663   // These are not casts, but at some point were confused with casts.
8664   verifyFormat("virtual void foo(int *) override;");
8665   verifyFormat("virtual void foo(char &) const;");
8666   verifyFormat("virtual void foo(int *a, char *) const;");
8667   verifyFormat("int a = sizeof(int *) + b;");
8668   verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
8669   verifyFormat("bool b = f(g<int>) && c;");
8670   verifyFormat("typedef void (*f)(int i) func;");
8671   verifyFormat("void operator++(int) noexcept;");
8672   verifyFormat("void operator++(int &) noexcept;");
8673   verifyFormat("void operator delete(void *, std::size_t, const std::nothrow_t "
8674                "&) noexcept;");
8675   verifyFormat(
8676       "void operator delete(std::size_t, const std::nothrow_t &) noexcept;");
8677   verifyFormat("void operator delete(const std::nothrow_t &) noexcept;");
8678   verifyFormat("void operator delete(std::nothrow_t &) noexcept;");
8679   verifyFormat("void operator delete(nothrow_t &) noexcept;");
8680   verifyFormat("void operator delete(foo &) noexcept;");
8681   verifyFormat("void operator delete(foo) noexcept;");
8682   verifyFormat("void operator delete(int) noexcept;");
8683   verifyFormat("void operator delete(int &) noexcept;");
8684   verifyFormat("void operator delete(int &) volatile noexcept;");
8685   verifyFormat("void operator delete(int &) const");
8686   verifyFormat("void operator delete(int &) = default");
8687   verifyFormat("void operator delete(int &) = delete");
8688   verifyFormat("void operator delete(int &) [[noreturn]]");
8689   verifyFormat("void operator delete(int &) throw();");
8690   verifyFormat("void operator delete(int &) throw(int);");
8691   verifyFormat("auto operator delete(int &) -> int;");
8692   verifyFormat("auto operator delete(int &) override");
8693   verifyFormat("auto operator delete(int &) final");
8694 
8695   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
8696                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
8697   // FIXME: The indentation here is not ideal.
8698   verifyFormat(
8699       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8700       "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
8701       "        [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
8702 }
8703 
8704 TEST_F(FormatTest, FormatsFunctionTypes) {
8705   verifyFormat("A<bool()> a;");
8706   verifyFormat("A<SomeType()> a;");
8707   verifyFormat("A<void (*)(int, std::string)> a;");
8708   verifyFormat("A<void *(int)>;");
8709   verifyFormat("void *(*a)(int *, SomeType *);");
8710   verifyFormat("int (*func)(void *);");
8711   verifyFormat("void f() { int (*func)(void *); }");
8712   verifyFormat("template <class CallbackClass>\n"
8713                "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
8714 
8715   verifyGoogleFormat("A<void*(int*, SomeType*)>;");
8716   verifyGoogleFormat("void* (*a)(int);");
8717   verifyGoogleFormat(
8718       "template <class CallbackClass>\n"
8719       "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
8720 
8721   // Other constructs can look somewhat like function types:
8722   verifyFormat("A<sizeof(*x)> a;");
8723   verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
8724   verifyFormat("some_var = function(*some_pointer_var)[0];");
8725   verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
8726   verifyFormat("int x = f(&h)();");
8727   verifyFormat("returnsFunction(&param1, &param2)(param);");
8728   verifyFormat("std::function<\n"
8729                "    LooooooooooongTemplatedType<\n"
8730                "        SomeType>*(\n"
8731                "        LooooooooooooooooongType type)>\n"
8732                "    function;",
8733                getGoogleStyleWithColumns(40));
8734 }
8735 
8736 TEST_F(FormatTest, FormatsPointersToArrayTypes) {
8737   verifyFormat("A (*foo_)[6];");
8738   verifyFormat("vector<int> (*foo_)[6];");
8739 }
8740 
8741 TEST_F(FormatTest, BreaksLongVariableDeclarations) {
8742   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
8743                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
8744   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
8745                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
8746   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
8747                "    *LoooooooooooooooooooooooooooooooooooooooongVariable;");
8748 
8749   // Different ways of ()-initializiation.
8750   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
8751                "    LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
8752   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
8753                "    LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
8754   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
8755                "    LoooooooooooooooooooooooooooooooooooooooongVariable({});");
8756   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
8757                "    LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
8758 
8759   // Lambdas should not confuse the variable declaration heuristic.
8760   verifyFormat("LooooooooooooooooongType\n"
8761                "    variable(nullptr, [](A *a) {});",
8762                getLLVMStyleWithColumns(40));
8763 }
8764 
8765 TEST_F(FormatTest, BreaksLongDeclarations) {
8766   verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
8767                "    AnotherNameForTheLongType;");
8768   verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
8769                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
8770   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
8771                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
8772   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
8773                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
8774   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
8775                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
8776   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
8777                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
8778   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
8779                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
8780   verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
8781                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
8782   verifyFormat("typeof(LoooooooooooooooooooooooooooooooooooooooooongName)\n"
8783                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
8784   verifyFormat("_Atomic(LooooooooooooooooooooooooooooooooooooooooongName)\n"
8785                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
8786   verifyFormat("__underlying_type(LooooooooooooooooooooooooooooooongName)\n"
8787                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
8788   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
8789                "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
8790   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
8791                "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
8792   FormatStyle Indented = getLLVMStyle();
8793   Indented.IndentWrappedFunctionNames = true;
8794   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
8795                "    LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
8796                Indented);
8797   verifyFormat(
8798       "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
8799       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
8800       Indented);
8801   verifyFormat(
8802       "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
8803       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
8804       Indented);
8805   verifyFormat(
8806       "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
8807       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
8808       Indented);
8809 
8810   // FIXME: Without the comment, this breaks after "(".
8811   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType  // break\n"
8812                "    (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
8813                getGoogleStyle());
8814 
8815   verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
8816                "                  int LoooooooooooooooooooongParam2) {}");
8817   verifyFormat(
8818       "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
8819       "                                   SourceLocation L, IdentifierIn *II,\n"
8820       "                                   Type *T) {}");
8821   verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
8822                "ReallyReaaallyLongFunctionName(\n"
8823                "    const std::string &SomeParameter,\n"
8824                "    const SomeType<string, SomeOtherTemplateParameter>\n"
8825                "        &ReallyReallyLongParameterName,\n"
8826                "    const SomeType<string, SomeOtherTemplateParameter>\n"
8827                "        &AnotherLongParameterName) {}");
8828   verifyFormat("template <typename A>\n"
8829                "SomeLoooooooooooooooooooooongType<\n"
8830                "    typename some_namespace::SomeOtherType<A>::Type>\n"
8831                "Function() {}");
8832 
8833   verifyGoogleFormat(
8834       "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
8835       "    aaaaaaaaaaaaaaaaaaaaaaa;");
8836   verifyGoogleFormat(
8837       "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
8838       "                                   SourceLocation L) {}");
8839   verifyGoogleFormat(
8840       "some_namespace::LongReturnType\n"
8841       "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
8842       "    int first_long_parameter, int second_parameter) {}");
8843 
8844   verifyGoogleFormat("template <typename T>\n"
8845                      "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
8846                      "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
8847   verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8848                      "                   int aaaaaaaaaaaaaaaaaaaaaaa);");
8849 
8850   verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
8851                "    const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8852                "        *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
8853   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
8854                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
8855                "        aaaaaaaaaaaaaaaaaaaaaaaa);");
8856   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
8857                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
8858                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
8859                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
8860 
8861   verifyFormat("template <typename T> // Templates on own line.\n"
8862                "static int            // Some comment.\n"
8863                "MyFunction(int a);",
8864                getLLVMStyle());
8865 }
8866 
8867 TEST_F(FormatTest, FormatsArrays) {
8868   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
8869                "                         [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
8870   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
8871                "                         [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
8872   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
8873                "    aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
8874   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8875                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
8876   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8877                "    [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
8878   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8879                "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
8880                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
8881   verifyFormat(
8882       "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
8883       "             << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
8884       "                                  [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
8885   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
8886                "    .aaaaaaaaaaaaaaaaaaaaaa();");
8887 
8888   verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
8889                      "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
8890   verifyFormat(
8891       "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
8892       "                                  .aaaaaaa[0]\n"
8893       "                                  .aaaaaaaaaaaaaaaaaaaaaa();");
8894   verifyFormat("a[::b::c];");
8895 
8896   verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
8897 
8898   FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
8899   verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
8900 }
8901 
8902 TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
8903   verifyFormat("(a)->b();");
8904   verifyFormat("--a;");
8905 }
8906 
8907 TEST_F(FormatTest, HandlesIncludeDirectives) {
8908   verifyFormat("#include <string>\n"
8909                "#include <a/b/c.h>\n"
8910                "#include \"a/b/string\"\n"
8911                "#include \"string.h\"\n"
8912                "#include \"string.h\"\n"
8913                "#include <a-a>\n"
8914                "#include < path with space >\n"
8915                "#include_next <test.h>"
8916                "#include \"abc.h\" // this is included for ABC\n"
8917                "#include \"some long include\" // with a comment\n"
8918                "#include \"some very long include path\"\n"
8919                "#include <some/very/long/include/path>\n",
8920                getLLVMStyleWithColumns(35));
8921   EXPECT_EQ("#include \"a.h\"", format("#include  \"a.h\""));
8922   EXPECT_EQ("#include <a>", format("#include<a>"));
8923 
8924   verifyFormat("#import <string>");
8925   verifyFormat("#import <a/b/c.h>");
8926   verifyFormat("#import \"a/b/string\"");
8927   verifyFormat("#import \"string.h\"");
8928   verifyFormat("#import \"string.h\"");
8929   verifyFormat("#if __has_include(<strstream>)\n"
8930                "#include <strstream>\n"
8931                "#endif");
8932 
8933   verifyFormat("#define MY_IMPORT <a/b>");
8934 
8935   verifyFormat("#if __has_include(<a/b>)");
8936   verifyFormat("#if __has_include_next(<a/b>)");
8937   verifyFormat("#define F __has_include(<a/b>)");
8938   verifyFormat("#define F __has_include_next(<a/b>)");
8939 
8940   // Protocol buffer definition or missing "#".
8941   verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
8942                getLLVMStyleWithColumns(30));
8943 
8944   FormatStyle Style = getLLVMStyle();
8945   Style.AlwaysBreakBeforeMultilineStrings = true;
8946   Style.ColumnLimit = 0;
8947   verifyFormat("#import \"abc.h\"", Style);
8948 
8949   // But 'import' might also be a regular C++ namespace.
8950   verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8951                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
8952 }
8953 
8954 //===----------------------------------------------------------------------===//
8955 // Error recovery tests.
8956 //===----------------------------------------------------------------------===//
8957 
8958 TEST_F(FormatTest, IncompleteParameterLists) {
8959   FormatStyle NoBinPacking = getLLVMStyle();
8960   NoBinPacking.BinPackParameters = false;
8961   verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
8962                "                        double *min_x,\n"
8963                "                        double *max_x,\n"
8964                "                        double *min_y,\n"
8965                "                        double *max_y,\n"
8966                "                        double *min_z,\n"
8967                "                        double *max_z, ) {}",
8968                NoBinPacking);
8969 }
8970 
8971 TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
8972   verifyFormat("void f() { return; }\n42");
8973   verifyFormat("void f() {\n"
8974                "  if (0)\n"
8975                "    return;\n"
8976                "}\n"
8977                "42");
8978   verifyFormat("void f() { return }\n42");
8979   verifyFormat("void f() {\n"
8980                "  if (0)\n"
8981                "    return\n"
8982                "}\n"
8983                "42");
8984 }
8985 
8986 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
8987   EXPECT_EQ("void f() { return }", format("void  f ( )  {  return  }"));
8988   EXPECT_EQ("void f() {\n"
8989             "  if (a)\n"
8990             "    return\n"
8991             "}",
8992             format("void  f  (  )  {  if  ( a )  return  }"));
8993   EXPECT_EQ("namespace N {\n"
8994             "void f()\n"
8995             "}",
8996             format("namespace  N  {  void f()  }"));
8997   EXPECT_EQ("namespace N {\n"
8998             "void f() {}\n"
8999             "void g()\n"
9000             "} // namespace N",
9001             format("namespace N  { void f( ) { } void g( ) }"));
9002 }
9003 
9004 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
9005   verifyFormat("int aaaaaaaa =\n"
9006                "    // Overlylongcomment\n"
9007                "    b;",
9008                getLLVMStyleWithColumns(20));
9009   verifyFormat("function(\n"
9010                "    ShortArgument,\n"
9011                "    LoooooooooooongArgument);\n",
9012                getLLVMStyleWithColumns(20));
9013 }
9014 
9015 TEST_F(FormatTest, IncorrectAccessSpecifier) {
9016   verifyFormat("public:");
9017   verifyFormat("class A {\n"
9018                "public\n"
9019                "  void f() {}\n"
9020                "};");
9021   verifyFormat("public\n"
9022                "int qwerty;");
9023   verifyFormat("public\n"
9024                "B {}");
9025   verifyFormat("public\n"
9026                "{}");
9027   verifyFormat("public\n"
9028                "B { int x; }");
9029 }
9030 
9031 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
9032   verifyFormat("{");
9033   verifyFormat("#})");
9034   verifyNoCrash("(/**/[:!] ?[).");
9035 }
9036 
9037 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) {
9038   // Found by oss-fuzz:
9039   // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212
9040   FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
9041   Style.ColumnLimit = 60;
9042   verifyNoCrash(
9043       "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20"
9044       "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20"
9045       "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a",
9046       Style);
9047 }
9048 
9049 TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
9050   verifyFormat("do {\n}");
9051   verifyFormat("do {\n}\n"
9052                "f();");
9053   verifyFormat("do {\n}\n"
9054                "wheeee(fun);");
9055   verifyFormat("do {\n"
9056                "  f();\n"
9057                "}");
9058 }
9059 
9060 TEST_F(FormatTest, IncorrectCodeMissingParens) {
9061   verifyFormat("if {\n  foo;\n  foo();\n}");
9062   verifyFormat("switch {\n  foo;\n  foo();\n}");
9063   verifyIncompleteFormat("for {\n  foo;\n  foo();\n}");
9064   verifyFormat("while {\n  foo;\n  foo();\n}");
9065   verifyFormat("do {\n  foo;\n  foo();\n} while;");
9066 }
9067 
9068 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
9069   verifyIncompleteFormat("namespace {\n"
9070                          "class Foo { Foo (\n"
9071                          "};\n"
9072                          "} // namespace");
9073 }
9074 
9075 TEST_F(FormatTest, IncorrectCodeErrorDetection) {
9076   EXPECT_EQ("{\n  {}\n", format("{\n{\n}\n"));
9077   EXPECT_EQ("{\n  {}\n", format("{\n  {\n}\n"));
9078   EXPECT_EQ("{\n  {}\n", format("{\n  {\n  }\n"));
9079   EXPECT_EQ("{\n  {}\n}\n}\n", format("{\n  {\n    }\n  }\n}\n"));
9080 
9081   EXPECT_EQ("{\n"
9082             "  {\n"
9083             "    breakme(\n"
9084             "        qwe);\n"
9085             "  }\n",
9086             format("{\n"
9087                    "    {\n"
9088                    " breakme(qwe);\n"
9089                    "}\n",
9090                    getLLVMStyleWithColumns(10)));
9091 }
9092 
9093 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
9094   verifyFormat("int x = {\n"
9095                "    avariable,\n"
9096                "    b(alongervariable)};",
9097                getLLVMStyleWithColumns(25));
9098 }
9099 
9100 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
9101   verifyFormat("return (a)(b){1, 2, 3};");
9102 }
9103 
9104 TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
9105   verifyFormat("vector<int> x{1, 2, 3, 4};");
9106   verifyFormat("vector<int> x{\n"
9107                "    1,\n"
9108                "    2,\n"
9109                "    3,\n"
9110                "    4,\n"
9111                "};");
9112   verifyFormat("vector<T> x{{}, {}, {}, {}};");
9113   verifyFormat("f({1, 2});");
9114   verifyFormat("auto v = Foo{-1};");
9115   verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
9116   verifyFormat("Class::Class : member{1, 2, 3} {}");
9117   verifyFormat("new vector<int>{1, 2, 3};");
9118   verifyFormat("new int[3]{1, 2, 3};");
9119   verifyFormat("new int{1};");
9120   verifyFormat("return {arg1, arg2};");
9121   verifyFormat("return {arg1, SomeType{parameter}};");
9122   verifyFormat("int count = set<int>{f(), g(), h()}.size();");
9123   verifyFormat("new T{arg1, arg2};");
9124   verifyFormat("f(MyMap[{composite, key}]);");
9125   verifyFormat("class Class {\n"
9126                "  T member = {arg1, arg2};\n"
9127                "};");
9128   verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
9129   verifyFormat("const struct A a = {.a = 1, .b = 2};");
9130   verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
9131   verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
9132   verifyFormat("int a = std::is_integral<int>{} + 0;");
9133 
9134   verifyFormat("int foo(int i) { return fo1{}(i); }");
9135   verifyFormat("int foo(int i) { return fo1{}(i); }");
9136   verifyFormat("auto i = decltype(x){};");
9137   verifyFormat("auto i = typeof(x){};");
9138   verifyFormat("auto i = _Atomic(x){};");
9139   verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
9140   verifyFormat("Node n{1, Node{1000}, //\n"
9141                "       2};");
9142   verifyFormat("Aaaa aaaaaaa{\n"
9143                "    {\n"
9144                "        aaaa,\n"
9145                "    },\n"
9146                "};");
9147   verifyFormat("class C : public D {\n"
9148                "  SomeClass SC{2};\n"
9149                "};");
9150   verifyFormat("class C : public A {\n"
9151                "  class D : public B {\n"
9152                "    void f() { int i{2}; }\n"
9153                "  };\n"
9154                "};");
9155   verifyFormat("#define A {a, a},");
9156 
9157   // Avoid breaking between equal sign and opening brace
9158   FormatStyle AvoidBreakingFirstArgument = getLLVMStyle();
9159   AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200;
9160   verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n"
9161                "    {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n"
9162                "     {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n"
9163                "     {\"ccccccccccccccccccccc\", 2}};",
9164                AvoidBreakingFirstArgument);
9165 
9166   // Binpacking only if there is no trailing comma
9167   verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
9168                "                      cccccccccc, dddddddddd};",
9169                getLLVMStyleWithColumns(50));
9170   verifyFormat("const Aaaaaa aaaaa = {\n"
9171                "    aaaaaaaaaaa,\n"
9172                "    bbbbbbbbbbb,\n"
9173                "    ccccccccccc,\n"
9174                "    ddddddddddd,\n"
9175                "};",
9176                getLLVMStyleWithColumns(50));
9177 
9178   // Cases where distinguising braced lists and blocks is hard.
9179   verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
9180   verifyFormat("void f() {\n"
9181                "  return; // comment\n"
9182                "}\n"
9183                "SomeType t;");
9184   verifyFormat("void f() {\n"
9185                "  if (a) {\n"
9186                "    f();\n"
9187                "  }\n"
9188                "}\n"
9189                "SomeType t;");
9190 
9191   // In combination with BinPackArguments = false.
9192   FormatStyle NoBinPacking = getLLVMStyle();
9193   NoBinPacking.BinPackArguments = false;
9194   verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
9195                "                      bbbbb,\n"
9196                "                      ccccc,\n"
9197                "                      ddddd,\n"
9198                "                      eeeee,\n"
9199                "                      ffffff,\n"
9200                "                      ggggg,\n"
9201                "                      hhhhhh,\n"
9202                "                      iiiiii,\n"
9203                "                      jjjjjj,\n"
9204                "                      kkkkkk};",
9205                NoBinPacking);
9206   verifyFormat("const Aaaaaa aaaaa = {\n"
9207                "    aaaaa,\n"
9208                "    bbbbb,\n"
9209                "    ccccc,\n"
9210                "    ddddd,\n"
9211                "    eeeee,\n"
9212                "    ffffff,\n"
9213                "    ggggg,\n"
9214                "    hhhhhh,\n"
9215                "    iiiiii,\n"
9216                "    jjjjjj,\n"
9217                "    kkkkkk,\n"
9218                "};",
9219                NoBinPacking);
9220   verifyFormat(
9221       "const Aaaaaa aaaaa = {\n"
9222       "    aaaaa,  bbbbb,  ccccc,  ddddd,  eeeee,  ffffff, ggggg, hhhhhh,\n"
9223       "    iiiiii, jjjjjj, kkkkkk, aaaaa,  bbbbb,  ccccc,  ddddd, eeeee,\n"
9224       "    ffffff, ggggg,  hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
9225       "};",
9226       NoBinPacking);
9227 
9228   NoBinPacking.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
9229   EXPECT_EQ("static uint8 CddDp83848Reg[] = {\n"
9230             "    CDDDP83848_BMCR_REGISTER,\n"
9231             "    CDDDP83848_BMSR_REGISTER,\n"
9232             "    CDDDP83848_RBR_REGISTER};",
9233             format("static uint8 CddDp83848Reg[] = {CDDDP83848_BMCR_REGISTER,\n"
9234                    "                                CDDDP83848_BMSR_REGISTER,\n"
9235                    "                                CDDDP83848_RBR_REGISTER};",
9236                    NoBinPacking));
9237 
9238   // FIXME: The alignment of these trailing comments might be bad. Then again,
9239   // this might be utterly useless in real code.
9240   verifyFormat("Constructor::Constructor()\n"
9241                "    : some_value{         //\n"
9242                "                 aaaaaaa, //\n"
9243                "                 bbbbbbb} {}");
9244 
9245   // In braced lists, the first comment is always assumed to belong to the
9246   // first element. Thus, it can be moved to the next or previous line as
9247   // appropriate.
9248   EXPECT_EQ("function({// First element:\n"
9249             "          1,\n"
9250             "          // Second element:\n"
9251             "          2});",
9252             format("function({\n"
9253                    "    // First element:\n"
9254                    "    1,\n"
9255                    "    // Second element:\n"
9256                    "    2});"));
9257   EXPECT_EQ("std::vector<int> MyNumbers{\n"
9258             "    // First element:\n"
9259             "    1,\n"
9260             "    // Second element:\n"
9261             "    2};",
9262             format("std::vector<int> MyNumbers{// First element:\n"
9263                    "                           1,\n"
9264                    "                           // Second element:\n"
9265                    "                           2};",
9266                    getLLVMStyleWithColumns(30)));
9267   // A trailing comma should still lead to an enforced line break and no
9268   // binpacking.
9269   EXPECT_EQ("vector<int> SomeVector = {\n"
9270             "    // aaa\n"
9271             "    1,\n"
9272             "    2,\n"
9273             "};",
9274             format("vector<int> SomeVector = { // aaa\n"
9275                    "    1, 2, };"));
9276 
9277   // C++11 brace initializer list l-braces should not be treated any differently
9278   // when breaking before lambda bodies is enabled
9279   FormatStyle BreakBeforeLambdaBody = getLLVMStyle();
9280   BreakBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom;
9281   BreakBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true;
9282   BreakBeforeLambdaBody.AlwaysBreakBeforeMultilineStrings = true;
9283   verifyFormat(
9284       "std::runtime_error{\n"
9285       "    \"Long string which will force a break onto the next line...\"};",
9286       BreakBeforeLambdaBody);
9287 
9288   FormatStyle ExtraSpaces = getLLVMStyle();
9289   ExtraSpaces.Cpp11BracedListStyle = false;
9290   ExtraSpaces.ColumnLimit = 75;
9291   verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
9292   verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
9293   verifyFormat("f({ 1, 2 });", ExtraSpaces);
9294   verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
9295   verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
9296   verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
9297   verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
9298   verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
9299   verifyFormat("return { arg1, arg2 };", ExtraSpaces);
9300   verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
9301   verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
9302   verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
9303   verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
9304   verifyFormat("class Class {\n"
9305                "  T member = { arg1, arg2 };\n"
9306                "};",
9307                ExtraSpaces);
9308   verifyFormat(
9309       "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
9310       "                                 aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
9311       "                  : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
9312       "                                 bbbbbbbbbbbbbbbbbbbb, bbbbb };",
9313       ExtraSpaces);
9314   verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
9315   verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
9316                ExtraSpaces);
9317   verifyFormat(
9318       "someFunction(OtherParam,\n"
9319       "             BracedList{ // comment 1 (Forcing interesting break)\n"
9320       "                         param1, param2,\n"
9321       "                         // comment 2\n"
9322       "                         param3, param4 });",
9323       ExtraSpaces);
9324   verifyFormat(
9325       "std::this_thread::sleep_for(\n"
9326       "    std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
9327       ExtraSpaces);
9328   verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
9329                "    aaaaaaa,\n"
9330                "    aaaaaaaaaa,\n"
9331                "    aaaaa,\n"
9332                "    aaaaaaaaaaaaaaa,\n"
9333                "    aaa,\n"
9334                "    aaaaaaaaaa,\n"
9335                "    a,\n"
9336                "    aaaaaaaaaaaaaaaaaaaaa,\n"
9337                "    aaaaaaaaaaaa,\n"
9338                "    aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
9339                "    aaaaaaa,\n"
9340                "    a};");
9341   verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
9342   verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
9343   verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
9344 
9345   // Avoid breaking between initializer/equal sign and opening brace
9346   ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200;
9347   verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n"
9348                "  { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
9349                "  { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
9350                "  { \"ccccccccccccccccccccc\", 2 }\n"
9351                "};",
9352                ExtraSpaces);
9353   verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n"
9354                "  { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
9355                "  { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
9356                "  { \"ccccccccccccccccccccc\", 2 }\n"
9357                "};",
9358                ExtraSpaces);
9359 
9360   FormatStyle SpaceBeforeBrace = getLLVMStyle();
9361   SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true;
9362   verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace);
9363   verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace);
9364 
9365   FormatStyle SpaceBetweenBraces = getLLVMStyle();
9366   SpaceBetweenBraces.SpacesInAngles = true;
9367   SpaceBetweenBraces.SpacesInParentheses = true;
9368   SpaceBetweenBraces.SpacesInSquareBrackets = true;
9369   verifyFormat("vector< int > x{ 1, 2, 3, 4 };", SpaceBetweenBraces);
9370   verifyFormat("f( {}, { {}, {} }, MyMap[ { k, v } ] );", SpaceBetweenBraces);
9371   verifyFormat("vector< int > x{ // comment 1\n"
9372                "                 1, 2, 3, 4 };",
9373                SpaceBetweenBraces);
9374   SpaceBetweenBraces.ColumnLimit = 20;
9375   EXPECT_EQ("vector< int > x{\n"
9376             "    1, 2, 3, 4 };",
9377             format("vector<int>x{1,2,3,4};", SpaceBetweenBraces));
9378   SpaceBetweenBraces.ColumnLimit = 24;
9379   EXPECT_EQ("vector< int > x{ 1, 2,\n"
9380             "                 3, 4 };",
9381             format("vector<int>x{1,2,3,4};", SpaceBetweenBraces));
9382   EXPECT_EQ("vector< int > x{\n"
9383             "    1,\n"
9384             "    2,\n"
9385             "    3,\n"
9386             "    4,\n"
9387             "};",
9388             format("vector<int>x{1,2,3,4,};", SpaceBetweenBraces));
9389   verifyFormat("vector< int > x{};", SpaceBetweenBraces);
9390   SpaceBetweenBraces.SpaceInEmptyParentheses = true;
9391   verifyFormat("vector< int > x{ };", SpaceBetweenBraces);
9392 }
9393 
9394 TEST_F(FormatTest, FormatSpacesInAngles) {
9395   FormatStyle SpaceInAngles = getLLVMStyle();
9396   SpaceInAngles.SpacesInAngles = true;
9397   verifyFormat("vector< ::std::string > x1;", SpaceInAngles);
9398   verifyFormat("Foo< int, Bar > x2;", SpaceInAngles);
9399   verifyFormat("Foo< ::int, ::Bar > x3;", SpaceInAngles);
9400 
9401   SpaceInAngles.SpacesInAngles = false;
9402   verifyFormat("vector<::std::string> x4;", SpaceInAngles);
9403   verifyFormat("vector<int> x5;", SpaceInAngles);
9404   verifyFormat("Foo<int, Bar> x6;", SpaceInAngles);
9405   verifyFormat("Foo<::int, ::Bar> x7;", SpaceInAngles);
9406 }
9407 
9408 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
9409   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9410                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9411                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9412                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9413                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9414                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
9415   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
9416                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9417                "                 1, 22, 333, 4444, 55555, //\n"
9418                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9419                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
9420   verifyFormat(
9421       "vector<int> x = {1,       22, 333, 4444, 55555, 666666, 7777777,\n"
9422       "                 1,       22, 333, 4444, 55555, 666666, 7777777,\n"
9423       "                 1,       22, 333, 4444, 55555, 666666, // comment\n"
9424       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
9425       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
9426       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
9427       "                 7777777};");
9428   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
9429                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
9430                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
9431   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
9432                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
9433                "    // Separating comment.\n"
9434                "    X86::R8, X86::R9, X86::R10, X86::R11, 0};");
9435   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
9436                "    // Leading comment\n"
9437                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
9438                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
9439   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
9440                "                 1, 1, 1, 1};",
9441                getLLVMStyleWithColumns(39));
9442   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
9443                "                 1, 1, 1, 1};",
9444                getLLVMStyleWithColumns(38));
9445   verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
9446                "    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
9447                getLLVMStyleWithColumns(43));
9448   verifyFormat(
9449       "static unsigned SomeValues[10][3] = {\n"
9450       "    {1, 4, 0},  {4, 9, 0},  {4, 5, 9},  {8, 5, 4}, {1, 8, 4},\n"
9451       "    {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
9452   verifyFormat("static auto fields = new vector<string>{\n"
9453                "    \"aaaaaaaaaaaaa\",\n"
9454                "    \"aaaaaaaaaaaaa\",\n"
9455                "    \"aaaaaaaaaaaa\",\n"
9456                "    \"aaaaaaaaaaaaaa\",\n"
9457                "    \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
9458                "    \"aaaaaaaaaaaa\",\n"
9459                "    \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
9460                "};");
9461   verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
9462   verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
9463                "                 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
9464                "                 3, cccccccccccccccccccccc};",
9465                getLLVMStyleWithColumns(60));
9466 
9467   // Trailing commas.
9468   verifyFormat("vector<int> x = {\n"
9469                "    1, 1, 1, 1, 1, 1, 1, 1,\n"
9470                "};",
9471                getLLVMStyleWithColumns(39));
9472   verifyFormat("vector<int> x = {\n"
9473                "    1, 1, 1, 1, 1, 1, 1, 1, //\n"
9474                "};",
9475                getLLVMStyleWithColumns(39));
9476   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
9477                "                 1, 1, 1, 1,\n"
9478                "                 /**/ /**/};",
9479                getLLVMStyleWithColumns(39));
9480 
9481   // Trailing comment in the first line.
9482   verifyFormat("vector<int> iiiiiiiiiiiiiii = {                      //\n"
9483                "    1111111111, 2222222222, 33333333333, 4444444444, //\n"
9484                "    111111111,  222222222,  3333333333,  444444444,  //\n"
9485                "    11111111,   22222222,   333333333,   44444444};");
9486   // Trailing comment in the last line.
9487   verifyFormat("int aaaaa[] = {\n"
9488                "    1, 2, 3, // comment\n"
9489                "    4, 5, 6  // comment\n"
9490                "};");
9491 
9492   // With nested lists, we should either format one item per line or all nested
9493   // lists one on line.
9494   // FIXME: For some nested lists, we can do better.
9495   verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
9496                "        {aaaaaaaaaaaaaaaaaaa},\n"
9497                "        {aaaaaaaaaaaaaaaaaaaaa},\n"
9498                "        {aaaaaaaaaaaaaaaaa}};",
9499                getLLVMStyleWithColumns(60));
9500   verifyFormat(
9501       "SomeStruct my_struct_array = {\n"
9502       "    {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
9503       "     aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
9504       "    {aaa, aaa},\n"
9505       "    {aaa, aaa},\n"
9506       "    {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
9507       "    {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
9508       "     aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
9509 
9510   // No column layout should be used here.
9511   verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
9512                "                   bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
9513 
9514   verifyNoCrash("a<,");
9515 
9516   // No braced initializer here.
9517   verifyFormat("void f() {\n"
9518                "  struct Dummy {};\n"
9519                "  f(v);\n"
9520                "}");
9521 
9522   // Long lists should be formatted in columns even if they are nested.
9523   verifyFormat(
9524       "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9525       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9526       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9527       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9528       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9529       "                          1, 22, 333, 4444, 55555, 666666, 7777777});");
9530 
9531   // Allow "single-column" layout even if that violates the column limit. There
9532   // isn't going to be a better way.
9533   verifyFormat("std::vector<int> a = {\n"
9534                "    aaaaaaaa,\n"
9535                "    aaaaaaaa,\n"
9536                "    aaaaaaaa,\n"
9537                "    aaaaaaaa,\n"
9538                "    aaaaaaaaaa,\n"
9539                "    aaaaaaaa,\n"
9540                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
9541                getLLVMStyleWithColumns(30));
9542   verifyFormat("vector<int> aaaa = {\n"
9543                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
9544                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
9545                "    aaaaaa.aaaaaaa,\n"
9546                "    aaaaaa.aaaaaaa,\n"
9547                "    aaaaaa.aaaaaaa,\n"
9548                "    aaaaaa.aaaaaaa,\n"
9549                "};");
9550 
9551   // Don't create hanging lists.
9552   verifyFormat("someFunction(Param, {List1, List2,\n"
9553                "                     List3});",
9554                getLLVMStyleWithColumns(35));
9555   verifyFormat("someFunction(Param, Param,\n"
9556                "             {List1, List2,\n"
9557                "              List3});",
9558                getLLVMStyleWithColumns(35));
9559   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
9560                "                               aaaaaaaaaaaaaaaaaaaaaaa);");
9561 }
9562 
9563 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
9564   FormatStyle DoNotMerge = getLLVMStyle();
9565   DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
9566 
9567   verifyFormat("void f() { return 42; }");
9568   verifyFormat("void f() {\n"
9569                "  return 42;\n"
9570                "}",
9571                DoNotMerge);
9572   verifyFormat("void f() {\n"
9573                "  // Comment\n"
9574                "}");
9575   verifyFormat("{\n"
9576                "#error {\n"
9577                "  int a;\n"
9578                "}");
9579   verifyFormat("{\n"
9580                "  int a;\n"
9581                "#error {\n"
9582                "}");
9583   verifyFormat("void f() {} // comment");
9584   verifyFormat("void f() { int a; } // comment");
9585   verifyFormat("void f() {\n"
9586                "} // comment",
9587                DoNotMerge);
9588   verifyFormat("void f() {\n"
9589                "  int a;\n"
9590                "} // comment",
9591                DoNotMerge);
9592   verifyFormat("void f() {\n"
9593                "} // comment",
9594                getLLVMStyleWithColumns(15));
9595 
9596   verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
9597   verifyFormat("void f() {\n  return 42;\n}", getLLVMStyleWithColumns(22));
9598 
9599   verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
9600   verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
9601   verifyFormat("class C {\n"
9602                "  C()\n"
9603                "      : iiiiiiii(nullptr),\n"
9604                "        kkkkkkk(nullptr),\n"
9605                "        mmmmmmm(nullptr),\n"
9606                "        nnnnnnn(nullptr) {}\n"
9607                "};",
9608                getGoogleStyle());
9609 
9610   FormatStyle NoColumnLimit = getLLVMStyle();
9611   NoColumnLimit.ColumnLimit = 0;
9612   EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
9613   EXPECT_EQ("class C {\n"
9614             "  A() : b(0) {}\n"
9615             "};",
9616             format("class C{A():b(0){}};", NoColumnLimit));
9617   EXPECT_EQ("A()\n"
9618             "    : b(0) {\n"
9619             "}",
9620             format("A()\n:b(0)\n{\n}", NoColumnLimit));
9621 
9622   FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
9623   DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
9624       FormatStyle::SFS_None;
9625   EXPECT_EQ("A()\n"
9626             "    : b(0) {\n"
9627             "}",
9628             format("A():b(0){}", DoNotMergeNoColumnLimit));
9629   EXPECT_EQ("A()\n"
9630             "    : b(0) {\n"
9631             "}",
9632             format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
9633 
9634   verifyFormat("#define A          \\\n"
9635                "  void f() {       \\\n"
9636                "    int i;         \\\n"
9637                "  }",
9638                getLLVMStyleWithColumns(20));
9639   verifyFormat("#define A           \\\n"
9640                "  void f() { int i; }",
9641                getLLVMStyleWithColumns(21));
9642   verifyFormat("#define A            \\\n"
9643                "  void f() {         \\\n"
9644                "    int i;           \\\n"
9645                "  }                  \\\n"
9646                "  int j;",
9647                getLLVMStyleWithColumns(22));
9648   verifyFormat("#define A             \\\n"
9649                "  void f() { int i; } \\\n"
9650                "  int j;",
9651                getLLVMStyleWithColumns(23));
9652 }
9653 
9654 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
9655   FormatStyle MergeEmptyOnly = getLLVMStyle();
9656   MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
9657   verifyFormat("class C {\n"
9658                "  int f() {}\n"
9659                "};",
9660                MergeEmptyOnly);
9661   verifyFormat("class C {\n"
9662                "  int f() {\n"
9663                "    return 42;\n"
9664                "  }\n"
9665                "};",
9666                MergeEmptyOnly);
9667   verifyFormat("int f() {}", MergeEmptyOnly);
9668   verifyFormat("int f() {\n"
9669                "  return 42;\n"
9670                "}",
9671                MergeEmptyOnly);
9672 
9673   // Also verify behavior when BraceWrapping.AfterFunction = true
9674   MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
9675   MergeEmptyOnly.BraceWrapping.AfterFunction = true;
9676   verifyFormat("int f() {}", MergeEmptyOnly);
9677   verifyFormat("class C {\n"
9678                "  int f() {}\n"
9679                "};",
9680                MergeEmptyOnly);
9681 }
9682 
9683 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
9684   FormatStyle MergeInlineOnly = getLLVMStyle();
9685   MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
9686   verifyFormat("class C {\n"
9687                "  int f() { return 42; }\n"
9688                "};",
9689                MergeInlineOnly);
9690   verifyFormat("int f() {\n"
9691                "  return 42;\n"
9692                "}",
9693                MergeInlineOnly);
9694 
9695   // SFS_Inline implies SFS_Empty
9696   verifyFormat("class C {\n"
9697                "  int f() {}\n"
9698                "};",
9699                MergeInlineOnly);
9700   verifyFormat("int f() {}", MergeInlineOnly);
9701 
9702   // Also verify behavior when BraceWrapping.AfterFunction = true
9703   MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
9704   MergeInlineOnly.BraceWrapping.AfterFunction = true;
9705   verifyFormat("class C {\n"
9706                "  int f() { return 42; }\n"
9707                "};",
9708                MergeInlineOnly);
9709   verifyFormat("int f()\n"
9710                "{\n"
9711                "  return 42;\n"
9712                "}",
9713                MergeInlineOnly);
9714 
9715   // SFS_Inline implies SFS_Empty
9716   verifyFormat("int f() {}", MergeInlineOnly);
9717   verifyFormat("class C {\n"
9718                "  int f() {}\n"
9719                "};",
9720                MergeInlineOnly);
9721 }
9722 
9723 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
9724   FormatStyle MergeInlineOnly = getLLVMStyle();
9725   MergeInlineOnly.AllowShortFunctionsOnASingleLine =
9726       FormatStyle::SFS_InlineOnly;
9727   verifyFormat("class C {\n"
9728                "  int f() { return 42; }\n"
9729                "};",
9730                MergeInlineOnly);
9731   verifyFormat("int f() {\n"
9732                "  return 42;\n"
9733                "}",
9734                MergeInlineOnly);
9735 
9736   // SFS_InlineOnly does not imply SFS_Empty
9737   verifyFormat("class C {\n"
9738                "  int f() {}\n"
9739                "};",
9740                MergeInlineOnly);
9741   verifyFormat("int f() {\n"
9742                "}",
9743                MergeInlineOnly);
9744 
9745   // Also verify behavior when BraceWrapping.AfterFunction = true
9746   MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
9747   MergeInlineOnly.BraceWrapping.AfterFunction = true;
9748   verifyFormat("class C {\n"
9749                "  int f() { return 42; }\n"
9750                "};",
9751                MergeInlineOnly);
9752   verifyFormat("int f()\n"
9753                "{\n"
9754                "  return 42;\n"
9755                "}",
9756                MergeInlineOnly);
9757 
9758   // SFS_InlineOnly does not imply SFS_Empty
9759   verifyFormat("int f()\n"
9760                "{\n"
9761                "}",
9762                MergeInlineOnly);
9763   verifyFormat("class C {\n"
9764                "  int f() {}\n"
9765                "};",
9766                MergeInlineOnly);
9767 }
9768 
9769 TEST_F(FormatTest, SplitEmptyFunction) {
9770   FormatStyle Style = getLLVMStyle();
9771   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
9772   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9773   Style.BraceWrapping.AfterFunction = true;
9774   Style.BraceWrapping.SplitEmptyFunction = false;
9775   Style.ColumnLimit = 40;
9776 
9777   verifyFormat("int f()\n"
9778                "{}",
9779                Style);
9780   verifyFormat("int f()\n"
9781                "{\n"
9782                "  return 42;\n"
9783                "}",
9784                Style);
9785   verifyFormat("int f()\n"
9786                "{\n"
9787                "  // some comment\n"
9788                "}",
9789                Style);
9790 
9791   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
9792   verifyFormat("int f() {}", Style);
9793   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
9794                "{}",
9795                Style);
9796   verifyFormat("int f()\n"
9797                "{\n"
9798                "  return 0;\n"
9799                "}",
9800                Style);
9801 
9802   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
9803   verifyFormat("class Foo {\n"
9804                "  int f() {}\n"
9805                "};\n",
9806                Style);
9807   verifyFormat("class Foo {\n"
9808                "  int f() { return 0; }\n"
9809                "};\n",
9810                Style);
9811   verifyFormat("class Foo {\n"
9812                "  int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
9813                "  {}\n"
9814                "};\n",
9815                Style);
9816   verifyFormat("class Foo {\n"
9817                "  int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
9818                "  {\n"
9819                "    return 0;\n"
9820                "  }\n"
9821                "};\n",
9822                Style);
9823 
9824   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
9825   verifyFormat("int f() {}", Style);
9826   verifyFormat("int f() { return 0; }", Style);
9827   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
9828                "{}",
9829                Style);
9830   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
9831                "{\n"
9832                "  return 0;\n"
9833                "}",
9834                Style);
9835 }
9836 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
9837   FormatStyle Style = getLLVMStyle();
9838   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
9839   verifyFormat("#ifdef A\n"
9840                "int f() {}\n"
9841                "#else\n"
9842                "int g() {}\n"
9843                "#endif",
9844                Style);
9845 }
9846 
9847 TEST_F(FormatTest, SplitEmptyClass) {
9848   FormatStyle Style = getLLVMStyle();
9849   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9850   Style.BraceWrapping.AfterClass = true;
9851   Style.BraceWrapping.SplitEmptyRecord = false;
9852 
9853   verifyFormat("class Foo\n"
9854                "{};",
9855                Style);
9856   verifyFormat("/* something */ class Foo\n"
9857                "{};",
9858                Style);
9859   verifyFormat("template <typename X> class Foo\n"
9860                "{};",
9861                Style);
9862   verifyFormat("class Foo\n"
9863                "{\n"
9864                "  Foo();\n"
9865                "};",
9866                Style);
9867   verifyFormat("typedef class Foo\n"
9868                "{\n"
9869                "} Foo_t;",
9870                Style);
9871 }
9872 
9873 TEST_F(FormatTest, SplitEmptyStruct) {
9874   FormatStyle Style = getLLVMStyle();
9875   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9876   Style.BraceWrapping.AfterStruct = true;
9877   Style.BraceWrapping.SplitEmptyRecord = false;
9878 
9879   verifyFormat("struct Foo\n"
9880                "{};",
9881                Style);
9882   verifyFormat("/* something */ struct Foo\n"
9883                "{};",
9884                Style);
9885   verifyFormat("template <typename X> struct Foo\n"
9886                "{};",
9887                Style);
9888   verifyFormat("struct Foo\n"
9889                "{\n"
9890                "  Foo();\n"
9891                "};",
9892                Style);
9893   verifyFormat("typedef struct Foo\n"
9894                "{\n"
9895                "} Foo_t;",
9896                Style);
9897   // typedef struct Bar {} Bar_t;
9898 }
9899 
9900 TEST_F(FormatTest, SplitEmptyUnion) {
9901   FormatStyle Style = getLLVMStyle();
9902   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9903   Style.BraceWrapping.AfterUnion = true;
9904   Style.BraceWrapping.SplitEmptyRecord = false;
9905 
9906   verifyFormat("union Foo\n"
9907                "{};",
9908                Style);
9909   verifyFormat("/* something */ union Foo\n"
9910                "{};",
9911                Style);
9912   verifyFormat("union Foo\n"
9913                "{\n"
9914                "  A,\n"
9915                "};",
9916                Style);
9917   verifyFormat("typedef union Foo\n"
9918                "{\n"
9919                "} Foo_t;",
9920                Style);
9921 }
9922 
9923 TEST_F(FormatTest, SplitEmptyNamespace) {
9924   FormatStyle Style = getLLVMStyle();
9925   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9926   Style.BraceWrapping.AfterNamespace = true;
9927   Style.BraceWrapping.SplitEmptyNamespace = false;
9928 
9929   verifyFormat("namespace Foo\n"
9930                "{};",
9931                Style);
9932   verifyFormat("/* something */ namespace Foo\n"
9933                "{};",
9934                Style);
9935   verifyFormat("inline namespace Foo\n"
9936                "{};",
9937                Style);
9938   verifyFormat("/* something */ inline namespace Foo\n"
9939                "{};",
9940                Style);
9941   verifyFormat("export namespace Foo\n"
9942                "{};",
9943                Style);
9944   verifyFormat("namespace Foo\n"
9945                "{\n"
9946                "void Bar();\n"
9947                "};",
9948                Style);
9949 }
9950 
9951 TEST_F(FormatTest, NeverMergeShortRecords) {
9952   FormatStyle Style = getLLVMStyle();
9953 
9954   verifyFormat("class Foo {\n"
9955                "  Foo();\n"
9956                "};",
9957                Style);
9958   verifyFormat("typedef class Foo {\n"
9959                "  Foo();\n"
9960                "} Foo_t;",
9961                Style);
9962   verifyFormat("struct Foo {\n"
9963                "  Foo();\n"
9964                "};",
9965                Style);
9966   verifyFormat("typedef struct Foo {\n"
9967                "  Foo();\n"
9968                "} Foo_t;",
9969                Style);
9970   verifyFormat("union Foo {\n"
9971                "  A,\n"
9972                "};",
9973                Style);
9974   verifyFormat("typedef union Foo {\n"
9975                "  A,\n"
9976                "} Foo_t;",
9977                Style);
9978   verifyFormat("namespace Foo {\n"
9979                "void Bar();\n"
9980                "};",
9981                Style);
9982 
9983   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9984   Style.BraceWrapping.AfterClass = true;
9985   Style.BraceWrapping.AfterStruct = true;
9986   Style.BraceWrapping.AfterUnion = true;
9987   Style.BraceWrapping.AfterNamespace = true;
9988   verifyFormat("class Foo\n"
9989                "{\n"
9990                "  Foo();\n"
9991                "};",
9992                Style);
9993   verifyFormat("typedef class Foo\n"
9994                "{\n"
9995                "  Foo();\n"
9996                "} Foo_t;",
9997                Style);
9998   verifyFormat("struct Foo\n"
9999                "{\n"
10000                "  Foo();\n"
10001                "};",
10002                Style);
10003   verifyFormat("typedef struct Foo\n"
10004                "{\n"
10005                "  Foo();\n"
10006                "} Foo_t;",
10007                Style);
10008   verifyFormat("union Foo\n"
10009                "{\n"
10010                "  A,\n"
10011                "};",
10012                Style);
10013   verifyFormat("typedef union Foo\n"
10014                "{\n"
10015                "  A,\n"
10016                "} Foo_t;",
10017                Style);
10018   verifyFormat("namespace Foo\n"
10019                "{\n"
10020                "void Bar();\n"
10021                "};",
10022                Style);
10023 }
10024 
10025 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
10026   // Elaborate type variable declarations.
10027   verifyFormat("struct foo a = {bar};\nint n;");
10028   verifyFormat("class foo a = {bar};\nint n;");
10029   verifyFormat("union foo a = {bar};\nint n;");
10030 
10031   // Elaborate types inside function definitions.
10032   verifyFormat("struct foo f() {}\nint n;");
10033   verifyFormat("class foo f() {}\nint n;");
10034   verifyFormat("union foo f() {}\nint n;");
10035 
10036   // Templates.
10037   verifyFormat("template <class X> void f() {}\nint n;");
10038   verifyFormat("template <struct X> void f() {}\nint n;");
10039   verifyFormat("template <union X> void f() {}\nint n;");
10040 
10041   // Actual definitions...
10042   verifyFormat("struct {\n} n;");
10043   verifyFormat(
10044       "template <template <class T, class Y>, class Z> class X {\n} n;");
10045   verifyFormat("union Z {\n  int n;\n} x;");
10046   verifyFormat("class MACRO Z {\n} n;");
10047   verifyFormat("class MACRO(X) Z {\n} n;");
10048   verifyFormat("class __attribute__(X) Z {\n} n;");
10049   verifyFormat("class __declspec(X) Z {\n} n;");
10050   verifyFormat("class A##B##C {\n} n;");
10051   verifyFormat("class alignas(16) Z {\n} n;");
10052   verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
10053   verifyFormat("class MACROA MACRO(X) Z {\n} n;");
10054 
10055   // Redefinition from nested context:
10056   verifyFormat("class A::B::C {\n} n;");
10057 
10058   // Template definitions.
10059   verifyFormat(
10060       "template <typename F>\n"
10061       "Matcher(const Matcher<F> &Other,\n"
10062       "        typename enable_if_c<is_base_of<F, T>::value &&\n"
10063       "                             !is_same<F, T>::value>::type * = 0)\n"
10064       "    : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
10065 
10066   // FIXME: This is still incorrectly handled at the formatter side.
10067   verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
10068   verifyFormat("int i = SomeFunction(a<b, a> b);");
10069 
10070   // FIXME:
10071   // This now gets parsed incorrectly as class definition.
10072   // verifyFormat("class A<int> f() {\n}\nint n;");
10073 
10074   // Elaborate types where incorrectly parsing the structural element would
10075   // break the indent.
10076   verifyFormat("if (true)\n"
10077                "  class X x;\n"
10078                "else\n"
10079                "  f();\n");
10080 
10081   // This is simply incomplete. Formatting is not important, but must not crash.
10082   verifyFormat("class A:");
10083 }
10084 
10085 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
10086   EXPECT_EQ("#error Leave     all         white!!!!! space* alone!\n",
10087             format("#error Leave     all         white!!!!! space* alone!\n"));
10088   EXPECT_EQ(
10089       "#warning Leave     all         white!!!!! space* alone!\n",
10090       format("#warning Leave     all         white!!!!! space* alone!\n"));
10091   EXPECT_EQ("#error 1", format("  #  error   1"));
10092   EXPECT_EQ("#warning 1", format("  #  warning 1"));
10093 }
10094 
10095 TEST_F(FormatTest, FormatHashIfExpressions) {
10096   verifyFormat("#if AAAA && BBBB");
10097   verifyFormat("#if (AAAA && BBBB)");
10098   verifyFormat("#elif (AAAA && BBBB)");
10099   // FIXME: Come up with a better indentation for #elif.
10100   verifyFormat(
10101       "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) &&  \\\n"
10102       "    defined(BBBBBBBB)\n"
10103       "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) &&  \\\n"
10104       "    defined(BBBBBBBB)\n"
10105       "#endif",
10106       getLLVMStyleWithColumns(65));
10107 }
10108 
10109 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
10110   FormatStyle AllowsMergedIf = getGoogleStyle();
10111   AllowsMergedIf.AllowShortIfStatementsOnASingleLine =
10112       FormatStyle::SIS_WithoutElse;
10113   verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
10114   verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
10115   verifyFormat("if (true)\n#error E\n  return 42;", AllowsMergedIf);
10116   EXPECT_EQ("if (true) return 42;",
10117             format("if (true)\nreturn 42;", AllowsMergedIf));
10118   FormatStyle ShortMergedIf = AllowsMergedIf;
10119   ShortMergedIf.ColumnLimit = 25;
10120   verifyFormat("#define A \\\n"
10121                "  if (true) return 42;",
10122                ShortMergedIf);
10123   verifyFormat("#define A \\\n"
10124                "  f();    \\\n"
10125                "  if (true)\n"
10126                "#define B",
10127                ShortMergedIf);
10128   verifyFormat("#define A \\\n"
10129                "  f();    \\\n"
10130                "  if (true)\n"
10131                "g();",
10132                ShortMergedIf);
10133   verifyFormat("{\n"
10134                "#ifdef A\n"
10135                "  // Comment\n"
10136                "  if (true) continue;\n"
10137                "#endif\n"
10138                "  // Comment\n"
10139                "  if (true) continue;\n"
10140                "}",
10141                ShortMergedIf);
10142   ShortMergedIf.ColumnLimit = 33;
10143   verifyFormat("#define A \\\n"
10144                "  if constexpr (true) return 42;",
10145                ShortMergedIf);
10146   verifyFormat("#define A \\\n"
10147                "  if CONSTEXPR (true) return 42;",
10148                ShortMergedIf);
10149   ShortMergedIf.ColumnLimit = 29;
10150   verifyFormat("#define A                   \\\n"
10151                "  if (aaaaaaaaaa) return 1; \\\n"
10152                "  return 2;",
10153                ShortMergedIf);
10154   ShortMergedIf.ColumnLimit = 28;
10155   verifyFormat("#define A         \\\n"
10156                "  if (aaaaaaaaaa) \\\n"
10157                "    return 1;     \\\n"
10158                "  return 2;",
10159                ShortMergedIf);
10160   verifyFormat("#define A                \\\n"
10161                "  if constexpr (aaaaaaa) \\\n"
10162                "    return 1;            \\\n"
10163                "  return 2;",
10164                ShortMergedIf);
10165   verifyFormat("#define A                \\\n"
10166                "  if CONSTEXPR (aaaaaaa) \\\n"
10167                "    return 1;            \\\n"
10168                "  return 2;",
10169                ShortMergedIf);
10170 }
10171 
10172 TEST_F(FormatTest, FormatStarDependingOnContext) {
10173   verifyFormat("void f(int *a);");
10174   verifyFormat("void f() { f(fint * b); }");
10175   verifyFormat("class A {\n  void f(int *a);\n};");
10176   verifyFormat("class A {\n  int *a;\n};");
10177   verifyFormat("namespace a {\n"
10178                "namespace b {\n"
10179                "class A {\n"
10180                "  void f() {}\n"
10181                "  int *a;\n"
10182                "};\n"
10183                "} // namespace b\n"
10184                "} // namespace a");
10185 }
10186 
10187 TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
10188   verifyFormat("while");
10189   verifyFormat("operator");
10190 }
10191 
10192 TEST_F(FormatTest, SkipsDeeplyNestedLines) {
10193   // This code would be painfully slow to format if we didn't skip it.
10194   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
10195                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
10196                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
10197                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
10198                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
10199                    "A(1, 1)\n"
10200                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
10201                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
10202                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
10203                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
10204                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
10205                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
10206                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
10207                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
10208                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
10209                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
10210   // Deeply nested part is untouched, rest is formatted.
10211   EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
10212             format(std::string("int    i;\n") + Code + "int    j;\n",
10213                    getLLVMStyle(), SC_ExpectIncomplete));
10214 }
10215 
10216 //===----------------------------------------------------------------------===//
10217 // Objective-C tests.
10218 //===----------------------------------------------------------------------===//
10219 
10220 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
10221   verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
10222   EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
10223             format("-(NSUInteger)indexOfObject:(id)anObject;"));
10224   EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
10225   EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
10226   EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
10227             format("-(NSInteger)Method3:(id)anObject;"));
10228   EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
10229             format("-(NSInteger)Method4:(id)anObject;"));
10230   EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
10231             format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
10232   EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
10233             format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
10234   EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
10235             "forAllCells:(BOOL)flag;",
10236             format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
10237                    "forAllCells:(BOOL)flag;"));
10238 
10239   // Very long objectiveC method declaration.
10240   verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
10241                "    (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
10242   verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
10243                "                    inRange:(NSRange)range\n"
10244                "                   outRange:(NSRange)out_range\n"
10245                "                  outRange1:(NSRange)out_range1\n"
10246                "                  outRange2:(NSRange)out_range2\n"
10247                "                  outRange3:(NSRange)out_range3\n"
10248                "                  outRange4:(NSRange)out_range4\n"
10249                "                  outRange5:(NSRange)out_range5\n"
10250                "                  outRange6:(NSRange)out_range6\n"
10251                "                  outRange7:(NSRange)out_range7\n"
10252                "                  outRange8:(NSRange)out_range8\n"
10253                "                  outRange9:(NSRange)out_range9;");
10254 
10255   // When the function name has to be wrapped.
10256   FormatStyle Style = getLLVMStyle();
10257   // ObjC ignores IndentWrappedFunctionNames when wrapping methods
10258   // and always indents instead.
10259   Style.IndentWrappedFunctionNames = false;
10260   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
10261                "    veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
10262                "               anotherName:(NSString)bbbbbbbbbbbbbb {\n"
10263                "}",
10264                Style);
10265   Style.IndentWrappedFunctionNames = true;
10266   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
10267                "    veryLooooooooooongName:(NSString)cccccccccccccc\n"
10268                "               anotherName:(NSString)dddddddddddddd {\n"
10269                "}",
10270                Style);
10271 
10272   verifyFormat("- (int)sum:(vector<int>)numbers;");
10273   verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
10274   // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
10275   // protocol lists (but not for template classes):
10276   // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
10277 
10278   verifyFormat("- (int (*)())foo:(int (*)())f;");
10279   verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
10280 
10281   // If there's no return type (very rare in practice!), LLVM and Google style
10282   // agree.
10283   verifyFormat("- foo;");
10284   verifyFormat("- foo:(int)f;");
10285   verifyGoogleFormat("- foo:(int)foo;");
10286 }
10287 
10288 TEST_F(FormatTest, BreaksStringLiterals) {
10289   EXPECT_EQ("\"some text \"\n"
10290             "\"other\";",
10291             format("\"some text other\";", getLLVMStyleWithColumns(12)));
10292   EXPECT_EQ("\"some text \"\n"
10293             "\"other\";",
10294             format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
10295   EXPECT_EQ(
10296       "#define A  \\\n"
10297       "  \"some \"  \\\n"
10298       "  \"text \"  \\\n"
10299       "  \"other\";",
10300       format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
10301   EXPECT_EQ(
10302       "#define A  \\\n"
10303       "  \"so \"    \\\n"
10304       "  \"text \"  \\\n"
10305       "  \"other\";",
10306       format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
10307 
10308   EXPECT_EQ("\"some text\"",
10309             format("\"some text\"", getLLVMStyleWithColumns(1)));
10310   EXPECT_EQ("\"some text\"",
10311             format("\"some text\"", getLLVMStyleWithColumns(11)));
10312   EXPECT_EQ("\"some \"\n"
10313             "\"text\"",
10314             format("\"some text\"", getLLVMStyleWithColumns(10)));
10315   EXPECT_EQ("\"some \"\n"
10316             "\"text\"",
10317             format("\"some text\"", getLLVMStyleWithColumns(7)));
10318   EXPECT_EQ("\"some\"\n"
10319             "\" tex\"\n"
10320             "\"t\"",
10321             format("\"some text\"", getLLVMStyleWithColumns(6)));
10322   EXPECT_EQ("\"some\"\n"
10323             "\" tex\"\n"
10324             "\" and\"",
10325             format("\"some tex and\"", getLLVMStyleWithColumns(6)));
10326   EXPECT_EQ("\"some\"\n"
10327             "\"/tex\"\n"
10328             "\"/and\"",
10329             format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
10330 
10331   EXPECT_EQ("variable =\n"
10332             "    \"long string \"\n"
10333             "    \"literal\";",
10334             format("variable = \"long string literal\";",
10335                    getLLVMStyleWithColumns(20)));
10336 
10337   EXPECT_EQ("variable = f(\n"
10338             "    \"long string \"\n"
10339             "    \"literal\",\n"
10340             "    short,\n"
10341             "    loooooooooooooooooooong);",
10342             format("variable = f(\"long string literal\", short, "
10343                    "loooooooooooooooooooong);",
10344                    getLLVMStyleWithColumns(20)));
10345 
10346   EXPECT_EQ(
10347       "f(g(\"long string \"\n"
10348       "    \"literal\"),\n"
10349       "  b);",
10350       format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
10351   EXPECT_EQ("f(g(\"long string \"\n"
10352             "    \"literal\",\n"
10353             "    a),\n"
10354             "  b);",
10355             format("f(g(\"long string literal\", a), b);",
10356                    getLLVMStyleWithColumns(20)));
10357   EXPECT_EQ(
10358       "f(\"one two\".split(\n"
10359       "    variable));",
10360       format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
10361   EXPECT_EQ("f(\"one two three four five six \"\n"
10362             "  \"seven\".split(\n"
10363             "      really_looooong_variable));",
10364             format("f(\"one two three four five six seven\"."
10365                    "split(really_looooong_variable));",
10366                    getLLVMStyleWithColumns(33)));
10367 
10368   EXPECT_EQ("f(\"some \"\n"
10369             "  \"text\",\n"
10370             "  other);",
10371             format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
10372 
10373   // Only break as a last resort.
10374   verifyFormat(
10375       "aaaaaaaaaaaaaaaaaaaa(\n"
10376       "    aaaaaaaaaaaaaaaaaaaa,\n"
10377       "    aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
10378 
10379   EXPECT_EQ("\"splitmea\"\n"
10380             "\"trandomp\"\n"
10381             "\"oint\"",
10382             format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
10383 
10384   EXPECT_EQ("\"split/\"\n"
10385             "\"pathat/\"\n"
10386             "\"slashes\"",
10387             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
10388 
10389   EXPECT_EQ("\"split/\"\n"
10390             "\"pathat/\"\n"
10391             "\"slashes\"",
10392             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
10393   EXPECT_EQ("\"split at \"\n"
10394             "\"spaces/at/\"\n"
10395             "\"slashes.at.any$\"\n"
10396             "\"non-alphanumeric%\"\n"
10397             "\"1111111111characte\"\n"
10398             "\"rs\"",
10399             format("\"split at "
10400                    "spaces/at/"
10401                    "slashes.at."
10402                    "any$non-"
10403                    "alphanumeric%"
10404                    "1111111111characte"
10405                    "rs\"",
10406                    getLLVMStyleWithColumns(20)));
10407 
10408   // Verify that splitting the strings understands
10409   // Style::AlwaysBreakBeforeMultilineStrings.
10410   EXPECT_EQ("aaaaaaaaaaaa(\n"
10411             "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
10412             "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
10413             format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
10414                    "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
10415                    "aaaaaaaaaaaaaaaaaaaaaa\");",
10416                    getGoogleStyle()));
10417   EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
10418             "       \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
10419             format("return \"aaaaaaaaaaaaaaaaaaaaaa "
10420                    "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
10421                    "aaaaaaaaaaaaaaaaaaaaaa\";",
10422                    getGoogleStyle()));
10423   EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
10424             "                \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
10425             format("llvm::outs() << "
10426                    "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
10427                    "aaaaaaaaaaaaaaaaaaa\";"));
10428   EXPECT_EQ("ffff(\n"
10429             "    {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
10430             "     \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
10431             format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
10432                    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
10433                    getGoogleStyle()));
10434 
10435   FormatStyle Style = getLLVMStyleWithColumns(12);
10436   Style.BreakStringLiterals = false;
10437   EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
10438 
10439   FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
10440   AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10441   EXPECT_EQ("#define A \\\n"
10442             "  \"some \" \\\n"
10443             "  \"text \" \\\n"
10444             "  \"other\";",
10445             format("#define A \"some text other\";", AlignLeft));
10446 }
10447 
10448 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) {
10449   EXPECT_EQ("C a = \"some more \"\n"
10450             "      \"text\";",
10451             format("C a = \"some more text\";", getLLVMStyleWithColumns(18)));
10452 }
10453 
10454 TEST_F(FormatTest, FullyRemoveEmptyLines) {
10455   FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
10456   NoEmptyLines.MaxEmptyLinesToKeep = 0;
10457   EXPECT_EQ("int i = a(b());",
10458             format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
10459 }
10460 
10461 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
10462   EXPECT_EQ(
10463       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10464       "(\n"
10465       "    \"x\t\");",
10466       format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10467              "aaaaaaa("
10468              "\"x\t\");"));
10469 }
10470 
10471 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
10472   EXPECT_EQ(
10473       "u8\"utf8 string \"\n"
10474       "u8\"literal\";",
10475       format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
10476   EXPECT_EQ(
10477       "u\"utf16 string \"\n"
10478       "u\"literal\";",
10479       format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
10480   EXPECT_EQ(
10481       "U\"utf32 string \"\n"
10482       "U\"literal\";",
10483       format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
10484   EXPECT_EQ("L\"wide string \"\n"
10485             "L\"literal\";",
10486             format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
10487   EXPECT_EQ("@\"NSString \"\n"
10488             "@\"literal\";",
10489             format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
10490   verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
10491 
10492   // This input makes clang-format try to split the incomplete unicode escape
10493   // sequence, which used to lead to a crasher.
10494   verifyNoCrash(
10495       "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
10496       getLLVMStyleWithColumns(60));
10497 }
10498 
10499 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
10500   FormatStyle Style = getGoogleStyleWithColumns(15);
10501   EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
10502   EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
10503   EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
10504   EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
10505   EXPECT_EQ("u8R\"x(raw literal)x\";",
10506             format("u8R\"x(raw literal)x\";", Style));
10507 }
10508 
10509 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
10510   FormatStyle Style = getLLVMStyleWithColumns(20);
10511   EXPECT_EQ(
10512       "_T(\"aaaaaaaaaaaaaa\")\n"
10513       "_T(\"aaaaaaaaaaaaaa\")\n"
10514       "_T(\"aaaaaaaaaaaa\")",
10515       format("  _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
10516   EXPECT_EQ("f(x,\n"
10517             "  _T(\"aaaaaaaaaaaa\")\n"
10518             "  _T(\"aaa\"),\n"
10519             "  z);",
10520             format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
10521 
10522   // FIXME: Handle embedded spaces in one iteration.
10523   //  EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
10524   //            "_T(\"aaaaaaaaaaaaa\")\n"
10525   //            "_T(\"aaaaaaaaaaaaa\")\n"
10526   //            "_T(\"a\")",
10527   //            format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
10528   //                   getLLVMStyleWithColumns(20)));
10529   EXPECT_EQ(
10530       "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
10531       format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
10532   EXPECT_EQ("f(\n"
10533             "#if !TEST\n"
10534             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
10535             "#endif\n"
10536             ");",
10537             format("f(\n"
10538                    "#if !TEST\n"
10539                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
10540                    "#endif\n"
10541                    ");"));
10542   EXPECT_EQ("f(\n"
10543             "\n"
10544             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
10545             format("f(\n"
10546                    "\n"
10547                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
10548 }
10549 
10550 TEST_F(FormatTest, BreaksStringLiteralOperands) {
10551   // In a function call with two operands, the second can be broken with no line
10552   // break before it.
10553   EXPECT_EQ(
10554       "func(a, \"long long \"\n"
10555       "        \"long long\");",
10556       format("func(a, \"long long long long\");", getLLVMStyleWithColumns(24)));
10557   // In a function call with three operands, the second must be broken with a
10558   // line break before it.
10559   EXPECT_EQ("func(a,\n"
10560             "     \"long long long \"\n"
10561             "     \"long\",\n"
10562             "     c);",
10563             format("func(a, \"long long long long\", c);",
10564                    getLLVMStyleWithColumns(24)));
10565   // In a function call with three operands, the third must be broken with a
10566   // line break before it.
10567   EXPECT_EQ("func(a, b,\n"
10568             "     \"long long long \"\n"
10569             "     \"long\");",
10570             format("func(a, b, \"long long long long\");",
10571                    getLLVMStyleWithColumns(24)));
10572   // In a function call with three operands, both the second and the third must
10573   // be broken with a line break before them.
10574   EXPECT_EQ("func(a,\n"
10575             "     \"long long long \"\n"
10576             "     \"long\",\n"
10577             "     \"long long long \"\n"
10578             "     \"long\");",
10579             format("func(a, \"long long long long\", \"long long long long\");",
10580                    getLLVMStyleWithColumns(24)));
10581   // In a chain of << with two operands, the second can be broken with no line
10582   // break before it.
10583   EXPECT_EQ("a << \"line line \"\n"
10584             "     \"line\";",
10585             format("a << \"line line line\";", getLLVMStyleWithColumns(20)));
10586   // In a chain of << with three operands, the second can be broken with no line
10587   // break before it.
10588   EXPECT_EQ(
10589       "abcde << \"line \"\n"
10590       "         \"line line\"\n"
10591       "      << c;",
10592       format("abcde << \"line line line\" << c;", getLLVMStyleWithColumns(20)));
10593   // In a chain of << with three operands, the third must be broken with a line
10594   // break before it.
10595   EXPECT_EQ(
10596       "a << b\n"
10597       "  << \"line line \"\n"
10598       "     \"line\";",
10599       format("a << b << \"line line line\";", getLLVMStyleWithColumns(20)));
10600   // In a chain of << with three operands, the second can be broken with no line
10601   // break before it and the third must be broken with a line break before it.
10602   EXPECT_EQ("abcd << \"line line \"\n"
10603             "        \"line\"\n"
10604             "     << \"line line \"\n"
10605             "        \"line\";",
10606             format("abcd << \"line line line\" << \"line line line\";",
10607                    getLLVMStyleWithColumns(20)));
10608   // In a chain of binary operators with two operands, the second can be broken
10609   // with no line break before it.
10610   EXPECT_EQ(
10611       "abcd + \"line line \"\n"
10612       "       \"line line\";",
10613       format("abcd + \"line line line line\";", getLLVMStyleWithColumns(20)));
10614   // In a chain of binary operators with three operands, the second must be
10615   // broken with a line break before it.
10616   EXPECT_EQ("abcd +\n"
10617             "    \"line line \"\n"
10618             "    \"line line\" +\n"
10619             "    e;",
10620             format("abcd + \"line line line line\" + e;",
10621                    getLLVMStyleWithColumns(20)));
10622   // In a function call with two operands, with AlignAfterOpenBracket enabled,
10623   // the first must be broken with a line break before it.
10624   FormatStyle Style = getLLVMStyleWithColumns(25);
10625   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10626   EXPECT_EQ("someFunction(\n"
10627             "    \"long long long \"\n"
10628             "    \"long\",\n"
10629             "    a);",
10630             format("someFunction(\"long long long long\", a);", Style));
10631 }
10632 
10633 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
10634   EXPECT_EQ(
10635       "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
10636       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
10637       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
10638       format("aaaaaaaaaaa  =  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
10639              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
10640              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
10641 }
10642 
10643 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
10644   EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
10645             format("f(g(R\"x(raw literal)x\",   a), b);", getGoogleStyle()));
10646   EXPECT_EQ("fffffffffff(g(R\"x(\n"
10647             "multiline raw string literal xxxxxxxxxxxxxx\n"
10648             ")x\",\n"
10649             "              a),\n"
10650             "            b);",
10651             format("fffffffffff(g(R\"x(\n"
10652                    "multiline raw string literal xxxxxxxxxxxxxx\n"
10653                    ")x\", a), b);",
10654                    getGoogleStyleWithColumns(20)));
10655   EXPECT_EQ("fffffffffff(\n"
10656             "    g(R\"x(qqq\n"
10657             "multiline raw string literal xxxxxxxxxxxxxx\n"
10658             ")x\",\n"
10659             "      a),\n"
10660             "    b);",
10661             format("fffffffffff(g(R\"x(qqq\n"
10662                    "multiline raw string literal xxxxxxxxxxxxxx\n"
10663                    ")x\", a), b);",
10664                    getGoogleStyleWithColumns(20)));
10665 
10666   EXPECT_EQ("fffffffffff(R\"x(\n"
10667             "multiline raw string literal xxxxxxxxxxxxxx\n"
10668             ")x\");",
10669             format("fffffffffff(R\"x(\n"
10670                    "multiline raw string literal xxxxxxxxxxxxxx\n"
10671                    ")x\");",
10672                    getGoogleStyleWithColumns(20)));
10673   EXPECT_EQ("fffffffffff(R\"x(\n"
10674             "multiline raw string literal xxxxxxxxxxxxxx\n"
10675             ")x\" + bbbbbb);",
10676             format("fffffffffff(R\"x(\n"
10677                    "multiline raw string literal xxxxxxxxxxxxxx\n"
10678                    ")x\" +   bbbbbb);",
10679                    getGoogleStyleWithColumns(20)));
10680   EXPECT_EQ("fffffffffff(\n"
10681             "    R\"x(\n"
10682             "multiline raw string literal xxxxxxxxxxxxxx\n"
10683             ")x\" +\n"
10684             "    bbbbbb);",
10685             format("fffffffffff(\n"
10686                    " R\"x(\n"
10687                    "multiline raw string literal xxxxxxxxxxxxxx\n"
10688                    ")x\" + bbbbbb);",
10689                    getGoogleStyleWithColumns(20)));
10690   EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);",
10691             format("fffffffffff(\n"
10692                    " R\"(single line raw string)\" + bbbbbb);"));
10693 }
10694 
10695 TEST_F(FormatTest, SkipsUnknownStringLiterals) {
10696   verifyFormat("string a = \"unterminated;");
10697   EXPECT_EQ("function(\"unterminated,\n"
10698             "         OtherParameter);",
10699             format("function(  \"unterminated,\n"
10700                    "    OtherParameter);"));
10701 }
10702 
10703 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
10704   FormatStyle Style = getLLVMStyle();
10705   Style.Standard = FormatStyle::LS_Cpp03;
10706   EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
10707             format("#define x(_a) printf(\"foo\"_a);", Style));
10708 }
10709 
10710 TEST_F(FormatTest, CppLexVersion) {
10711   FormatStyle Style = getLLVMStyle();
10712   // Formatting of x * y differs if x is a type.
10713   verifyFormat("void foo() { MACRO(a * b); }", Style);
10714   verifyFormat("void foo() { MACRO(int *b); }", Style);
10715 
10716   // LLVM style uses latest lexer.
10717   verifyFormat("void foo() { MACRO(char8_t *b); }", Style);
10718   Style.Standard = FormatStyle::LS_Cpp17;
10719   // But in c++17, char8_t isn't a keyword.
10720   verifyFormat("void foo() { MACRO(char8_t * b); }", Style);
10721 }
10722 
10723 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
10724 
10725 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
10726   EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
10727             "             \"ddeeefff\");",
10728             format("someFunction(\"aaabbbcccdddeeefff\");",
10729                    getLLVMStyleWithColumns(25)));
10730   EXPECT_EQ("someFunction1234567890(\n"
10731             "    \"aaabbbcccdddeeefff\");",
10732             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
10733                    getLLVMStyleWithColumns(26)));
10734   EXPECT_EQ("someFunction1234567890(\n"
10735             "    \"aaabbbcccdddeeeff\"\n"
10736             "    \"f\");",
10737             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
10738                    getLLVMStyleWithColumns(25)));
10739   EXPECT_EQ("someFunction1234567890(\n"
10740             "    \"aaabbbcccdddeeeff\"\n"
10741             "    \"f\");",
10742             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
10743                    getLLVMStyleWithColumns(24)));
10744   EXPECT_EQ("someFunction(\n"
10745             "    \"aaabbbcc ddde \"\n"
10746             "    \"efff\");",
10747             format("someFunction(\"aaabbbcc ddde efff\");",
10748                    getLLVMStyleWithColumns(25)));
10749   EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
10750             "             \"ddeeefff\");",
10751             format("someFunction(\"aaabbbccc ddeeefff\");",
10752                    getLLVMStyleWithColumns(25)));
10753   EXPECT_EQ("someFunction1234567890(\n"
10754             "    \"aaabb \"\n"
10755             "    \"cccdddeeefff\");",
10756             format("someFunction1234567890(\"aaabb cccdddeeefff\");",
10757                    getLLVMStyleWithColumns(25)));
10758   EXPECT_EQ("#define A          \\\n"
10759             "  string s =       \\\n"
10760             "      \"123456789\"  \\\n"
10761             "      \"0\";         \\\n"
10762             "  int i;",
10763             format("#define A string s = \"1234567890\"; int i;",
10764                    getLLVMStyleWithColumns(20)));
10765   EXPECT_EQ("someFunction(\n"
10766             "    \"aaabbbcc \"\n"
10767             "    \"dddeeefff\");",
10768             format("someFunction(\"aaabbbcc dddeeefff\");",
10769                    getLLVMStyleWithColumns(25)));
10770 }
10771 
10772 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
10773   EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
10774   EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
10775   EXPECT_EQ("\"test\"\n"
10776             "\"\\n\"",
10777             format("\"test\\n\"", getLLVMStyleWithColumns(7)));
10778   EXPECT_EQ("\"tes\\\\\"\n"
10779             "\"n\"",
10780             format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
10781   EXPECT_EQ("\"\\\\\\\\\"\n"
10782             "\"\\n\"",
10783             format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
10784   EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
10785   EXPECT_EQ("\"\\uff01\"\n"
10786             "\"test\"",
10787             format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
10788   EXPECT_EQ("\"\\Uff01ff02\"",
10789             format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
10790   EXPECT_EQ("\"\\x000000000001\"\n"
10791             "\"next\"",
10792             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
10793   EXPECT_EQ("\"\\x000000000001next\"",
10794             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
10795   EXPECT_EQ("\"\\x000000000001\"",
10796             format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
10797   EXPECT_EQ("\"test\"\n"
10798             "\"\\000000\"\n"
10799             "\"000001\"",
10800             format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
10801   EXPECT_EQ("\"test\\000\"\n"
10802             "\"00000000\"\n"
10803             "\"1\"",
10804             format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
10805 }
10806 
10807 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
10808   verifyFormat("void f() {\n"
10809                "  return g() {}\n"
10810                "  void h() {}");
10811   verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
10812                "g();\n"
10813                "}");
10814 }
10815 
10816 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
10817   verifyFormat(
10818       "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
10819 }
10820 
10821 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
10822   verifyFormat("class X {\n"
10823                "  void f() {\n"
10824                "  }\n"
10825                "};",
10826                getLLVMStyleWithColumns(12));
10827 }
10828 
10829 TEST_F(FormatTest, ConfigurableIndentWidth) {
10830   FormatStyle EightIndent = getLLVMStyleWithColumns(18);
10831   EightIndent.IndentWidth = 8;
10832   EightIndent.ContinuationIndentWidth = 8;
10833   verifyFormat("void f() {\n"
10834                "        someFunction();\n"
10835                "        if (true) {\n"
10836                "                f();\n"
10837                "        }\n"
10838                "}",
10839                EightIndent);
10840   verifyFormat("class X {\n"
10841                "        void f() {\n"
10842                "        }\n"
10843                "};",
10844                EightIndent);
10845   verifyFormat("int x[] = {\n"
10846                "        call(),\n"
10847                "        call()};",
10848                EightIndent);
10849 }
10850 
10851 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
10852   verifyFormat("double\n"
10853                "f();",
10854                getLLVMStyleWithColumns(8));
10855 }
10856 
10857 TEST_F(FormatTest, ConfigurableUseOfTab) {
10858   FormatStyle Tab = getLLVMStyleWithColumns(42);
10859   Tab.IndentWidth = 8;
10860   Tab.UseTab = FormatStyle::UT_Always;
10861   Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10862 
10863   EXPECT_EQ("if (aaaaaaaa && // q\n"
10864             "    bb)\t\t// w\n"
10865             "\t;",
10866             format("if (aaaaaaaa &&// q\n"
10867                    "bb)// w\n"
10868                    ";",
10869                    Tab));
10870   EXPECT_EQ("if (aaa && bbb) // w\n"
10871             "\t;",
10872             format("if(aaa&&bbb)// w\n"
10873                    ";",
10874                    Tab));
10875 
10876   verifyFormat("class X {\n"
10877                "\tvoid f() {\n"
10878                "\t\tsomeFunction(parameter1,\n"
10879                "\t\t\t     parameter2);\n"
10880                "\t}\n"
10881                "};",
10882                Tab);
10883   verifyFormat("#define A                        \\\n"
10884                "\tvoid f() {               \\\n"
10885                "\t\tsomeFunction(    \\\n"
10886                "\t\t    parameter1,  \\\n"
10887                "\t\t    parameter2); \\\n"
10888                "\t}",
10889                Tab);
10890   verifyFormat("int a;\t      // x\n"
10891                "int bbbbbbbb; // x\n",
10892                Tab);
10893 
10894   Tab.TabWidth = 4;
10895   Tab.IndentWidth = 8;
10896   verifyFormat("class TabWidth4Indent8 {\n"
10897                "\t\tvoid f() {\n"
10898                "\t\t\t\tsomeFunction(parameter1,\n"
10899                "\t\t\t\t\t\t\t parameter2);\n"
10900                "\t\t}\n"
10901                "};",
10902                Tab);
10903 
10904   Tab.TabWidth = 4;
10905   Tab.IndentWidth = 4;
10906   verifyFormat("class TabWidth4Indent4 {\n"
10907                "\tvoid f() {\n"
10908                "\t\tsomeFunction(parameter1,\n"
10909                "\t\t\t\t\t parameter2);\n"
10910                "\t}\n"
10911                "};",
10912                Tab);
10913 
10914   Tab.TabWidth = 8;
10915   Tab.IndentWidth = 4;
10916   verifyFormat("class TabWidth8Indent4 {\n"
10917                "    void f() {\n"
10918                "\tsomeFunction(parameter1,\n"
10919                "\t\t     parameter2);\n"
10920                "    }\n"
10921                "};",
10922                Tab);
10923 
10924   Tab.TabWidth = 8;
10925   Tab.IndentWidth = 8;
10926   EXPECT_EQ("/*\n"
10927             "\t      a\t\tcomment\n"
10928             "\t      in multiple lines\n"
10929             "       */",
10930             format("   /*\t \t \n"
10931                    " \t \t a\t\tcomment\t \t\n"
10932                    " \t \t in multiple lines\t\n"
10933                    " \t  */",
10934                    Tab));
10935 
10936   Tab.UseTab = FormatStyle::UT_ForIndentation;
10937   verifyFormat("{\n"
10938                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10939                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10940                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10941                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10942                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10943                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10944                "};",
10945                Tab);
10946   verifyFormat("enum AA {\n"
10947                "\ta1, // Force multiple lines\n"
10948                "\ta2,\n"
10949                "\ta3\n"
10950                "};",
10951                Tab);
10952   EXPECT_EQ("if (aaaaaaaa && // q\n"
10953             "    bb)         // w\n"
10954             "\t;",
10955             format("if (aaaaaaaa &&// q\n"
10956                    "bb)// w\n"
10957                    ";",
10958                    Tab));
10959   verifyFormat("class X {\n"
10960                "\tvoid f() {\n"
10961                "\t\tsomeFunction(parameter1,\n"
10962                "\t\t             parameter2);\n"
10963                "\t}\n"
10964                "};",
10965                Tab);
10966   verifyFormat("{\n"
10967                "\tQ(\n"
10968                "\t    {\n"
10969                "\t\t    int a;\n"
10970                "\t\t    someFunction(aaaaaaaa,\n"
10971                "\t\t                 bbbbbbb);\n"
10972                "\t    },\n"
10973                "\t    p);\n"
10974                "}",
10975                Tab);
10976   EXPECT_EQ("{\n"
10977             "\t/* aaaa\n"
10978             "\t   bbbb */\n"
10979             "}",
10980             format("{\n"
10981                    "/* aaaa\n"
10982                    "   bbbb */\n"
10983                    "}",
10984                    Tab));
10985   EXPECT_EQ("{\n"
10986             "\t/*\n"
10987             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10988             "\t  bbbbbbbbbbbbb\n"
10989             "\t*/\n"
10990             "}",
10991             format("{\n"
10992                    "/*\n"
10993                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10994                    "*/\n"
10995                    "}",
10996                    Tab));
10997   EXPECT_EQ("{\n"
10998             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10999             "\t// bbbbbbbbbbbbb\n"
11000             "}",
11001             format("{\n"
11002                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
11003                    "}",
11004                    Tab));
11005   EXPECT_EQ("{\n"
11006             "\t/*\n"
11007             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
11008             "\t  bbbbbbbbbbbbb\n"
11009             "\t*/\n"
11010             "}",
11011             format("{\n"
11012                    "\t/*\n"
11013                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
11014                    "\t*/\n"
11015                    "}",
11016                    Tab));
11017   EXPECT_EQ("{\n"
11018             "\t/*\n"
11019             "\n"
11020             "\t*/\n"
11021             "}",
11022             format("{\n"
11023                    "\t/*\n"
11024                    "\n"
11025                    "\t*/\n"
11026                    "}",
11027                    Tab));
11028   EXPECT_EQ("{\n"
11029             "\t/*\n"
11030             " asdf\n"
11031             "\t*/\n"
11032             "}",
11033             format("{\n"
11034                    "\t/*\n"
11035                    " asdf\n"
11036                    "\t*/\n"
11037                    "}",
11038                    Tab));
11039 
11040   Tab.UseTab = FormatStyle::UT_Never;
11041   EXPECT_EQ("/*\n"
11042             "              a\t\tcomment\n"
11043             "              in multiple lines\n"
11044             "       */",
11045             format("   /*\t \t \n"
11046                    " \t \t a\t\tcomment\t \t\n"
11047                    " \t \t in multiple lines\t\n"
11048                    " \t  */",
11049                    Tab));
11050   EXPECT_EQ("/* some\n"
11051             "   comment */",
11052             format(" \t \t /* some\n"
11053                    " \t \t    comment */",
11054                    Tab));
11055   EXPECT_EQ("int a; /* some\n"
11056             "   comment */",
11057             format(" \t \t int a; /* some\n"
11058                    " \t \t    comment */",
11059                    Tab));
11060 
11061   EXPECT_EQ("int a; /* some\n"
11062             "comment */",
11063             format(" \t \t int\ta; /* some\n"
11064                    " \t \t    comment */",
11065                    Tab));
11066   EXPECT_EQ("f(\"\t\t\"); /* some\n"
11067             "    comment */",
11068             format(" \t \t f(\"\t\t\"); /* some\n"
11069                    " \t \t    comment */",
11070                    Tab));
11071   EXPECT_EQ("{\n"
11072             "        /*\n"
11073             "         * Comment\n"
11074             "         */\n"
11075             "        int i;\n"
11076             "}",
11077             format("{\n"
11078                    "\t/*\n"
11079                    "\t * Comment\n"
11080                    "\t */\n"
11081                    "\t int i;\n"
11082                    "}",
11083                    Tab));
11084 
11085   Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
11086   Tab.TabWidth = 8;
11087   Tab.IndentWidth = 8;
11088   EXPECT_EQ("if (aaaaaaaa && // q\n"
11089             "    bb)         // w\n"
11090             "\t;",
11091             format("if (aaaaaaaa &&// q\n"
11092                    "bb)// w\n"
11093                    ";",
11094                    Tab));
11095   EXPECT_EQ("if (aaa && bbb) // w\n"
11096             "\t;",
11097             format("if(aaa&&bbb)// w\n"
11098                    ";",
11099                    Tab));
11100   verifyFormat("class X {\n"
11101                "\tvoid f() {\n"
11102                "\t\tsomeFunction(parameter1,\n"
11103                "\t\t\t     parameter2);\n"
11104                "\t}\n"
11105                "};",
11106                Tab);
11107   verifyFormat("#define A                        \\\n"
11108                "\tvoid f() {               \\\n"
11109                "\t\tsomeFunction(    \\\n"
11110                "\t\t    parameter1,  \\\n"
11111                "\t\t    parameter2); \\\n"
11112                "\t}",
11113                Tab);
11114   Tab.TabWidth = 4;
11115   Tab.IndentWidth = 8;
11116   verifyFormat("class TabWidth4Indent8 {\n"
11117                "\t\tvoid f() {\n"
11118                "\t\t\t\tsomeFunction(parameter1,\n"
11119                "\t\t\t\t\t\t\t parameter2);\n"
11120                "\t\t}\n"
11121                "};",
11122                Tab);
11123   Tab.TabWidth = 4;
11124   Tab.IndentWidth = 4;
11125   verifyFormat("class TabWidth4Indent4 {\n"
11126                "\tvoid f() {\n"
11127                "\t\tsomeFunction(parameter1,\n"
11128                "\t\t\t\t\t parameter2);\n"
11129                "\t}\n"
11130                "};",
11131                Tab);
11132   Tab.TabWidth = 8;
11133   Tab.IndentWidth = 4;
11134   verifyFormat("class TabWidth8Indent4 {\n"
11135                "    void f() {\n"
11136                "\tsomeFunction(parameter1,\n"
11137                "\t\t     parameter2);\n"
11138                "    }\n"
11139                "};",
11140                Tab);
11141   Tab.TabWidth = 8;
11142   Tab.IndentWidth = 8;
11143   EXPECT_EQ("/*\n"
11144             "\t      a\t\tcomment\n"
11145             "\t      in multiple lines\n"
11146             "       */",
11147             format("   /*\t \t \n"
11148                    " \t \t a\t\tcomment\t \t\n"
11149                    " \t \t in multiple lines\t\n"
11150                    " \t  */",
11151                    Tab));
11152   verifyFormat("{\n"
11153                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11154                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11155                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11156                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11157                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11158                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11159                "};",
11160                Tab);
11161   verifyFormat("enum AA {\n"
11162                "\ta1, // Force multiple lines\n"
11163                "\ta2,\n"
11164                "\ta3\n"
11165                "};",
11166                Tab);
11167   EXPECT_EQ("if (aaaaaaaa && // q\n"
11168             "    bb)         // w\n"
11169             "\t;",
11170             format("if (aaaaaaaa &&// q\n"
11171                    "bb)// w\n"
11172                    ";",
11173                    Tab));
11174   verifyFormat("class X {\n"
11175                "\tvoid f() {\n"
11176                "\t\tsomeFunction(parameter1,\n"
11177                "\t\t\t     parameter2);\n"
11178                "\t}\n"
11179                "};",
11180                Tab);
11181   verifyFormat("{\n"
11182                "\tQ(\n"
11183                "\t    {\n"
11184                "\t\t    int a;\n"
11185                "\t\t    someFunction(aaaaaaaa,\n"
11186                "\t\t\t\t bbbbbbb);\n"
11187                "\t    },\n"
11188                "\t    p);\n"
11189                "}",
11190                Tab);
11191   EXPECT_EQ("{\n"
11192             "\t/* aaaa\n"
11193             "\t   bbbb */\n"
11194             "}",
11195             format("{\n"
11196                    "/* aaaa\n"
11197                    "   bbbb */\n"
11198                    "}",
11199                    Tab));
11200   EXPECT_EQ("{\n"
11201             "\t/*\n"
11202             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
11203             "\t  bbbbbbbbbbbbb\n"
11204             "\t*/\n"
11205             "}",
11206             format("{\n"
11207                    "/*\n"
11208                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
11209                    "*/\n"
11210                    "}",
11211                    Tab));
11212   EXPECT_EQ("{\n"
11213             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
11214             "\t// bbbbbbbbbbbbb\n"
11215             "}",
11216             format("{\n"
11217                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
11218                    "}",
11219                    Tab));
11220   EXPECT_EQ("{\n"
11221             "\t/*\n"
11222             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
11223             "\t  bbbbbbbbbbbbb\n"
11224             "\t*/\n"
11225             "}",
11226             format("{\n"
11227                    "\t/*\n"
11228                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
11229                    "\t*/\n"
11230                    "}",
11231                    Tab));
11232   EXPECT_EQ("{\n"
11233             "\t/*\n"
11234             "\n"
11235             "\t*/\n"
11236             "}",
11237             format("{\n"
11238                    "\t/*\n"
11239                    "\n"
11240                    "\t*/\n"
11241                    "}",
11242                    Tab));
11243   EXPECT_EQ("{\n"
11244             "\t/*\n"
11245             " asdf\n"
11246             "\t*/\n"
11247             "}",
11248             format("{\n"
11249                    "\t/*\n"
11250                    " asdf\n"
11251                    "\t*/\n"
11252                    "}",
11253                    Tab));
11254   EXPECT_EQ("/* some\n"
11255             "   comment */",
11256             format(" \t \t /* some\n"
11257                    " \t \t    comment */",
11258                    Tab));
11259   EXPECT_EQ("int a; /* some\n"
11260             "   comment */",
11261             format(" \t \t int a; /* some\n"
11262                    " \t \t    comment */",
11263                    Tab));
11264   EXPECT_EQ("int a; /* some\n"
11265             "comment */",
11266             format(" \t \t int\ta; /* some\n"
11267                    " \t \t    comment */",
11268                    Tab));
11269   EXPECT_EQ("f(\"\t\t\"); /* some\n"
11270             "    comment */",
11271             format(" \t \t f(\"\t\t\"); /* some\n"
11272                    " \t \t    comment */",
11273                    Tab));
11274   EXPECT_EQ("{\n"
11275             "\t/*\n"
11276             "\t * Comment\n"
11277             "\t */\n"
11278             "\tint i;\n"
11279             "}",
11280             format("{\n"
11281                    "\t/*\n"
11282                    "\t * Comment\n"
11283                    "\t */\n"
11284                    "\t int i;\n"
11285                    "}",
11286                    Tab));
11287   Tab.TabWidth = 2;
11288   Tab.IndentWidth = 2;
11289   EXPECT_EQ("{\n"
11290             "\t/* aaaa\n"
11291             "\t\t bbbb */\n"
11292             "}",
11293             format("{\n"
11294                    "/* aaaa\n"
11295                    "\t bbbb */\n"
11296                    "}",
11297                    Tab));
11298   EXPECT_EQ("{\n"
11299             "\t/*\n"
11300             "\t\taaaaaaaaaaaaaaaaaaaaaaaaaa\n"
11301             "\t\tbbbbbbbbbbbbb\n"
11302             "\t*/\n"
11303             "}",
11304             format("{\n"
11305                    "/*\n"
11306                    "\taaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
11307                    "*/\n"
11308                    "}",
11309                    Tab));
11310   Tab.AlignConsecutiveAssignments = true;
11311   Tab.AlignConsecutiveDeclarations = true;
11312   Tab.TabWidth = 4;
11313   Tab.IndentWidth = 4;
11314   verifyFormat("class Assign {\n"
11315                "\tvoid f() {\n"
11316                "\t\tint         x      = 123;\n"
11317                "\t\tint         random = 4;\n"
11318                "\t\tstd::string alphabet =\n"
11319                "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
11320                "\t}\n"
11321                "};",
11322                Tab);
11323 
11324   Tab.UseTab = FormatStyle::UT_AlignWithSpaces;
11325   Tab.TabWidth = 8;
11326   Tab.IndentWidth = 8;
11327   EXPECT_EQ("if (aaaaaaaa && // q\n"
11328             "    bb)         // w\n"
11329             "\t;",
11330             format("if (aaaaaaaa &&// q\n"
11331                    "bb)// w\n"
11332                    ";",
11333                    Tab));
11334   EXPECT_EQ("if (aaa && bbb) // w\n"
11335             "\t;",
11336             format("if(aaa&&bbb)// w\n"
11337                    ";",
11338                    Tab));
11339   verifyFormat("class X {\n"
11340                "\tvoid f() {\n"
11341                "\t\tsomeFunction(parameter1,\n"
11342                "\t\t             parameter2);\n"
11343                "\t}\n"
11344                "};",
11345                Tab);
11346   verifyFormat("#define A                        \\\n"
11347                "\tvoid f() {               \\\n"
11348                "\t\tsomeFunction(    \\\n"
11349                "\t\t    parameter1,  \\\n"
11350                "\t\t    parameter2); \\\n"
11351                "\t}",
11352                Tab);
11353   Tab.TabWidth = 4;
11354   Tab.IndentWidth = 8;
11355   verifyFormat("class TabWidth4Indent8 {\n"
11356                "\t\tvoid f() {\n"
11357                "\t\t\t\tsomeFunction(parameter1,\n"
11358                "\t\t\t\t             parameter2);\n"
11359                "\t\t}\n"
11360                "};",
11361                Tab);
11362   Tab.TabWidth = 4;
11363   Tab.IndentWidth = 4;
11364   verifyFormat("class TabWidth4Indent4 {\n"
11365                "\tvoid f() {\n"
11366                "\t\tsomeFunction(parameter1,\n"
11367                "\t\t             parameter2);\n"
11368                "\t}\n"
11369                "};",
11370                Tab);
11371   Tab.TabWidth = 8;
11372   Tab.IndentWidth = 4;
11373   verifyFormat("class TabWidth8Indent4 {\n"
11374                "    void f() {\n"
11375                "\tsomeFunction(parameter1,\n"
11376                "\t             parameter2);\n"
11377                "    }\n"
11378                "};",
11379                Tab);
11380   Tab.TabWidth = 8;
11381   Tab.IndentWidth = 8;
11382   EXPECT_EQ("/*\n"
11383             "              a\t\tcomment\n"
11384             "              in multiple lines\n"
11385             "       */",
11386             format("   /*\t \t \n"
11387                    " \t \t a\t\tcomment\t \t\n"
11388                    " \t \t in multiple lines\t\n"
11389                    " \t  */",
11390                    Tab));
11391   verifyFormat("{\n"
11392                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11393                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11394                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11395                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11396                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11397                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
11398                "};",
11399                Tab);
11400   verifyFormat("enum AA {\n"
11401                "\ta1, // Force multiple lines\n"
11402                "\ta2,\n"
11403                "\ta3\n"
11404                "};",
11405                Tab);
11406   EXPECT_EQ("if (aaaaaaaa && // q\n"
11407             "    bb)         // w\n"
11408             "\t;",
11409             format("if (aaaaaaaa &&// q\n"
11410                    "bb)// w\n"
11411                    ";",
11412                    Tab));
11413   verifyFormat("class X {\n"
11414                "\tvoid f() {\n"
11415                "\t\tsomeFunction(parameter1,\n"
11416                "\t\t             parameter2);\n"
11417                "\t}\n"
11418                "};",
11419                Tab);
11420   verifyFormat("{\n"
11421                "\tQ(\n"
11422                "\t    {\n"
11423                "\t\t    int a;\n"
11424                "\t\t    someFunction(aaaaaaaa,\n"
11425                "\t\t                 bbbbbbb);\n"
11426                "\t    },\n"
11427                "\t    p);\n"
11428                "}",
11429                Tab);
11430   EXPECT_EQ("{\n"
11431             "\t/* aaaa\n"
11432             "\t   bbbb */\n"
11433             "}",
11434             format("{\n"
11435                    "/* aaaa\n"
11436                    "   bbbb */\n"
11437                    "}",
11438                    Tab));
11439   EXPECT_EQ("{\n"
11440             "\t/*\n"
11441             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
11442             "\t  bbbbbbbbbbbbb\n"
11443             "\t*/\n"
11444             "}",
11445             format("{\n"
11446                    "/*\n"
11447                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
11448                    "*/\n"
11449                    "}",
11450                    Tab));
11451   EXPECT_EQ("{\n"
11452             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
11453             "\t// bbbbbbbbbbbbb\n"
11454             "}",
11455             format("{\n"
11456                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
11457                    "}",
11458                    Tab));
11459   EXPECT_EQ("{\n"
11460             "\t/*\n"
11461             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
11462             "\t  bbbbbbbbbbbbb\n"
11463             "\t*/\n"
11464             "}",
11465             format("{\n"
11466                    "\t/*\n"
11467                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
11468                    "\t*/\n"
11469                    "}",
11470                    Tab));
11471   EXPECT_EQ("{\n"
11472             "\t/*\n"
11473             "\n"
11474             "\t*/\n"
11475             "}",
11476             format("{\n"
11477                    "\t/*\n"
11478                    "\n"
11479                    "\t*/\n"
11480                    "}",
11481                    Tab));
11482   EXPECT_EQ("{\n"
11483             "\t/*\n"
11484             " asdf\n"
11485             "\t*/\n"
11486             "}",
11487             format("{\n"
11488                    "\t/*\n"
11489                    " asdf\n"
11490                    "\t*/\n"
11491                    "}",
11492                    Tab));
11493   EXPECT_EQ("/* some\n"
11494             "   comment */",
11495             format(" \t \t /* some\n"
11496                    " \t \t    comment */",
11497                    Tab));
11498   EXPECT_EQ("int a; /* some\n"
11499             "   comment */",
11500             format(" \t \t int a; /* some\n"
11501                    " \t \t    comment */",
11502                    Tab));
11503   EXPECT_EQ("int a; /* some\n"
11504             "comment */",
11505             format(" \t \t int\ta; /* some\n"
11506                    " \t \t    comment */",
11507                    Tab));
11508   EXPECT_EQ("f(\"\t\t\"); /* some\n"
11509             "    comment */",
11510             format(" \t \t f(\"\t\t\"); /* some\n"
11511                    " \t \t    comment */",
11512                    Tab));
11513   EXPECT_EQ("{\n"
11514             "\t/*\n"
11515             "\t * Comment\n"
11516             "\t */\n"
11517             "\tint i;\n"
11518             "}",
11519             format("{\n"
11520                    "\t/*\n"
11521                    "\t * Comment\n"
11522                    "\t */\n"
11523                    "\t int i;\n"
11524                    "}",
11525                    Tab));
11526   Tab.TabWidth = 2;
11527   Tab.IndentWidth = 2;
11528   EXPECT_EQ("{\n"
11529             "\t/* aaaa\n"
11530             "\t   bbbb */\n"
11531             "}",
11532             format("{\n"
11533                    "/* aaaa\n"
11534                    "   bbbb */\n"
11535                    "}",
11536                    Tab));
11537   EXPECT_EQ("{\n"
11538             "\t/*\n"
11539             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
11540             "\t  bbbbbbbbbbbbb\n"
11541             "\t*/\n"
11542             "}",
11543             format("{\n"
11544                    "/*\n"
11545                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
11546                    "*/\n"
11547                    "}",
11548                    Tab));
11549   Tab.AlignConsecutiveAssignments = true;
11550   Tab.AlignConsecutiveDeclarations = true;
11551   Tab.TabWidth = 4;
11552   Tab.IndentWidth = 4;
11553   verifyFormat("class Assign {\n"
11554                "\tvoid f() {\n"
11555                "\t\tint         x      = 123;\n"
11556                "\t\tint         random = 4;\n"
11557                "\t\tstd::string alphabet =\n"
11558                "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
11559                "\t}\n"
11560                "};",
11561                Tab);
11562   Tab.AlignOperands = FormatStyle::OAS_Align;
11563   verifyFormat("int aaaaaaaaaa = bbbbbbbbbbbbbbbbbbbb +\n"
11564                "                 cccccccccccccccccccc;",
11565                Tab);
11566   // no alignment
11567   verifyFormat("int aaaaaaaaaa =\n"
11568                "\tbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
11569                Tab);
11570   verifyFormat("return aaaaaaaaaaaaaaaa ? 111111111111111\n"
11571                "       : bbbbbbbbbbbbbb ? 222222222222222\n"
11572                "                        : 333333333333333;",
11573                Tab);
11574   Tab.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
11575   Tab.AlignOperands = FormatStyle::OAS_AlignAfterOperator;
11576   verifyFormat("int aaaaaaaaaa = bbbbbbbbbbbbbbbbbbbb\n"
11577                "               + cccccccccccccccccccc;",
11578                Tab);
11579 }
11580 
11581 TEST_F(FormatTest, ZeroTabWidth) {
11582   FormatStyle Tab = getLLVMStyleWithColumns(42);
11583   Tab.IndentWidth = 8;
11584   Tab.UseTab = FormatStyle::UT_Never;
11585   Tab.TabWidth = 0;
11586   EXPECT_EQ("void a(){\n"
11587             "    // line starts with '\t'\n"
11588             "};",
11589             format("void a(){\n"
11590                    "\t// line starts with '\t'\n"
11591                    "};",
11592                    Tab));
11593 
11594   EXPECT_EQ("void a(){\n"
11595             "    // line starts with '\t'\n"
11596             "};",
11597             format("void a(){\n"
11598                    "\t\t// line starts with '\t'\n"
11599                    "};",
11600                    Tab));
11601 
11602   Tab.UseTab = FormatStyle::UT_ForIndentation;
11603   EXPECT_EQ("void a(){\n"
11604             "    // line starts with '\t'\n"
11605             "};",
11606             format("void a(){\n"
11607                    "\t// line starts with '\t'\n"
11608                    "};",
11609                    Tab));
11610 
11611   EXPECT_EQ("void a(){\n"
11612             "    // line starts with '\t'\n"
11613             "};",
11614             format("void a(){\n"
11615                    "\t\t// line starts with '\t'\n"
11616                    "};",
11617                    Tab));
11618 
11619   Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
11620   EXPECT_EQ("void a(){\n"
11621             "    // line starts with '\t'\n"
11622             "};",
11623             format("void a(){\n"
11624                    "\t// line starts with '\t'\n"
11625                    "};",
11626                    Tab));
11627 
11628   EXPECT_EQ("void a(){\n"
11629             "    // line starts with '\t'\n"
11630             "};",
11631             format("void a(){\n"
11632                    "\t\t// line starts with '\t'\n"
11633                    "};",
11634                    Tab));
11635 
11636   Tab.UseTab = FormatStyle::UT_AlignWithSpaces;
11637   EXPECT_EQ("void a(){\n"
11638             "    // line starts with '\t'\n"
11639             "};",
11640             format("void a(){\n"
11641                    "\t// line starts with '\t'\n"
11642                    "};",
11643                    Tab));
11644 
11645   EXPECT_EQ("void a(){\n"
11646             "    // line starts with '\t'\n"
11647             "};",
11648             format("void a(){\n"
11649                    "\t\t// line starts with '\t'\n"
11650                    "};",
11651                    Tab));
11652 
11653   Tab.UseTab = FormatStyle::UT_Always;
11654   EXPECT_EQ("void a(){\n"
11655             "// line starts with '\t'\n"
11656             "};",
11657             format("void a(){\n"
11658                    "\t// line starts with '\t'\n"
11659                    "};",
11660                    Tab));
11661 
11662   EXPECT_EQ("void a(){\n"
11663             "// line starts with '\t'\n"
11664             "};",
11665             format("void a(){\n"
11666                    "\t\t// line starts with '\t'\n"
11667                    "};",
11668                    Tab));
11669 }
11670 
11671 TEST_F(FormatTest, CalculatesOriginalColumn) {
11672   EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
11673             "q\"; /* some\n"
11674             "       comment */",
11675             format("  \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
11676                    "q\"; /* some\n"
11677                    "       comment */",
11678                    getLLVMStyle()));
11679   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
11680             "/* some\n"
11681             "   comment */",
11682             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
11683                    " /* some\n"
11684                    "    comment */",
11685                    getLLVMStyle()));
11686   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
11687             "qqq\n"
11688             "/* some\n"
11689             "   comment */",
11690             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
11691                    "qqq\n"
11692                    " /* some\n"
11693                    "    comment */",
11694                    getLLVMStyle()));
11695   EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
11696             "wwww; /* some\n"
11697             "         comment */",
11698             format("  inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
11699                    "wwww; /* some\n"
11700                    "         comment */",
11701                    getLLVMStyle()));
11702 }
11703 
11704 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
11705   FormatStyle NoSpace = getLLVMStyle();
11706   NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
11707 
11708   verifyFormat("while(true)\n"
11709                "  continue;",
11710                NoSpace);
11711   verifyFormat("for(;;)\n"
11712                "  continue;",
11713                NoSpace);
11714   verifyFormat("if(true)\n"
11715                "  f();\n"
11716                "else if(true)\n"
11717                "  f();",
11718                NoSpace);
11719   verifyFormat("do {\n"
11720                "  do_something();\n"
11721                "} while(something());",
11722                NoSpace);
11723   verifyFormat("switch(x) {\n"
11724                "default:\n"
11725                "  break;\n"
11726                "}",
11727                NoSpace);
11728   verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
11729   verifyFormat("size_t x = sizeof(x);", NoSpace);
11730   verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
11731   verifyFormat("auto f(int x) -> typeof(x);", NoSpace);
11732   verifyFormat("auto f(int x) -> _Atomic(x);", NoSpace);
11733   verifyFormat("auto f(int x) -> __underlying_type(x);", NoSpace);
11734   verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
11735   verifyFormat("alignas(128) char a[128];", NoSpace);
11736   verifyFormat("size_t x = alignof(MyType);", NoSpace);
11737   verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
11738   verifyFormat("int f() throw(Deprecated);", NoSpace);
11739   verifyFormat("typedef void (*cb)(int);", NoSpace);
11740   verifyFormat("T A::operator()();", NoSpace);
11741   verifyFormat("X A::operator++(T);", NoSpace);
11742   verifyFormat("auto lambda = []() { return 0; };", NoSpace);
11743 
11744   FormatStyle Space = getLLVMStyle();
11745   Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
11746 
11747   verifyFormat("int f ();", Space);
11748   verifyFormat("void f (int a, T b) {\n"
11749                "  while (true)\n"
11750                "    continue;\n"
11751                "}",
11752                Space);
11753   verifyFormat("if (true)\n"
11754                "  f ();\n"
11755                "else if (true)\n"
11756                "  f ();",
11757                Space);
11758   verifyFormat("do {\n"
11759                "  do_something ();\n"
11760                "} while (something ());",
11761                Space);
11762   verifyFormat("switch (x) {\n"
11763                "default:\n"
11764                "  break;\n"
11765                "}",
11766                Space);
11767   verifyFormat("A::A () : a (1) {}", Space);
11768   verifyFormat("void f () __attribute__ ((asdf));", Space);
11769   verifyFormat("*(&a + 1);\n"
11770                "&((&a)[1]);\n"
11771                "a[(b + c) * d];\n"
11772                "(((a + 1) * 2) + 3) * 4;",
11773                Space);
11774   verifyFormat("#define A(x) x", Space);
11775   verifyFormat("#define A (x) x", Space);
11776   verifyFormat("#if defined(x)\n"
11777                "#endif",
11778                Space);
11779   verifyFormat("auto i = std::make_unique<int> (5);", Space);
11780   verifyFormat("size_t x = sizeof (x);", Space);
11781   verifyFormat("auto f (int x) -> decltype (x);", Space);
11782   verifyFormat("auto f (int x) -> typeof (x);", Space);
11783   verifyFormat("auto f (int x) -> _Atomic (x);", Space);
11784   verifyFormat("auto f (int x) -> __underlying_type (x);", Space);
11785   verifyFormat("int f (T x) noexcept (x.create ());", Space);
11786   verifyFormat("alignas (128) char a[128];", Space);
11787   verifyFormat("size_t x = alignof (MyType);", Space);
11788   verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
11789   verifyFormat("int f () throw (Deprecated);", Space);
11790   verifyFormat("typedef void (*cb) (int);", Space);
11791   verifyFormat("T A::operator() ();", Space);
11792   verifyFormat("X A::operator++ (T);", Space);
11793   verifyFormat("auto lambda = [] () { return 0; };", Space);
11794   verifyFormat("int x = int (y);", Space);
11795 
11796   FormatStyle SomeSpace = getLLVMStyle();
11797   SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses;
11798 
11799   verifyFormat("[]() -> float {}", SomeSpace);
11800   verifyFormat("[] (auto foo) {}", SomeSpace);
11801   verifyFormat("[foo]() -> int {}", SomeSpace);
11802   verifyFormat("int f();", SomeSpace);
11803   verifyFormat("void f (int a, T b) {\n"
11804                "  while (true)\n"
11805                "    continue;\n"
11806                "}",
11807                SomeSpace);
11808   verifyFormat("if (true)\n"
11809                "  f();\n"
11810                "else if (true)\n"
11811                "  f();",
11812                SomeSpace);
11813   verifyFormat("do {\n"
11814                "  do_something();\n"
11815                "} while (something());",
11816                SomeSpace);
11817   verifyFormat("switch (x) {\n"
11818                "default:\n"
11819                "  break;\n"
11820                "}",
11821                SomeSpace);
11822   verifyFormat("A::A() : a (1) {}", SomeSpace);
11823   verifyFormat("void f() __attribute__ ((asdf));", SomeSpace);
11824   verifyFormat("*(&a + 1);\n"
11825                "&((&a)[1]);\n"
11826                "a[(b + c) * d];\n"
11827                "(((a + 1) * 2) + 3) * 4;",
11828                SomeSpace);
11829   verifyFormat("#define A(x) x", SomeSpace);
11830   verifyFormat("#define A (x) x", SomeSpace);
11831   verifyFormat("#if defined(x)\n"
11832                "#endif",
11833                SomeSpace);
11834   verifyFormat("auto i = std::make_unique<int> (5);", SomeSpace);
11835   verifyFormat("size_t x = sizeof (x);", SomeSpace);
11836   verifyFormat("auto f (int x) -> decltype (x);", SomeSpace);
11837   verifyFormat("auto f (int x) -> typeof (x);", SomeSpace);
11838   verifyFormat("auto f (int x) -> _Atomic (x);", SomeSpace);
11839   verifyFormat("auto f (int x) -> __underlying_type (x);", SomeSpace);
11840   verifyFormat("int f (T x) noexcept (x.create());", SomeSpace);
11841   verifyFormat("alignas (128) char a[128];", SomeSpace);
11842   verifyFormat("size_t x = alignof (MyType);", SomeSpace);
11843   verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");",
11844                SomeSpace);
11845   verifyFormat("int f() throw (Deprecated);", SomeSpace);
11846   verifyFormat("typedef void (*cb) (int);", SomeSpace);
11847   verifyFormat("T A::operator()();", SomeSpace);
11848   verifyFormat("X A::operator++ (T);", SomeSpace);
11849   verifyFormat("int x = int (y);", SomeSpace);
11850   verifyFormat("auto lambda = []() { return 0; };", SomeSpace);
11851 }
11852 
11853 TEST_F(FormatTest, SpaceAfterLogicalNot) {
11854   FormatStyle Spaces = getLLVMStyle();
11855   Spaces.SpaceAfterLogicalNot = true;
11856 
11857   verifyFormat("bool x = ! y", Spaces);
11858   verifyFormat("if (! isFailure())", Spaces);
11859   verifyFormat("if (! (a && b))", Spaces);
11860   verifyFormat("\"Error!\"", Spaces);
11861   verifyFormat("! ! x", Spaces);
11862 }
11863 
11864 TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
11865   FormatStyle Spaces = getLLVMStyle();
11866 
11867   Spaces.SpacesInParentheses = true;
11868   verifyFormat("do_something( ::globalVar );", Spaces);
11869   verifyFormat("call( x, y, z );", Spaces);
11870   verifyFormat("call();", Spaces);
11871   verifyFormat("std::function<void( int, int )> callback;", Spaces);
11872   verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
11873                Spaces);
11874   verifyFormat("while ( (bool)1 )\n"
11875                "  continue;",
11876                Spaces);
11877   verifyFormat("for ( ;; )\n"
11878                "  continue;",
11879                Spaces);
11880   verifyFormat("if ( true )\n"
11881                "  f();\n"
11882                "else if ( true )\n"
11883                "  f();",
11884                Spaces);
11885   verifyFormat("do {\n"
11886                "  do_something( (int)i );\n"
11887                "} while ( something() );",
11888                Spaces);
11889   verifyFormat("switch ( x ) {\n"
11890                "default:\n"
11891                "  break;\n"
11892                "}",
11893                Spaces);
11894 
11895   Spaces.SpacesInParentheses = false;
11896   Spaces.SpacesInCStyleCastParentheses = true;
11897   verifyFormat("Type *A = ( Type * )P;", Spaces);
11898   verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
11899   verifyFormat("x = ( int32 )y;", Spaces);
11900   verifyFormat("int a = ( int )(2.0f);", Spaces);
11901   verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
11902   verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
11903   verifyFormat("#define x (( int )-1)", Spaces);
11904 
11905   // Run the first set of tests again with:
11906   Spaces.SpacesInParentheses = false;
11907   Spaces.SpaceInEmptyParentheses = true;
11908   Spaces.SpacesInCStyleCastParentheses = true;
11909   verifyFormat("call(x, y, z);", Spaces);
11910   verifyFormat("call( );", Spaces);
11911   verifyFormat("std::function<void(int, int)> callback;", Spaces);
11912   verifyFormat("while (( bool )1)\n"
11913                "  continue;",
11914                Spaces);
11915   verifyFormat("for (;;)\n"
11916                "  continue;",
11917                Spaces);
11918   verifyFormat("if (true)\n"
11919                "  f( );\n"
11920                "else if (true)\n"
11921                "  f( );",
11922                Spaces);
11923   verifyFormat("do {\n"
11924                "  do_something(( int )i);\n"
11925                "} while (something( ));",
11926                Spaces);
11927   verifyFormat("switch (x) {\n"
11928                "default:\n"
11929                "  break;\n"
11930                "}",
11931                Spaces);
11932 
11933   // Run the first set of tests again with:
11934   Spaces.SpaceAfterCStyleCast = true;
11935   verifyFormat("call(x, y, z);", Spaces);
11936   verifyFormat("call( );", Spaces);
11937   verifyFormat("std::function<void(int, int)> callback;", Spaces);
11938   verifyFormat("while (( bool ) 1)\n"
11939                "  continue;",
11940                Spaces);
11941   verifyFormat("for (;;)\n"
11942                "  continue;",
11943                Spaces);
11944   verifyFormat("if (true)\n"
11945                "  f( );\n"
11946                "else if (true)\n"
11947                "  f( );",
11948                Spaces);
11949   verifyFormat("do {\n"
11950                "  do_something(( int ) i);\n"
11951                "} while (something( ));",
11952                Spaces);
11953   verifyFormat("switch (x) {\n"
11954                "default:\n"
11955                "  break;\n"
11956                "}",
11957                Spaces);
11958 
11959   // Run subset of tests again with:
11960   Spaces.SpacesInCStyleCastParentheses = false;
11961   Spaces.SpaceAfterCStyleCast = true;
11962   verifyFormat("while ((bool) 1)\n"
11963                "  continue;",
11964                Spaces);
11965   verifyFormat("do {\n"
11966                "  do_something((int) i);\n"
11967                "} while (something( ));",
11968                Spaces);
11969 }
11970 
11971 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
11972   verifyFormat("int a[5];");
11973   verifyFormat("a[3] += 42;");
11974 
11975   FormatStyle Spaces = getLLVMStyle();
11976   Spaces.SpacesInSquareBrackets = true;
11977   // Not lambdas.
11978   verifyFormat("int a[ 5 ];", Spaces);
11979   verifyFormat("a[ 3 ] += 42;", Spaces);
11980   verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
11981   verifyFormat("double &operator[](int i) { return 0; }\n"
11982                "int i;",
11983                Spaces);
11984   verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
11985   verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
11986   verifyFormat("int i = (*b)[ a ]->f();", Spaces);
11987   // Lambdas.
11988   verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
11989   verifyFormat("return [ i, args... ] {};", Spaces);
11990   verifyFormat("int foo = [ &bar ]() {};", Spaces);
11991   verifyFormat("int foo = [ = ]() {};", Spaces);
11992   verifyFormat("int foo = [ & ]() {};", Spaces);
11993   verifyFormat("int foo = [ =, &bar ]() {};", Spaces);
11994   verifyFormat("int foo = [ &bar, = ]() {};", Spaces);
11995 }
11996 
11997 TEST_F(FormatTest, ConfigurableSpaceBeforeBrackets) {
11998   FormatStyle NoSpaceStyle = getLLVMStyle();
11999   verifyFormat("int a[5];", NoSpaceStyle);
12000   verifyFormat("a[3] += 42;", NoSpaceStyle);
12001 
12002   verifyFormat("int a[1];", NoSpaceStyle);
12003   verifyFormat("int 1 [a];", NoSpaceStyle);
12004   verifyFormat("int a[1][2];", NoSpaceStyle);
12005   verifyFormat("a[7] = 5;", NoSpaceStyle);
12006   verifyFormat("int a = (f())[23];", NoSpaceStyle);
12007   verifyFormat("f([] {})", NoSpaceStyle);
12008 
12009   FormatStyle Space = getLLVMStyle();
12010   Space.SpaceBeforeSquareBrackets = true;
12011   verifyFormat("int c = []() -> int { return 2; }();\n", Space);
12012   verifyFormat("return [i, args...] {};", Space);
12013 
12014   verifyFormat("int a [5];", Space);
12015   verifyFormat("a [3] += 42;", Space);
12016   verifyFormat("constexpr char hello []{\"hello\"};", Space);
12017   verifyFormat("double &operator[](int i) { return 0; }\n"
12018                "int i;",
12019                Space);
12020   verifyFormat("std::unique_ptr<int []> foo() {}", Space);
12021   verifyFormat("int i = a [a][a]->f();", Space);
12022   verifyFormat("int i = (*b) [a]->f();", Space);
12023 
12024   verifyFormat("int a [1];", Space);
12025   verifyFormat("int 1 [a];", Space);
12026   verifyFormat("int a [1][2];", Space);
12027   verifyFormat("a [7] = 5;", Space);
12028   verifyFormat("int a = (f()) [23];", Space);
12029   verifyFormat("f([] {})", Space);
12030 }
12031 
12032 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
12033   verifyFormat("int a = 5;");
12034   verifyFormat("a += 42;");
12035   verifyFormat("a or_eq 8;");
12036 
12037   FormatStyle Spaces = getLLVMStyle();
12038   Spaces.SpaceBeforeAssignmentOperators = false;
12039   verifyFormat("int a= 5;", Spaces);
12040   verifyFormat("a+= 42;", Spaces);
12041   verifyFormat("a or_eq 8;", Spaces);
12042 }
12043 
12044 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
12045   verifyFormat("class Foo : public Bar {};");
12046   verifyFormat("Foo::Foo() : foo(1) {}");
12047   verifyFormat("for (auto a : b) {\n}");
12048   verifyFormat("int x = a ? b : c;");
12049   verifyFormat("{\n"
12050                "label0:\n"
12051                "  int x = 0;\n"
12052                "}");
12053   verifyFormat("switch (x) {\n"
12054                "case 1:\n"
12055                "default:\n"
12056                "}");
12057 
12058   FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30);
12059   CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false;
12060   verifyFormat("class Foo : public Bar {};", CtorInitializerStyle);
12061   verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle);
12062   verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle);
12063   verifyFormat("int x = a ? b : c;", CtorInitializerStyle);
12064   verifyFormat("{\n"
12065                "label1:\n"
12066                "  int x = 0;\n"
12067                "}",
12068                CtorInitializerStyle);
12069   verifyFormat("switch (x) {\n"
12070                "case 1:\n"
12071                "default:\n"
12072                "}",
12073                CtorInitializerStyle);
12074   CtorInitializerStyle.BreakConstructorInitializers =
12075       FormatStyle::BCIS_AfterColon;
12076   verifyFormat("Fooooooooooo::Fooooooooooo():\n"
12077                "    aaaaaaaaaaaaaaaa(1),\n"
12078                "    bbbbbbbbbbbbbbbb(2) {}",
12079                CtorInitializerStyle);
12080   CtorInitializerStyle.BreakConstructorInitializers =
12081       FormatStyle::BCIS_BeforeComma;
12082   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
12083                "    : aaaaaaaaaaaaaaaa(1)\n"
12084                "    , bbbbbbbbbbbbbbbb(2) {}",
12085                CtorInitializerStyle);
12086   CtorInitializerStyle.BreakConstructorInitializers =
12087       FormatStyle::BCIS_BeforeColon;
12088   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
12089                "    : aaaaaaaaaaaaaaaa(1),\n"
12090                "      bbbbbbbbbbbbbbbb(2) {}",
12091                CtorInitializerStyle);
12092   CtorInitializerStyle.ConstructorInitializerIndentWidth = 0;
12093   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
12094                ": aaaaaaaaaaaaaaaa(1),\n"
12095                "  bbbbbbbbbbbbbbbb(2) {}",
12096                CtorInitializerStyle);
12097 
12098   FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30);
12099   InheritanceStyle.SpaceBeforeInheritanceColon = false;
12100   verifyFormat("class Foo: public Bar {};", InheritanceStyle);
12101   verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle);
12102   verifyFormat("for (auto a : b) {\n}", InheritanceStyle);
12103   verifyFormat("int x = a ? b : c;", InheritanceStyle);
12104   verifyFormat("{\n"
12105                "label2:\n"
12106                "  int x = 0;\n"
12107                "}",
12108                InheritanceStyle);
12109   verifyFormat("switch (x) {\n"
12110                "case 1:\n"
12111                "default:\n"
12112                "}",
12113                InheritanceStyle);
12114   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon;
12115   verifyFormat("class Foooooooooooooooooooooo:\n"
12116                "    public aaaaaaaaaaaaaaaaaa,\n"
12117                "    public bbbbbbbbbbbbbbbbbb {\n"
12118                "}",
12119                InheritanceStyle);
12120   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
12121   verifyFormat("class Foooooooooooooooooooooo\n"
12122                "    : public aaaaaaaaaaaaaaaaaa\n"
12123                "    , public bbbbbbbbbbbbbbbbbb {\n"
12124                "}",
12125                InheritanceStyle);
12126   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
12127   verifyFormat("class Foooooooooooooooooooooo\n"
12128                "    : public aaaaaaaaaaaaaaaaaa,\n"
12129                "      public bbbbbbbbbbbbbbbbbb {\n"
12130                "}",
12131                InheritanceStyle);
12132   InheritanceStyle.ConstructorInitializerIndentWidth = 0;
12133   verifyFormat("class Foooooooooooooooooooooo\n"
12134                ": public aaaaaaaaaaaaaaaaaa,\n"
12135                "  public bbbbbbbbbbbbbbbbbb {}",
12136                InheritanceStyle);
12137 
12138   FormatStyle ForLoopStyle = getLLVMStyle();
12139   ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false;
12140   verifyFormat("class Foo : public Bar {};", ForLoopStyle);
12141   verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle);
12142   verifyFormat("for (auto a: b) {\n}", ForLoopStyle);
12143   verifyFormat("int x = a ? b : c;", ForLoopStyle);
12144   verifyFormat("{\n"
12145                "label2:\n"
12146                "  int x = 0;\n"
12147                "}",
12148                ForLoopStyle);
12149   verifyFormat("switch (x) {\n"
12150                "case 1:\n"
12151                "default:\n"
12152                "}",
12153                ForLoopStyle);
12154 
12155   FormatStyle NoSpaceStyle = getLLVMStyle();
12156   NoSpaceStyle.SpaceBeforeCtorInitializerColon = false;
12157   NoSpaceStyle.SpaceBeforeInheritanceColon = false;
12158   NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false;
12159   verifyFormat("class Foo: public Bar {};", NoSpaceStyle);
12160   verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle);
12161   verifyFormat("for (auto a: b) {\n}", NoSpaceStyle);
12162   verifyFormat("int x = a ? b : c;", NoSpaceStyle);
12163   verifyFormat("{\n"
12164                "label3:\n"
12165                "  int x = 0;\n"
12166                "}",
12167                NoSpaceStyle);
12168   verifyFormat("switch (x) {\n"
12169                "case 1:\n"
12170                "default:\n"
12171                "}",
12172                NoSpaceStyle);
12173 }
12174 
12175 TEST_F(FormatTest, ConfigurableSpaceAroundPointerQualifiers) {
12176   FormatStyle Style = getLLVMStyle();
12177 
12178   Style.PointerAlignment = FormatStyle::PAS_Left;
12179   Style.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Default;
12180   verifyFormat("void* const* x = NULL;", Style);
12181 
12182 #define verifyQualifierSpaces(Code, Pointers, Qualifiers)                      \
12183   do {                                                                         \
12184     Style.PointerAlignment = FormatStyle::Pointers;                            \
12185     Style.SpaceAroundPointerQualifiers = FormatStyle::Qualifiers;              \
12186     verifyFormat(Code, Style);                                                 \
12187   } while (false)
12188 
12189   verifyQualifierSpaces("void* const* x = NULL;", PAS_Left, SAPQ_Default);
12190   verifyQualifierSpaces("void *const *x = NULL;", PAS_Right, SAPQ_Default);
12191   verifyQualifierSpaces("void * const * x = NULL;", PAS_Middle, SAPQ_Default);
12192 
12193   verifyQualifierSpaces("void* const* x = NULL;", PAS_Left, SAPQ_Before);
12194   verifyQualifierSpaces("void * const *x = NULL;", PAS_Right, SAPQ_Before);
12195   verifyQualifierSpaces("void * const * x = NULL;", PAS_Middle, SAPQ_Before);
12196 
12197   verifyQualifierSpaces("void* const * x = NULL;", PAS_Left, SAPQ_After);
12198   verifyQualifierSpaces("void *const *x = NULL;", PAS_Right, SAPQ_After);
12199   verifyQualifierSpaces("void * const * x = NULL;", PAS_Middle, SAPQ_After);
12200 
12201   verifyQualifierSpaces("void* const * x = NULL;", PAS_Left, SAPQ_Both);
12202   verifyQualifierSpaces("void * const *x = NULL;", PAS_Right, SAPQ_Both);
12203   verifyQualifierSpaces("void * const * x = NULL;", PAS_Middle, SAPQ_Both);
12204 
12205 #undef verifyQualifierSpaces
12206 
12207   FormatStyle Spaces = getLLVMStyle();
12208   Spaces.AttributeMacros.push_back("qualified");
12209   Spaces.PointerAlignment = FormatStyle::PAS_Right;
12210   Spaces.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Default;
12211   verifyFormat("SomeType *volatile *a = NULL;", Spaces);
12212   verifyFormat("SomeType *__attribute__((attr)) *a = NULL;", Spaces);
12213   verifyFormat("std::vector<SomeType *const *> x;", Spaces);
12214   verifyFormat("std::vector<SomeType *qualified *> x;", Spaces);
12215   verifyFormat("std::vector<SomeVar * NotAQualifier> x;", Spaces);
12216   Spaces.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Before;
12217   verifyFormat("SomeType * volatile *a = NULL;", Spaces);
12218   verifyFormat("SomeType * __attribute__((attr)) *a = NULL;", Spaces);
12219   verifyFormat("std::vector<SomeType * const *> x;", Spaces);
12220   verifyFormat("std::vector<SomeType * qualified *> x;", Spaces);
12221   verifyFormat("std::vector<SomeVar * NotAQualifier> x;", Spaces);
12222 
12223   // Check that SAPQ_Before doesn't result in extra spaces for PAS_Left.
12224   Spaces.PointerAlignment = FormatStyle::PAS_Left;
12225   Spaces.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Before;
12226   verifyFormat("SomeType* volatile* a = NULL;", Spaces);
12227   verifyFormat("SomeType* __attribute__((attr))* a = NULL;", Spaces);
12228   verifyFormat("std::vector<SomeType* const*> x;", Spaces);
12229   verifyFormat("std::vector<SomeType* qualified*> x;", Spaces);
12230   verifyFormat("std::vector<SomeVar * NotAQualifier> x;", Spaces);
12231   // However, setting it to SAPQ_After should add spaces after __attribute, etc.
12232   Spaces.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_After;
12233   verifyFormat("SomeType* volatile * a = NULL;", Spaces);
12234   verifyFormat("SomeType* __attribute__((attr)) * a = NULL;", Spaces);
12235   verifyFormat("std::vector<SomeType* const *> x;", Spaces);
12236   verifyFormat("std::vector<SomeType* qualified *> x;", Spaces);
12237   verifyFormat("std::vector<SomeVar * NotAQualifier> x;", Spaces);
12238 
12239   // PAS_Middle should not have any noticeable changes even for SAPQ_Both
12240   Spaces.PointerAlignment = FormatStyle::PAS_Middle;
12241   Spaces.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_After;
12242   verifyFormat("SomeType * volatile * a = NULL;", Spaces);
12243   verifyFormat("SomeType * __attribute__((attr)) * a = NULL;", Spaces);
12244   verifyFormat("std::vector<SomeType * const *> x;", Spaces);
12245   verifyFormat("std::vector<SomeType * qualified *> x;", Spaces);
12246   verifyFormat("std::vector<SomeVar * NotAQualifier> x;", Spaces);
12247 }
12248 
12249 TEST_F(FormatTest, AlignConsecutiveMacros) {
12250   FormatStyle Style = getLLVMStyle();
12251   Style.AlignConsecutiveAssignments = true;
12252   Style.AlignConsecutiveDeclarations = true;
12253   Style.AlignConsecutiveMacros = false;
12254 
12255   verifyFormat("#define a 3\n"
12256                "#define bbbb 4\n"
12257                "#define ccc (5)",
12258                Style);
12259 
12260   verifyFormat("#define f(x) (x * x)\n"
12261                "#define fff(x, y, z) (x * y + z)\n"
12262                "#define ffff(x, y) (x - y)",
12263                Style);
12264 
12265   verifyFormat("#define foo(x, y) (x + y)\n"
12266                "#define bar (5, 6)(2 + 2)",
12267                Style);
12268 
12269   verifyFormat("#define a 3\n"
12270                "#define bbbb 4\n"
12271                "#define ccc (5)\n"
12272                "#define f(x) (x * x)\n"
12273                "#define fff(x, y, z) (x * y + z)\n"
12274                "#define ffff(x, y) (x - y)",
12275                Style);
12276 
12277   Style.AlignConsecutiveMacros = true;
12278   verifyFormat("#define a    3\n"
12279                "#define bbbb 4\n"
12280                "#define ccc  (5)",
12281                Style);
12282 
12283   verifyFormat("#define f(x)         (x * x)\n"
12284                "#define fff(x, y, z) (x * y + z)\n"
12285                "#define ffff(x, y)   (x - y)",
12286                Style);
12287 
12288   verifyFormat("#define foo(x, y) (x + y)\n"
12289                "#define bar       (5, 6)(2 + 2)",
12290                Style);
12291 
12292   verifyFormat("#define a            3\n"
12293                "#define bbbb         4\n"
12294                "#define ccc          (5)\n"
12295                "#define f(x)         (x * x)\n"
12296                "#define fff(x, y, z) (x * y + z)\n"
12297                "#define ffff(x, y)   (x - y)",
12298                Style);
12299 
12300   verifyFormat("#define a         5\n"
12301                "#define foo(x, y) (x + y)\n"
12302                "#define CCC       (6)\n"
12303                "auto lambda = []() {\n"
12304                "  auto  ii = 0;\n"
12305                "  float j  = 0;\n"
12306                "  return 0;\n"
12307                "};\n"
12308                "int   i  = 0;\n"
12309                "float i2 = 0;\n"
12310                "auto  v  = type{\n"
12311                "    i = 1,   //\n"
12312                "    (i = 2), //\n"
12313                "    i = 3    //\n"
12314                "};",
12315                Style);
12316 
12317   Style.AlignConsecutiveMacros = false;
12318   Style.ColumnLimit = 20;
12319 
12320   verifyFormat("#define a          \\\n"
12321                "  \"aabbbbbbbbbbbb\"\n"
12322                "#define D          \\\n"
12323                "  \"aabbbbbbbbbbbb\" \\\n"
12324                "  \"ccddeeeeeeeee\"\n"
12325                "#define B          \\\n"
12326                "  \"QQQQQQQQQQQQQ\"  \\\n"
12327                "  \"FFFFFFFFFFFFF\"  \\\n"
12328                "  \"LLLLLLLL\"\n",
12329                Style);
12330 
12331   Style.AlignConsecutiveMacros = true;
12332   verifyFormat("#define a          \\\n"
12333                "  \"aabbbbbbbbbbbb\"\n"
12334                "#define D          \\\n"
12335                "  \"aabbbbbbbbbbbb\" \\\n"
12336                "  \"ccddeeeeeeeee\"\n"
12337                "#define B          \\\n"
12338                "  \"QQQQQQQQQQQQQ\"  \\\n"
12339                "  \"FFFFFFFFFFFFF\"  \\\n"
12340                "  \"LLLLLLLL\"\n",
12341                Style);
12342 }
12343 
12344 TEST_F(FormatTest, AlignConsecutiveAssignments) {
12345   FormatStyle Alignment = getLLVMStyle();
12346   Alignment.AlignConsecutiveMacros = true;
12347   Alignment.AlignConsecutiveAssignments = false;
12348   verifyFormat("int a = 5;\n"
12349                "int oneTwoThree = 123;",
12350                Alignment);
12351   verifyFormat("int a = 5;\n"
12352                "int oneTwoThree = 123;",
12353                Alignment);
12354 
12355   Alignment.AlignConsecutiveAssignments = true;
12356   verifyFormat("int a           = 5;\n"
12357                "int oneTwoThree = 123;",
12358                Alignment);
12359   verifyFormat("int a           = method();\n"
12360                "int oneTwoThree = 133;",
12361                Alignment);
12362   verifyFormat("a &= 5;\n"
12363                "bcd *= 5;\n"
12364                "ghtyf += 5;\n"
12365                "dvfvdb -= 5;\n"
12366                "a /= 5;\n"
12367                "vdsvsv %= 5;\n"
12368                "sfdbddfbdfbb ^= 5;\n"
12369                "dvsdsv |= 5;\n"
12370                "int dsvvdvsdvvv = 123;",
12371                Alignment);
12372   verifyFormat("int i = 1, j = 10;\n"
12373                "something = 2000;",
12374                Alignment);
12375   verifyFormat("something = 2000;\n"
12376                "int i = 1, j = 10;\n",
12377                Alignment);
12378   verifyFormat("something = 2000;\n"
12379                "another   = 911;\n"
12380                "int i = 1, j = 10;\n"
12381                "oneMore = 1;\n"
12382                "i       = 2;",
12383                Alignment);
12384   verifyFormat("int a   = 5;\n"
12385                "int one = 1;\n"
12386                "method();\n"
12387                "int oneTwoThree = 123;\n"
12388                "int oneTwo      = 12;",
12389                Alignment);
12390   verifyFormat("int oneTwoThree = 123;\n"
12391                "int oneTwo      = 12;\n"
12392                "method();\n",
12393                Alignment);
12394   verifyFormat("int oneTwoThree = 123; // comment\n"
12395                "int oneTwo      = 12;  // comment",
12396                Alignment);
12397 
12398   // Bug 25167
12399   /* Uncomment when fixed
12400     verifyFormat("#if A\n"
12401                  "#else\n"
12402                  "int aaaaaaaa = 12;\n"
12403                  "#endif\n"
12404                  "#if B\n"
12405                  "#else\n"
12406                  "int a = 12;\n"
12407                  "#endif\n",
12408                  Alignment);
12409     verifyFormat("enum foo {\n"
12410                  "#if A\n"
12411                  "#else\n"
12412                  "  aaaaaaaa = 12;\n"
12413                  "#endif\n"
12414                  "#if B\n"
12415                  "#else\n"
12416                  "  a = 12;\n"
12417                  "#endif\n"
12418                  "};\n",
12419                  Alignment);
12420   */
12421 
12422   EXPECT_EQ("int a = 5;\n"
12423             "\n"
12424             "int oneTwoThree = 123;",
12425             format("int a       = 5;\n"
12426                    "\n"
12427                    "int oneTwoThree= 123;",
12428                    Alignment));
12429   EXPECT_EQ("int a   = 5;\n"
12430             "int one = 1;\n"
12431             "\n"
12432             "int oneTwoThree = 123;",
12433             format("int a = 5;\n"
12434                    "int one = 1;\n"
12435                    "\n"
12436                    "int oneTwoThree = 123;",
12437                    Alignment));
12438   EXPECT_EQ("int a   = 5;\n"
12439             "int one = 1;\n"
12440             "\n"
12441             "int oneTwoThree = 123;\n"
12442             "int oneTwo      = 12;",
12443             format("int a = 5;\n"
12444                    "int one = 1;\n"
12445                    "\n"
12446                    "int oneTwoThree = 123;\n"
12447                    "int oneTwo = 12;",
12448                    Alignment));
12449   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
12450   verifyFormat("#define A \\\n"
12451                "  int aaaa       = 12; \\\n"
12452                "  int b          = 23; \\\n"
12453                "  int ccc        = 234; \\\n"
12454                "  int dddddddddd = 2345;",
12455                Alignment);
12456   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
12457   verifyFormat("#define A               \\\n"
12458                "  int aaaa       = 12;  \\\n"
12459                "  int b          = 23;  \\\n"
12460                "  int ccc        = 234; \\\n"
12461                "  int dddddddddd = 2345;",
12462                Alignment);
12463   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
12464   verifyFormat("#define A                                                      "
12465                "                \\\n"
12466                "  int aaaa       = 12;                                         "
12467                "                \\\n"
12468                "  int b          = 23;                                         "
12469                "                \\\n"
12470                "  int ccc        = 234;                                        "
12471                "                \\\n"
12472                "  int dddddddddd = 2345;",
12473                Alignment);
12474   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
12475                "k = 4, int l = 5,\n"
12476                "                  int m = 6) {\n"
12477                "  int j      = 10;\n"
12478                "  otherThing = 1;\n"
12479                "}",
12480                Alignment);
12481   verifyFormat("void SomeFunction(int parameter = 0) {\n"
12482                "  int i   = 1;\n"
12483                "  int j   = 2;\n"
12484                "  int big = 10000;\n"
12485                "}",
12486                Alignment);
12487   verifyFormat("class C {\n"
12488                "public:\n"
12489                "  int i            = 1;\n"
12490                "  virtual void f() = 0;\n"
12491                "};",
12492                Alignment);
12493   verifyFormat("int i = 1;\n"
12494                "if (SomeType t = getSomething()) {\n"
12495                "}\n"
12496                "int j   = 2;\n"
12497                "int big = 10000;",
12498                Alignment);
12499   verifyFormat("int j = 7;\n"
12500                "for (int k = 0; k < N; ++k) {\n"
12501                "}\n"
12502                "int j   = 2;\n"
12503                "int big = 10000;\n"
12504                "}",
12505                Alignment);
12506   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
12507   verifyFormat("int i = 1;\n"
12508                "LooooooooooongType loooooooooooooooooooooongVariable\n"
12509                "    = someLooooooooooooooooongFunction();\n"
12510                "int j = 2;",
12511                Alignment);
12512   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
12513   verifyFormat("int i = 1;\n"
12514                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
12515                "    someLooooooooooooooooongFunction();\n"
12516                "int j = 2;",
12517                Alignment);
12518 
12519   verifyFormat("auto lambda = []() {\n"
12520                "  auto i = 0;\n"
12521                "  return 0;\n"
12522                "};\n"
12523                "int i  = 0;\n"
12524                "auto v = type{\n"
12525                "    i = 1,   //\n"
12526                "    (i = 2), //\n"
12527                "    i = 3    //\n"
12528                "};",
12529                Alignment);
12530 
12531   verifyFormat(
12532       "int i      = 1;\n"
12533       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
12534       "                          loooooooooooooooooooooongParameterB);\n"
12535       "int j      = 2;",
12536       Alignment);
12537 
12538   verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
12539                "          typename B   = very_long_type_name_1,\n"
12540                "          typename T_2 = very_long_type_name_2>\n"
12541                "auto foo() {}\n",
12542                Alignment);
12543   verifyFormat("int a, b = 1;\n"
12544                "int c  = 2;\n"
12545                "int dd = 3;\n",
12546                Alignment);
12547   verifyFormat("int aa       = ((1 > 2) ? 3 : 4);\n"
12548                "float b[1][] = {{3.f}};\n",
12549                Alignment);
12550   verifyFormat("for (int i = 0; i < 1; i++)\n"
12551                "  int x = 1;\n",
12552                Alignment);
12553   verifyFormat("for (i = 0; i < 1; i++)\n"
12554                "  x = 1;\n"
12555                "y = 1;\n",
12556                Alignment);
12557 
12558   Alignment.ReflowComments = true;
12559   Alignment.ColumnLimit = 50;
12560   EXPECT_EQ("int x   = 0;\n"
12561             "int yy  = 1; /// specificlennospace\n"
12562             "int zzz = 2;\n",
12563             format("int x   = 0;\n"
12564                    "int yy  = 1; ///specificlennospace\n"
12565                    "int zzz = 2;\n",
12566                    Alignment));
12567 }
12568 
12569 TEST_F(FormatTest, AlignConsecutiveBitFields) {
12570   FormatStyle Alignment = getLLVMStyle();
12571   Alignment.AlignConsecutiveBitFields = true;
12572   verifyFormat("int const a     : 5;\n"
12573                "int oneTwoThree : 23;",
12574                Alignment);
12575 
12576   // Initializers are allowed starting with c++2a
12577   verifyFormat("int const a     : 5 = 1;\n"
12578                "int oneTwoThree : 23 = 0;",
12579                Alignment);
12580 
12581   Alignment.AlignConsecutiveDeclarations = true;
12582   verifyFormat("int const a           : 5;\n"
12583                "int       oneTwoThree : 23;",
12584                Alignment);
12585 
12586   verifyFormat("int const a           : 5;  // comment\n"
12587                "int       oneTwoThree : 23; // comment",
12588                Alignment);
12589 
12590   verifyFormat("int const a           : 5 = 1;\n"
12591                "int       oneTwoThree : 23 = 0;",
12592                Alignment);
12593 
12594   Alignment.AlignConsecutiveAssignments = true;
12595   verifyFormat("int const a           : 5  = 1;\n"
12596                "int       oneTwoThree : 23 = 0;",
12597                Alignment);
12598   verifyFormat("int const a           : 5  = {1};\n"
12599                "int       oneTwoThree : 23 = 0;",
12600                Alignment);
12601 
12602   Alignment.BitFieldColonSpacing = FormatStyle::BFCS_None;
12603   verifyFormat("int const a          :5;\n"
12604                "int       oneTwoThree:23;",
12605                Alignment);
12606 
12607   Alignment.BitFieldColonSpacing = FormatStyle::BFCS_Before;
12608   verifyFormat("int const a           :5;\n"
12609                "int       oneTwoThree :23;",
12610                Alignment);
12611 
12612   Alignment.BitFieldColonSpacing = FormatStyle::BFCS_After;
12613   verifyFormat("int const a          : 5;\n"
12614                "int       oneTwoThree: 23;",
12615                Alignment);
12616 
12617   // Known limitations: ':' is only recognized as a bitfield colon when
12618   // followed by a number.
12619   /*
12620   verifyFormat("int oneTwoThree : SOME_CONSTANT;\n"
12621                "int a           : 5;",
12622                Alignment);
12623   */
12624 }
12625 
12626 TEST_F(FormatTest, AlignConsecutiveDeclarations) {
12627   FormatStyle Alignment = getLLVMStyle();
12628   Alignment.AlignConsecutiveMacros = true;
12629   Alignment.AlignConsecutiveDeclarations = false;
12630   verifyFormat("float const a = 5;\n"
12631                "int oneTwoThree = 123;",
12632                Alignment);
12633   verifyFormat("int a = 5;\n"
12634                "float const oneTwoThree = 123;",
12635                Alignment);
12636 
12637   Alignment.AlignConsecutiveDeclarations = true;
12638   verifyFormat("float const a = 5;\n"
12639                "int         oneTwoThree = 123;",
12640                Alignment);
12641   verifyFormat("int         a = method();\n"
12642                "float const oneTwoThree = 133;",
12643                Alignment);
12644   verifyFormat("int i = 1, j = 10;\n"
12645                "something = 2000;",
12646                Alignment);
12647   verifyFormat("something = 2000;\n"
12648                "int i = 1, j = 10;\n",
12649                Alignment);
12650   verifyFormat("float      something = 2000;\n"
12651                "double     another = 911;\n"
12652                "int        i = 1, j = 10;\n"
12653                "const int *oneMore = 1;\n"
12654                "unsigned   i = 2;",
12655                Alignment);
12656   verifyFormat("float a = 5;\n"
12657                "int   one = 1;\n"
12658                "method();\n"
12659                "const double       oneTwoThree = 123;\n"
12660                "const unsigned int oneTwo = 12;",
12661                Alignment);
12662   verifyFormat("int      oneTwoThree{0}; // comment\n"
12663                "unsigned oneTwo;         // comment",
12664                Alignment);
12665   EXPECT_EQ("float const a = 5;\n"
12666             "\n"
12667             "int oneTwoThree = 123;",
12668             format("float const   a = 5;\n"
12669                    "\n"
12670                    "int           oneTwoThree= 123;",
12671                    Alignment));
12672   EXPECT_EQ("float a = 5;\n"
12673             "int   one = 1;\n"
12674             "\n"
12675             "unsigned oneTwoThree = 123;",
12676             format("float    a = 5;\n"
12677                    "int      one = 1;\n"
12678                    "\n"
12679                    "unsigned oneTwoThree = 123;",
12680                    Alignment));
12681   EXPECT_EQ("float a = 5;\n"
12682             "int   one = 1;\n"
12683             "\n"
12684             "unsigned oneTwoThree = 123;\n"
12685             "int      oneTwo = 12;",
12686             format("float    a = 5;\n"
12687                    "int one = 1;\n"
12688                    "\n"
12689                    "unsigned oneTwoThree = 123;\n"
12690                    "int oneTwo = 12;",
12691                    Alignment));
12692   // Function prototype alignment
12693   verifyFormat("int    a();\n"
12694                "double b();",
12695                Alignment);
12696   verifyFormat("int    a(int x);\n"
12697                "double b();",
12698                Alignment);
12699   unsigned OldColumnLimit = Alignment.ColumnLimit;
12700   // We need to set ColumnLimit to zero, in order to stress nested alignments,
12701   // otherwise the function parameters will be re-flowed onto a single line.
12702   Alignment.ColumnLimit = 0;
12703   EXPECT_EQ("int    a(int   x,\n"
12704             "         float y);\n"
12705             "double b(int    x,\n"
12706             "         double y);",
12707             format("int a(int x,\n"
12708                    " float y);\n"
12709                    "double b(int x,\n"
12710                    " double y);",
12711                    Alignment));
12712   // This ensures that function parameters of function declarations are
12713   // correctly indented when their owning functions are indented.
12714   // The failure case here is for 'double y' to not be indented enough.
12715   EXPECT_EQ("double a(int x);\n"
12716             "int    b(int    y,\n"
12717             "         double z);",
12718             format("double a(int x);\n"
12719                    "int b(int y,\n"
12720                    " double z);",
12721                    Alignment));
12722   // Set ColumnLimit low so that we induce wrapping immediately after
12723   // the function name and opening paren.
12724   Alignment.ColumnLimit = 13;
12725   verifyFormat("int function(\n"
12726                "    int  x,\n"
12727                "    bool y);",
12728                Alignment);
12729   Alignment.ColumnLimit = OldColumnLimit;
12730   // Ensure function pointers don't screw up recursive alignment
12731   verifyFormat("int    a(int x, void (*fp)(int y));\n"
12732                "double b();",
12733                Alignment);
12734   Alignment.AlignConsecutiveAssignments = true;
12735   // Ensure recursive alignment is broken by function braces, so that the
12736   // "a = 1" does not align with subsequent assignments inside the function
12737   // body.
12738   verifyFormat("int func(int a = 1) {\n"
12739                "  int b  = 2;\n"
12740                "  int cc = 3;\n"
12741                "}",
12742                Alignment);
12743   verifyFormat("float      something = 2000;\n"
12744                "double     another   = 911;\n"
12745                "int        i = 1, j = 10;\n"
12746                "const int *oneMore = 1;\n"
12747                "unsigned   i       = 2;",
12748                Alignment);
12749   verifyFormat("int      oneTwoThree = {0}; // comment\n"
12750                "unsigned oneTwo      = 0;   // comment",
12751                Alignment);
12752   // Make sure that scope is correctly tracked, in the absence of braces
12753   verifyFormat("for (int i = 0; i < n; i++)\n"
12754                "  j = i;\n"
12755                "double x = 1;\n",
12756                Alignment);
12757   verifyFormat("if (int i = 0)\n"
12758                "  j = i;\n"
12759                "double x = 1;\n",
12760                Alignment);
12761   // Ensure operator[] and operator() are comprehended
12762   verifyFormat("struct test {\n"
12763                "  long long int foo();\n"
12764                "  int           operator[](int a);\n"
12765                "  double        bar();\n"
12766                "};\n",
12767                Alignment);
12768   verifyFormat("struct test {\n"
12769                "  long long int foo();\n"
12770                "  int           operator()(int a);\n"
12771                "  double        bar();\n"
12772                "};\n",
12773                Alignment);
12774   EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
12775             "  int const i   = 1;\n"
12776             "  int *     j   = 2;\n"
12777             "  int       big = 10000;\n"
12778             "\n"
12779             "  unsigned oneTwoThree = 123;\n"
12780             "  int      oneTwo      = 12;\n"
12781             "  method();\n"
12782             "  float k  = 2;\n"
12783             "  int   ll = 10000;\n"
12784             "}",
12785             format("void SomeFunction(int parameter= 0) {\n"
12786                    " int const  i= 1;\n"
12787                    "  int *j=2;\n"
12788                    " int big  =  10000;\n"
12789                    "\n"
12790                    "unsigned oneTwoThree  =123;\n"
12791                    "int oneTwo = 12;\n"
12792                    "  method();\n"
12793                    "float k= 2;\n"
12794                    "int ll=10000;\n"
12795                    "}",
12796                    Alignment));
12797   Alignment.AlignConsecutiveAssignments = false;
12798   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
12799   verifyFormat("#define A \\\n"
12800                "  int       aaaa = 12; \\\n"
12801                "  float     b = 23; \\\n"
12802                "  const int ccc = 234; \\\n"
12803                "  unsigned  dddddddddd = 2345;",
12804                Alignment);
12805   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
12806   verifyFormat("#define A              \\\n"
12807                "  int       aaaa = 12; \\\n"
12808                "  float     b = 23;    \\\n"
12809                "  const int ccc = 234; \\\n"
12810                "  unsigned  dddddddddd = 2345;",
12811                Alignment);
12812   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
12813   Alignment.ColumnLimit = 30;
12814   verifyFormat("#define A                    \\\n"
12815                "  int       aaaa = 12;       \\\n"
12816                "  float     b = 23;          \\\n"
12817                "  const int ccc = 234;       \\\n"
12818                "  int       dddddddddd = 2345;",
12819                Alignment);
12820   Alignment.ColumnLimit = 80;
12821   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
12822                "k = 4, int l = 5,\n"
12823                "                  int m = 6) {\n"
12824                "  const int j = 10;\n"
12825                "  otherThing = 1;\n"
12826                "}",
12827                Alignment);
12828   verifyFormat("void SomeFunction(int parameter = 0) {\n"
12829                "  int const i = 1;\n"
12830                "  int *     j = 2;\n"
12831                "  int       big = 10000;\n"
12832                "}",
12833                Alignment);
12834   verifyFormat("class C {\n"
12835                "public:\n"
12836                "  int          i = 1;\n"
12837                "  virtual void f() = 0;\n"
12838                "};",
12839                Alignment);
12840   verifyFormat("float i = 1;\n"
12841                "if (SomeType t = getSomething()) {\n"
12842                "}\n"
12843                "const unsigned j = 2;\n"
12844                "int            big = 10000;",
12845                Alignment);
12846   verifyFormat("float j = 7;\n"
12847                "for (int k = 0; k < N; ++k) {\n"
12848                "}\n"
12849                "unsigned j = 2;\n"
12850                "int      big = 10000;\n"
12851                "}",
12852                Alignment);
12853   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
12854   verifyFormat("float              i = 1;\n"
12855                "LooooooooooongType loooooooooooooooooooooongVariable\n"
12856                "    = someLooooooooooooooooongFunction();\n"
12857                "int j = 2;",
12858                Alignment);
12859   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
12860   verifyFormat("int                i = 1;\n"
12861                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
12862                "    someLooooooooooooooooongFunction();\n"
12863                "int j = 2;",
12864                Alignment);
12865 
12866   Alignment.AlignConsecutiveAssignments = true;
12867   verifyFormat("auto lambda = []() {\n"
12868                "  auto  ii = 0;\n"
12869                "  float j  = 0;\n"
12870                "  return 0;\n"
12871                "};\n"
12872                "int   i  = 0;\n"
12873                "float i2 = 0;\n"
12874                "auto  v  = type{\n"
12875                "    i = 1,   //\n"
12876                "    (i = 2), //\n"
12877                "    i = 3    //\n"
12878                "};",
12879                Alignment);
12880   Alignment.AlignConsecutiveAssignments = false;
12881 
12882   verifyFormat(
12883       "int      i = 1;\n"
12884       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
12885       "                          loooooooooooooooooooooongParameterB);\n"
12886       "int      j = 2;",
12887       Alignment);
12888 
12889   // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
12890   // We expect declarations and assignments to align, as long as it doesn't
12891   // exceed the column limit, starting a new alignment sequence whenever it
12892   // happens.
12893   Alignment.AlignConsecutiveAssignments = true;
12894   Alignment.ColumnLimit = 30;
12895   verifyFormat("float    ii              = 1;\n"
12896                "unsigned j               = 2;\n"
12897                "int someVerylongVariable = 1;\n"
12898                "AnotherLongType  ll = 123456;\n"
12899                "VeryVeryLongType k  = 2;\n"
12900                "int              myvar = 1;",
12901                Alignment);
12902   Alignment.ColumnLimit = 80;
12903   Alignment.AlignConsecutiveAssignments = false;
12904 
12905   verifyFormat(
12906       "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
12907       "          typename LongType, typename B>\n"
12908       "auto foo() {}\n",
12909       Alignment);
12910   verifyFormat("float a, b = 1;\n"
12911                "int   c = 2;\n"
12912                "int   dd = 3;\n",
12913                Alignment);
12914   verifyFormat("int   aa = ((1 > 2) ? 3 : 4);\n"
12915                "float b[1][] = {{3.f}};\n",
12916                Alignment);
12917   Alignment.AlignConsecutiveAssignments = true;
12918   verifyFormat("float a, b = 1;\n"
12919                "int   c  = 2;\n"
12920                "int   dd = 3;\n",
12921                Alignment);
12922   verifyFormat("int   aa     = ((1 > 2) ? 3 : 4);\n"
12923                "float b[1][] = {{3.f}};\n",
12924                Alignment);
12925   Alignment.AlignConsecutiveAssignments = false;
12926 
12927   Alignment.ColumnLimit = 30;
12928   Alignment.BinPackParameters = false;
12929   verifyFormat("void foo(float     a,\n"
12930                "         float     b,\n"
12931                "         int       c,\n"
12932                "         uint32_t *d) {\n"
12933                "  int *  e = 0;\n"
12934                "  float  f = 0;\n"
12935                "  double g = 0;\n"
12936                "}\n"
12937                "void bar(ino_t     a,\n"
12938                "         int       b,\n"
12939                "         uint32_t *c,\n"
12940                "         bool      d) {}\n",
12941                Alignment);
12942   Alignment.BinPackParameters = true;
12943   Alignment.ColumnLimit = 80;
12944 
12945   // Bug 33507
12946   Alignment.PointerAlignment = FormatStyle::PAS_Middle;
12947   verifyFormat(
12948       "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
12949       "  static const Version verVs2017;\n"
12950       "  return true;\n"
12951       "});\n",
12952       Alignment);
12953   Alignment.PointerAlignment = FormatStyle::PAS_Right;
12954 
12955   // See llvm.org/PR35641
12956   Alignment.AlignConsecutiveDeclarations = true;
12957   verifyFormat("int func() { //\n"
12958                "  int      b;\n"
12959                "  unsigned c;\n"
12960                "}",
12961                Alignment);
12962 
12963   // See PR37175
12964   FormatStyle Style = getMozillaStyle();
12965   Style.AlignConsecutiveDeclarations = true;
12966   EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n"
12967             "foo(int a);",
12968             format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style));
12969 }
12970 
12971 TEST_F(FormatTest, LinuxBraceBreaking) {
12972   FormatStyle LinuxBraceStyle = getLLVMStyle();
12973   LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
12974   verifyFormat("namespace a\n"
12975                "{\n"
12976                "class A\n"
12977                "{\n"
12978                "  void f()\n"
12979                "  {\n"
12980                "    if (true) {\n"
12981                "      a();\n"
12982                "      b();\n"
12983                "    } else {\n"
12984                "      a();\n"
12985                "    }\n"
12986                "  }\n"
12987                "  void g() { return; }\n"
12988                "};\n"
12989                "struct B {\n"
12990                "  int x;\n"
12991                "};\n"
12992                "} // namespace a\n",
12993                LinuxBraceStyle);
12994   verifyFormat("enum X {\n"
12995                "  Y = 0,\n"
12996                "}\n",
12997                LinuxBraceStyle);
12998   verifyFormat("struct S {\n"
12999                "  int Type;\n"
13000                "  union {\n"
13001                "    int x;\n"
13002                "    double y;\n"
13003                "  } Value;\n"
13004                "  class C\n"
13005                "  {\n"
13006                "    MyFavoriteType Value;\n"
13007                "  } Class;\n"
13008                "}\n",
13009                LinuxBraceStyle);
13010 }
13011 
13012 TEST_F(FormatTest, MozillaBraceBreaking) {
13013   FormatStyle MozillaBraceStyle = getLLVMStyle();
13014   MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
13015   MozillaBraceStyle.FixNamespaceComments = false;
13016   verifyFormat("namespace a {\n"
13017                "class A\n"
13018                "{\n"
13019                "  void f()\n"
13020                "  {\n"
13021                "    if (true) {\n"
13022                "      a();\n"
13023                "      b();\n"
13024                "    }\n"
13025                "  }\n"
13026                "  void g() { return; }\n"
13027                "};\n"
13028                "enum E\n"
13029                "{\n"
13030                "  A,\n"
13031                "  // foo\n"
13032                "  B,\n"
13033                "  C\n"
13034                "};\n"
13035                "struct B\n"
13036                "{\n"
13037                "  int x;\n"
13038                "};\n"
13039                "}\n",
13040                MozillaBraceStyle);
13041   verifyFormat("struct S\n"
13042                "{\n"
13043                "  int Type;\n"
13044                "  union\n"
13045                "  {\n"
13046                "    int x;\n"
13047                "    double y;\n"
13048                "  } Value;\n"
13049                "  class C\n"
13050                "  {\n"
13051                "    MyFavoriteType Value;\n"
13052                "  } Class;\n"
13053                "}\n",
13054                MozillaBraceStyle);
13055 }
13056 
13057 TEST_F(FormatTest, StroustrupBraceBreaking) {
13058   FormatStyle StroustrupBraceStyle = getLLVMStyle();
13059   StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
13060   verifyFormat("namespace a {\n"
13061                "class A {\n"
13062                "  void f()\n"
13063                "  {\n"
13064                "    if (true) {\n"
13065                "      a();\n"
13066                "      b();\n"
13067                "    }\n"
13068                "  }\n"
13069                "  void g() { return; }\n"
13070                "};\n"
13071                "struct B {\n"
13072                "  int x;\n"
13073                "};\n"
13074                "} // namespace a\n",
13075                StroustrupBraceStyle);
13076 
13077   verifyFormat("void foo()\n"
13078                "{\n"
13079                "  if (a) {\n"
13080                "    a();\n"
13081                "  }\n"
13082                "  else {\n"
13083                "    b();\n"
13084                "  }\n"
13085                "}\n",
13086                StroustrupBraceStyle);
13087 
13088   verifyFormat("#ifdef _DEBUG\n"
13089                "int foo(int i = 0)\n"
13090                "#else\n"
13091                "int foo(int i = 5)\n"
13092                "#endif\n"
13093                "{\n"
13094                "  return i;\n"
13095                "}",
13096                StroustrupBraceStyle);
13097 
13098   verifyFormat("void foo() {}\n"
13099                "void bar()\n"
13100                "#ifdef _DEBUG\n"
13101                "{\n"
13102                "  foo();\n"
13103                "}\n"
13104                "#else\n"
13105                "{\n"
13106                "}\n"
13107                "#endif",
13108                StroustrupBraceStyle);
13109 
13110   verifyFormat("void foobar() { int i = 5; }\n"
13111                "#ifdef _DEBUG\n"
13112                "void bar() {}\n"
13113                "#else\n"
13114                "void bar() { foobar(); }\n"
13115                "#endif",
13116                StroustrupBraceStyle);
13117 }
13118 
13119 TEST_F(FormatTest, AllmanBraceBreaking) {
13120   FormatStyle AllmanBraceStyle = getLLVMStyle();
13121   AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
13122 
13123   EXPECT_EQ("namespace a\n"
13124             "{\n"
13125             "void f();\n"
13126             "void g();\n"
13127             "} // namespace a\n",
13128             format("namespace a\n"
13129                    "{\n"
13130                    "void f();\n"
13131                    "void g();\n"
13132                    "}\n",
13133                    AllmanBraceStyle));
13134 
13135   verifyFormat("namespace a\n"
13136                "{\n"
13137                "class A\n"
13138                "{\n"
13139                "  void f()\n"
13140                "  {\n"
13141                "    if (true)\n"
13142                "    {\n"
13143                "      a();\n"
13144                "      b();\n"
13145                "    }\n"
13146                "  }\n"
13147                "  void g() { return; }\n"
13148                "};\n"
13149                "struct B\n"
13150                "{\n"
13151                "  int x;\n"
13152                "};\n"
13153                "union C\n"
13154                "{\n"
13155                "};\n"
13156                "} // namespace a",
13157                AllmanBraceStyle);
13158 
13159   verifyFormat("void f()\n"
13160                "{\n"
13161                "  if (true)\n"
13162                "  {\n"
13163                "    a();\n"
13164                "  }\n"
13165                "  else if (false)\n"
13166                "  {\n"
13167                "    b();\n"
13168                "  }\n"
13169                "  else\n"
13170                "  {\n"
13171                "    c();\n"
13172                "  }\n"
13173                "}\n",
13174                AllmanBraceStyle);
13175 
13176   verifyFormat("void f()\n"
13177                "{\n"
13178                "  for (int i = 0; i < 10; ++i)\n"
13179                "  {\n"
13180                "    a();\n"
13181                "  }\n"
13182                "  while (false)\n"
13183                "  {\n"
13184                "    b();\n"
13185                "  }\n"
13186                "  do\n"
13187                "  {\n"
13188                "    c();\n"
13189                "  } while (false)\n"
13190                "}\n",
13191                AllmanBraceStyle);
13192 
13193   verifyFormat("void f(int a)\n"
13194                "{\n"
13195                "  switch (a)\n"
13196                "  {\n"
13197                "  case 0:\n"
13198                "    break;\n"
13199                "  case 1:\n"
13200                "  {\n"
13201                "    break;\n"
13202                "  }\n"
13203                "  case 2:\n"
13204                "  {\n"
13205                "  }\n"
13206                "  break;\n"
13207                "  default:\n"
13208                "    break;\n"
13209                "  }\n"
13210                "}\n",
13211                AllmanBraceStyle);
13212 
13213   verifyFormat("enum X\n"
13214                "{\n"
13215                "  Y = 0,\n"
13216                "}\n",
13217                AllmanBraceStyle);
13218   verifyFormat("enum X\n"
13219                "{\n"
13220                "  Y = 0\n"
13221                "}\n",
13222                AllmanBraceStyle);
13223 
13224   verifyFormat("@interface BSApplicationController ()\n"
13225                "{\n"
13226                "@private\n"
13227                "  id _extraIvar;\n"
13228                "}\n"
13229                "@end\n",
13230                AllmanBraceStyle);
13231 
13232   verifyFormat("#ifdef _DEBUG\n"
13233                "int foo(int i = 0)\n"
13234                "#else\n"
13235                "int foo(int i = 5)\n"
13236                "#endif\n"
13237                "{\n"
13238                "  return i;\n"
13239                "}",
13240                AllmanBraceStyle);
13241 
13242   verifyFormat("void foo() {}\n"
13243                "void bar()\n"
13244                "#ifdef _DEBUG\n"
13245                "{\n"
13246                "  foo();\n"
13247                "}\n"
13248                "#else\n"
13249                "{\n"
13250                "}\n"
13251                "#endif",
13252                AllmanBraceStyle);
13253 
13254   verifyFormat("void foobar() { int i = 5; }\n"
13255                "#ifdef _DEBUG\n"
13256                "void bar() {}\n"
13257                "#else\n"
13258                "void bar() { foobar(); }\n"
13259                "#endif",
13260                AllmanBraceStyle);
13261 
13262   // This shouldn't affect ObjC blocks..
13263   verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
13264                "  // ...\n"
13265                "  int i;\n"
13266                "}];",
13267                AllmanBraceStyle);
13268   verifyFormat("void (^block)(void) = ^{\n"
13269                "  // ...\n"
13270                "  int i;\n"
13271                "};",
13272                AllmanBraceStyle);
13273   // .. or dict literals.
13274   verifyFormat("void f()\n"
13275                "{\n"
13276                "  // ...\n"
13277                "  [object someMethod:@{@\"a\" : @\"b\"}];\n"
13278                "}",
13279                AllmanBraceStyle);
13280   verifyFormat("void f()\n"
13281                "{\n"
13282                "  // ...\n"
13283                "  [object someMethod:@{a : @\"b\"}];\n"
13284                "}",
13285                AllmanBraceStyle);
13286   verifyFormat("int f()\n"
13287                "{ // comment\n"
13288                "  return 42;\n"
13289                "}",
13290                AllmanBraceStyle);
13291 
13292   AllmanBraceStyle.ColumnLimit = 19;
13293   verifyFormat("void f() { int i; }", AllmanBraceStyle);
13294   AllmanBraceStyle.ColumnLimit = 18;
13295   verifyFormat("void f()\n"
13296                "{\n"
13297                "  int i;\n"
13298                "}",
13299                AllmanBraceStyle);
13300   AllmanBraceStyle.ColumnLimit = 80;
13301 
13302   FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
13303   BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine =
13304       FormatStyle::SIS_WithoutElse;
13305   BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
13306   verifyFormat("void f(bool b)\n"
13307                "{\n"
13308                "  if (b)\n"
13309                "  {\n"
13310                "    return;\n"
13311                "  }\n"
13312                "}\n",
13313                BreakBeforeBraceShortIfs);
13314   verifyFormat("void f(bool b)\n"
13315                "{\n"
13316                "  if constexpr (b)\n"
13317                "  {\n"
13318                "    return;\n"
13319                "  }\n"
13320                "}\n",
13321                BreakBeforeBraceShortIfs);
13322   verifyFormat("void f(bool b)\n"
13323                "{\n"
13324                "  if CONSTEXPR (b)\n"
13325                "  {\n"
13326                "    return;\n"
13327                "  }\n"
13328                "}\n",
13329                BreakBeforeBraceShortIfs);
13330   verifyFormat("void f(bool b)\n"
13331                "{\n"
13332                "  if (b) return;\n"
13333                "}\n",
13334                BreakBeforeBraceShortIfs);
13335   verifyFormat("void f(bool b)\n"
13336                "{\n"
13337                "  if constexpr (b) return;\n"
13338                "}\n",
13339                BreakBeforeBraceShortIfs);
13340   verifyFormat("void f(bool b)\n"
13341                "{\n"
13342                "  if CONSTEXPR (b) return;\n"
13343                "}\n",
13344                BreakBeforeBraceShortIfs);
13345   verifyFormat("void f(bool b)\n"
13346                "{\n"
13347                "  while (b)\n"
13348                "  {\n"
13349                "    return;\n"
13350                "  }\n"
13351                "}\n",
13352                BreakBeforeBraceShortIfs);
13353 }
13354 
13355 TEST_F(FormatTest, WhitesmithsBraceBreaking) {
13356   FormatStyle WhitesmithsBraceStyle = getLLVMStyle();
13357   WhitesmithsBraceStyle.BreakBeforeBraces = FormatStyle::BS_Whitesmiths;
13358 
13359   // Make a few changes to the style for testing purposes
13360   WhitesmithsBraceStyle.AllowShortFunctionsOnASingleLine =
13361       FormatStyle::SFS_Empty;
13362   WhitesmithsBraceStyle.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None;
13363   WhitesmithsBraceStyle.ColumnLimit = 0;
13364 
13365   // FIXME: this test case can't decide whether there should be a blank line
13366   // after the ~D() line or not. It adds one if one doesn't exist in the test
13367   // and it removes the line if one exists.
13368   /*
13369   verifyFormat("class A;\n"
13370                "namespace B\n"
13371                "  {\n"
13372                "class C;\n"
13373                "// Comment\n"
13374                "class D\n"
13375                "  {\n"
13376                "public:\n"
13377                "  D();\n"
13378                "  ~D() {}\n"
13379                "private:\n"
13380                "  enum E\n"
13381                "    {\n"
13382                "    F\n"
13383                "    }\n"
13384                "  };\n"
13385                "  } // namespace B\n",
13386                WhitesmithsBraceStyle);
13387   */
13388 
13389   verifyFormat("namespace a\n"
13390                "  {\n"
13391                "class A\n"
13392                "  {\n"
13393                "  void f()\n"
13394                "    {\n"
13395                "    if (true)\n"
13396                "      {\n"
13397                "      a();\n"
13398                "      b();\n"
13399                "      }\n"
13400                "    }\n"
13401                "  void g()\n"
13402                "    {\n"
13403                "    return;\n"
13404                "    }\n"
13405                "  };\n"
13406                "struct B\n"
13407                "  {\n"
13408                "  int x;\n"
13409                "  };\n"
13410                "  } // namespace a",
13411                WhitesmithsBraceStyle);
13412 
13413   verifyFormat("void f()\n"
13414                "  {\n"
13415                "  if (true)\n"
13416                "    {\n"
13417                "    a();\n"
13418                "    }\n"
13419                "  else if (false)\n"
13420                "    {\n"
13421                "    b();\n"
13422                "    }\n"
13423                "  else\n"
13424                "    {\n"
13425                "    c();\n"
13426                "    }\n"
13427                "  }\n",
13428                WhitesmithsBraceStyle);
13429 
13430   verifyFormat("void f()\n"
13431                "  {\n"
13432                "  for (int i = 0; i < 10; ++i)\n"
13433                "    {\n"
13434                "    a();\n"
13435                "    }\n"
13436                "  while (false)\n"
13437                "    {\n"
13438                "    b();\n"
13439                "    }\n"
13440                "  do\n"
13441                "    {\n"
13442                "    c();\n"
13443                "    } while (false)\n"
13444                "  }\n",
13445                WhitesmithsBraceStyle);
13446 
13447   WhitesmithsBraceStyle.IndentCaseBlocks = true;
13448   verifyFormat("void switchTest1(int a)\n"
13449                "  {\n"
13450                "  switch (a)\n"
13451                "    {\n"
13452                "    case 2:\n"
13453                "      {\n"
13454                "      }\n"
13455                "    break;\n"
13456                "    }\n"
13457                "  }\n",
13458                WhitesmithsBraceStyle);
13459 
13460   verifyFormat("void switchTest2(int a)\n"
13461                "  {\n"
13462                "  switch (a)\n"
13463                "    {\n"
13464                "    case 0:\n"
13465                "    break;\n"
13466                "    case 1:\n"
13467                "      {\n"
13468                "      break;\n"
13469                "      }\n"
13470                "    case 2:\n"
13471                "      {\n"
13472                "      }\n"
13473                "    break;\n"
13474                "    default:\n"
13475                "    break;\n"
13476                "    }\n"
13477                "  }\n",
13478                WhitesmithsBraceStyle);
13479 
13480   verifyFormat("void switchTest3(int a)\n"
13481                "  {\n"
13482                "  switch (a)\n"
13483                "    {\n"
13484                "    case 0:\n"
13485                "      {\n"
13486                "      foo(x);\n"
13487                "      }\n"
13488                "    break;\n"
13489                "    default:\n"
13490                "      {\n"
13491                "      foo(1);\n"
13492                "      }\n"
13493                "    break;\n"
13494                "    }\n"
13495                "  }\n",
13496                WhitesmithsBraceStyle);
13497 
13498   WhitesmithsBraceStyle.IndentCaseBlocks = false;
13499 
13500   verifyFormat("void switchTest4(int a)\n"
13501                "  {\n"
13502                "  switch (a)\n"
13503                "    {\n"
13504                "    case 2:\n"
13505                "    {\n"
13506                "    }\n"
13507                "    break;\n"
13508                "    }\n"
13509                "  }\n",
13510                WhitesmithsBraceStyle);
13511 
13512   verifyFormat("void switchTest5(int a)\n"
13513                "  {\n"
13514                "  switch (a)\n"
13515                "    {\n"
13516                "    case 0:\n"
13517                "    break;\n"
13518                "    case 1:\n"
13519                "    {\n"
13520                "    foo();\n"
13521                "    break;\n"
13522                "    }\n"
13523                "    case 2:\n"
13524                "    {\n"
13525                "    }\n"
13526                "    break;\n"
13527                "    default:\n"
13528                "    break;\n"
13529                "    }\n"
13530                "  }\n",
13531                WhitesmithsBraceStyle);
13532 
13533   verifyFormat("void switchTest6(int a)\n"
13534                "  {\n"
13535                "  switch (a)\n"
13536                "    {\n"
13537                "    case 0:\n"
13538                "    {\n"
13539                "    foo(x);\n"
13540                "    }\n"
13541                "    break;\n"
13542                "    default:\n"
13543                "    {\n"
13544                "    foo(1);\n"
13545                "    }\n"
13546                "    break;\n"
13547                "    }\n"
13548                "  }\n",
13549                WhitesmithsBraceStyle);
13550 
13551   verifyFormat("enum X\n"
13552                "  {\n"
13553                "  Y = 0, // testing\n"
13554                "  }\n",
13555                WhitesmithsBraceStyle);
13556 
13557   verifyFormat("enum X\n"
13558                "  {\n"
13559                "  Y = 0\n"
13560                "  }\n",
13561                WhitesmithsBraceStyle);
13562   verifyFormat("enum X\n"
13563                "  {\n"
13564                "  Y = 0,\n"
13565                "  Z = 1\n"
13566                "  };\n",
13567                WhitesmithsBraceStyle);
13568 
13569   verifyFormat("@interface BSApplicationController ()\n"
13570                "  {\n"
13571                "@private\n"
13572                "  id _extraIvar;\n"
13573                "  }\n"
13574                "@end\n",
13575                WhitesmithsBraceStyle);
13576 
13577   verifyFormat("#ifdef _DEBUG\n"
13578                "int foo(int i = 0)\n"
13579                "#else\n"
13580                "int foo(int i = 5)\n"
13581                "#endif\n"
13582                "  {\n"
13583                "  return i;\n"
13584                "  }",
13585                WhitesmithsBraceStyle);
13586 
13587   verifyFormat("void foo() {}\n"
13588                "void bar()\n"
13589                "#ifdef _DEBUG\n"
13590                "  {\n"
13591                "  foo();\n"
13592                "  }\n"
13593                "#else\n"
13594                "  {\n"
13595                "  }\n"
13596                "#endif",
13597                WhitesmithsBraceStyle);
13598 
13599   verifyFormat("void foobar()\n"
13600                "  {\n"
13601                "  int i = 5;\n"
13602                "  }\n"
13603                "#ifdef _DEBUG\n"
13604                "void bar()\n"
13605                "  {\n"
13606                "  }\n"
13607                "#else\n"
13608                "void bar()\n"
13609                "  {\n"
13610                "  foobar();\n"
13611                "  }\n"
13612                "#endif",
13613                WhitesmithsBraceStyle);
13614 
13615   // This shouldn't affect ObjC blocks..
13616   verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
13617                "  // ...\n"
13618                "  int i;\n"
13619                "}];",
13620                WhitesmithsBraceStyle);
13621   verifyFormat("void (^block)(void) = ^{\n"
13622                "  // ...\n"
13623                "  int i;\n"
13624                "};",
13625                WhitesmithsBraceStyle);
13626   // .. or dict literals.
13627   verifyFormat("void f()\n"
13628                "  {\n"
13629                "  [object someMethod:@{@\"a\" : @\"b\"}];\n"
13630                "  }",
13631                WhitesmithsBraceStyle);
13632 
13633   verifyFormat("int f()\n"
13634                "  { // comment\n"
13635                "  return 42;\n"
13636                "  }",
13637                WhitesmithsBraceStyle);
13638 
13639   FormatStyle BreakBeforeBraceShortIfs = WhitesmithsBraceStyle;
13640   BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine =
13641       FormatStyle::SIS_Always;
13642   BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
13643   verifyFormat("void f(bool b)\n"
13644                "  {\n"
13645                "  if (b)\n"
13646                "    {\n"
13647                "    return;\n"
13648                "    }\n"
13649                "  }\n",
13650                BreakBeforeBraceShortIfs);
13651   verifyFormat("void f(bool b)\n"
13652                "  {\n"
13653                "  if (b) return;\n"
13654                "  }\n",
13655                BreakBeforeBraceShortIfs);
13656   verifyFormat("void f(bool b)\n"
13657                "  {\n"
13658                "  while (b)\n"
13659                "    {\n"
13660                "    return;\n"
13661                "    }\n"
13662                "  }\n",
13663                BreakBeforeBraceShortIfs);
13664 }
13665 
13666 TEST_F(FormatTest, GNUBraceBreaking) {
13667   FormatStyle GNUBraceStyle = getLLVMStyle();
13668   GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
13669   verifyFormat("namespace a\n"
13670                "{\n"
13671                "class A\n"
13672                "{\n"
13673                "  void f()\n"
13674                "  {\n"
13675                "    int a;\n"
13676                "    {\n"
13677                "      int b;\n"
13678                "    }\n"
13679                "    if (true)\n"
13680                "      {\n"
13681                "        a();\n"
13682                "        b();\n"
13683                "      }\n"
13684                "  }\n"
13685                "  void g() { return; }\n"
13686                "}\n"
13687                "} // namespace a",
13688                GNUBraceStyle);
13689 
13690   verifyFormat("void f()\n"
13691                "{\n"
13692                "  if (true)\n"
13693                "    {\n"
13694                "      a();\n"
13695                "    }\n"
13696                "  else if (false)\n"
13697                "    {\n"
13698                "      b();\n"
13699                "    }\n"
13700                "  else\n"
13701                "    {\n"
13702                "      c();\n"
13703                "    }\n"
13704                "}\n",
13705                GNUBraceStyle);
13706 
13707   verifyFormat("void f()\n"
13708                "{\n"
13709                "  for (int i = 0; i < 10; ++i)\n"
13710                "    {\n"
13711                "      a();\n"
13712                "    }\n"
13713                "  while (false)\n"
13714                "    {\n"
13715                "      b();\n"
13716                "    }\n"
13717                "  do\n"
13718                "    {\n"
13719                "      c();\n"
13720                "    }\n"
13721                "  while (false);\n"
13722                "}\n",
13723                GNUBraceStyle);
13724 
13725   verifyFormat("void f(int a)\n"
13726                "{\n"
13727                "  switch (a)\n"
13728                "    {\n"
13729                "    case 0:\n"
13730                "      break;\n"
13731                "    case 1:\n"
13732                "      {\n"
13733                "        break;\n"
13734                "      }\n"
13735                "    case 2:\n"
13736                "      {\n"
13737                "      }\n"
13738                "      break;\n"
13739                "    default:\n"
13740                "      break;\n"
13741                "    }\n"
13742                "}\n",
13743                GNUBraceStyle);
13744 
13745   verifyFormat("enum X\n"
13746                "{\n"
13747                "  Y = 0,\n"
13748                "}\n",
13749                GNUBraceStyle);
13750 
13751   verifyFormat("@interface BSApplicationController ()\n"
13752                "{\n"
13753                "@private\n"
13754                "  id _extraIvar;\n"
13755                "}\n"
13756                "@end\n",
13757                GNUBraceStyle);
13758 
13759   verifyFormat("#ifdef _DEBUG\n"
13760                "int foo(int i = 0)\n"
13761                "#else\n"
13762                "int foo(int i = 5)\n"
13763                "#endif\n"
13764                "{\n"
13765                "  return i;\n"
13766                "}",
13767                GNUBraceStyle);
13768 
13769   verifyFormat("void foo() {}\n"
13770                "void bar()\n"
13771                "#ifdef _DEBUG\n"
13772                "{\n"
13773                "  foo();\n"
13774                "}\n"
13775                "#else\n"
13776                "{\n"
13777                "}\n"
13778                "#endif",
13779                GNUBraceStyle);
13780 
13781   verifyFormat("void foobar() { int i = 5; }\n"
13782                "#ifdef _DEBUG\n"
13783                "void bar() {}\n"
13784                "#else\n"
13785                "void bar() { foobar(); }\n"
13786                "#endif",
13787                GNUBraceStyle);
13788 }
13789 
13790 TEST_F(FormatTest, WebKitBraceBreaking) {
13791   FormatStyle WebKitBraceStyle = getLLVMStyle();
13792   WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
13793   WebKitBraceStyle.FixNamespaceComments = false;
13794   verifyFormat("namespace a {\n"
13795                "class A {\n"
13796                "  void f()\n"
13797                "  {\n"
13798                "    if (true) {\n"
13799                "      a();\n"
13800                "      b();\n"
13801                "    }\n"
13802                "  }\n"
13803                "  void g() { return; }\n"
13804                "};\n"
13805                "enum E {\n"
13806                "  A,\n"
13807                "  // foo\n"
13808                "  B,\n"
13809                "  C\n"
13810                "};\n"
13811                "struct B {\n"
13812                "  int x;\n"
13813                "};\n"
13814                "}\n",
13815                WebKitBraceStyle);
13816   verifyFormat("struct S {\n"
13817                "  int Type;\n"
13818                "  union {\n"
13819                "    int x;\n"
13820                "    double y;\n"
13821                "  } Value;\n"
13822                "  class C {\n"
13823                "    MyFavoriteType Value;\n"
13824                "  } Class;\n"
13825                "};\n",
13826                WebKitBraceStyle);
13827 }
13828 
13829 TEST_F(FormatTest, CatchExceptionReferenceBinding) {
13830   verifyFormat("void f() {\n"
13831                "  try {\n"
13832                "  } catch (const Exception &e) {\n"
13833                "  }\n"
13834                "}\n",
13835                getLLVMStyle());
13836 }
13837 
13838 TEST_F(FormatTest, UnderstandsPragmas) {
13839   verifyFormat("#pragma omp reduction(| : var)");
13840   verifyFormat("#pragma omp reduction(+ : var)");
13841 
13842   EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
13843             "(including parentheses).",
13844             format("#pragma    mark   Any non-hyphenated or hyphenated string "
13845                    "(including parentheses)."));
13846 }
13847 
13848 TEST_F(FormatTest, UnderstandPragmaOption) {
13849   verifyFormat("#pragma option -C -A");
13850 
13851   EXPECT_EQ("#pragma option -C -A", format("#pragma    option   -C   -A"));
13852 }
13853 
13854 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
13855   FormatStyle Style = getLLVMStyle();
13856   Style.ColumnLimit = 20;
13857 
13858   // See PR41213
13859   EXPECT_EQ("/*\n"
13860             " *\t9012345\n"
13861             " * /8901\n"
13862             " */",
13863             format("/*\n"
13864                    " *\t9012345 /8901\n"
13865                    " */",
13866                    Style));
13867   EXPECT_EQ("/*\n"
13868             " *345678\n"
13869             " *\t/8901\n"
13870             " */",
13871             format("/*\n"
13872                    " *345678\t/8901\n"
13873                    " */",
13874                    Style));
13875 
13876   verifyFormat("int a; // the\n"
13877                "       // comment",
13878                Style);
13879   EXPECT_EQ("int a; /* first line\n"
13880             "        * second\n"
13881             "        * line third\n"
13882             "        * line\n"
13883             "        */",
13884             format("int a; /* first line\n"
13885                    "        * second\n"
13886                    "        * line third\n"
13887                    "        * line\n"
13888                    "        */",
13889                    Style));
13890   EXPECT_EQ("int a; // first line\n"
13891             "       // second\n"
13892             "       // line third\n"
13893             "       // line",
13894             format("int a; // first line\n"
13895                    "       // second line\n"
13896                    "       // third line",
13897                    Style));
13898 
13899   Style.PenaltyExcessCharacter = 90;
13900   verifyFormat("int a; // the comment", Style);
13901   EXPECT_EQ("int a; // the comment\n"
13902             "       // aaa",
13903             format("int a; // the comment aaa", Style));
13904   EXPECT_EQ("int a; /* first line\n"
13905             "        * second line\n"
13906             "        * third line\n"
13907             "        */",
13908             format("int a; /* first line\n"
13909                    "        * second line\n"
13910                    "        * third line\n"
13911                    "        */",
13912                    Style));
13913   EXPECT_EQ("int a; // first line\n"
13914             "       // second line\n"
13915             "       // third line",
13916             format("int a; // first line\n"
13917                    "       // second line\n"
13918                    "       // third line",
13919                    Style));
13920   // FIXME: Investigate why this is not getting the same layout as the test
13921   // above.
13922   EXPECT_EQ("int a; /* first line\n"
13923             "        * second line\n"
13924             "        * third line\n"
13925             "        */",
13926             format("int a; /* first line second line third line"
13927                    "\n*/",
13928                    Style));
13929 
13930   EXPECT_EQ("// foo bar baz bazfoo\n"
13931             "// foo bar foo bar\n",
13932             format("// foo bar baz bazfoo\n"
13933                    "// foo bar foo           bar\n",
13934                    Style));
13935   EXPECT_EQ("// foo bar baz bazfoo\n"
13936             "// foo bar foo bar\n",
13937             format("// foo bar baz      bazfoo\n"
13938                    "// foo            bar foo bar\n",
13939                    Style));
13940 
13941   // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
13942   // next one.
13943   EXPECT_EQ("// foo bar baz bazfoo\n"
13944             "// bar foo bar\n",
13945             format("// foo bar baz      bazfoo bar\n"
13946                    "// foo            bar\n",
13947                    Style));
13948 
13949   EXPECT_EQ("// foo bar baz bazfoo\n"
13950             "// foo bar baz bazfoo\n"
13951             "// bar foo bar\n",
13952             format("// foo bar baz      bazfoo\n"
13953                    "// foo bar baz      bazfoo bar\n"
13954                    "// foo bar\n",
13955                    Style));
13956 
13957   EXPECT_EQ("// foo bar baz bazfoo\n"
13958             "// foo bar baz bazfoo\n"
13959             "// bar foo bar\n",
13960             format("// foo bar baz      bazfoo\n"
13961                    "// foo bar baz      bazfoo bar\n"
13962                    "// foo           bar\n",
13963                    Style));
13964 
13965   // Make sure we do not keep protruding characters if strict mode reflow is
13966   // cheaper than keeping protruding characters.
13967   Style.ColumnLimit = 21;
13968   EXPECT_EQ(
13969       "// foo foo foo foo\n"
13970       "// foo foo foo foo\n"
13971       "// foo foo foo foo\n",
13972       format("// foo foo foo foo foo foo foo foo foo foo foo foo\n", Style));
13973 
13974   EXPECT_EQ("int a = /* long block\n"
13975             "           comment */\n"
13976             "    42;",
13977             format("int a = /* long block comment */ 42;", Style));
13978 }
13979 
13980 #define EXPECT_ALL_STYLES_EQUAL(Styles)                                        \
13981   for (size_t i = 1; i < Styles.size(); ++i)                                   \
13982   EXPECT_EQ(Styles[0], Styles[i])                                              \
13983       << "Style #" << i << " of " << Styles.size() << " differs from Style #0"
13984 
13985 TEST_F(FormatTest, GetsPredefinedStyleByName) {
13986   SmallVector<FormatStyle, 3> Styles;
13987   Styles.resize(3);
13988 
13989   Styles[0] = getLLVMStyle();
13990   EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
13991   EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
13992   EXPECT_ALL_STYLES_EQUAL(Styles);
13993 
13994   Styles[0] = getGoogleStyle();
13995   EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
13996   EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
13997   EXPECT_ALL_STYLES_EQUAL(Styles);
13998 
13999   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
14000   EXPECT_TRUE(
14001       getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
14002   EXPECT_TRUE(
14003       getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
14004   EXPECT_ALL_STYLES_EQUAL(Styles);
14005 
14006   Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
14007   EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
14008   EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
14009   EXPECT_ALL_STYLES_EQUAL(Styles);
14010 
14011   Styles[0] = getMozillaStyle();
14012   EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
14013   EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
14014   EXPECT_ALL_STYLES_EQUAL(Styles);
14015 
14016   Styles[0] = getWebKitStyle();
14017   EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
14018   EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
14019   EXPECT_ALL_STYLES_EQUAL(Styles);
14020 
14021   Styles[0] = getGNUStyle();
14022   EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
14023   EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
14024   EXPECT_ALL_STYLES_EQUAL(Styles);
14025 
14026   EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
14027 }
14028 
14029 TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
14030   SmallVector<FormatStyle, 8> Styles;
14031   Styles.resize(2);
14032 
14033   Styles[0] = getGoogleStyle();
14034   Styles[1] = getLLVMStyle();
14035   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
14036   EXPECT_ALL_STYLES_EQUAL(Styles);
14037 
14038   Styles.resize(5);
14039   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
14040   Styles[1] = getLLVMStyle();
14041   Styles[1].Language = FormatStyle::LK_JavaScript;
14042   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
14043 
14044   Styles[2] = getLLVMStyle();
14045   Styles[2].Language = FormatStyle::LK_JavaScript;
14046   EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
14047                                   "BasedOnStyle: Google",
14048                                   &Styles[2])
14049                    .value());
14050 
14051   Styles[3] = getLLVMStyle();
14052   Styles[3].Language = FormatStyle::LK_JavaScript;
14053   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
14054                                   "Language: JavaScript",
14055                                   &Styles[3])
14056                    .value());
14057 
14058   Styles[4] = getLLVMStyle();
14059   Styles[4].Language = FormatStyle::LK_JavaScript;
14060   EXPECT_EQ(0, parseConfiguration("---\n"
14061                                   "BasedOnStyle: LLVM\n"
14062                                   "IndentWidth: 123\n"
14063                                   "---\n"
14064                                   "BasedOnStyle: Google\n"
14065                                   "Language: JavaScript",
14066                                   &Styles[4])
14067                    .value());
14068   EXPECT_ALL_STYLES_EQUAL(Styles);
14069 }
14070 
14071 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME)                             \
14072   Style.FIELD = false;                                                         \
14073   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value());      \
14074   EXPECT_TRUE(Style.FIELD);                                                    \
14075   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value());     \
14076   EXPECT_FALSE(Style.FIELD);
14077 
14078 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
14079 
14080 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME)              \
14081   Style.STRUCT.FIELD = false;                                                  \
14082   EXPECT_EQ(0,                                                                 \
14083             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": true", &Style)   \
14084                 .value());                                                     \
14085   EXPECT_TRUE(Style.STRUCT.FIELD);                                             \
14086   EXPECT_EQ(0,                                                                 \
14087             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": false", &Style)  \
14088                 .value());                                                     \
14089   EXPECT_FALSE(Style.STRUCT.FIELD);
14090 
14091 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD)                                 \
14092   CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
14093 
14094 #define CHECK_PARSE(TEXT, FIELD, VALUE)                                        \
14095   EXPECT_NE(VALUE, Style.FIELD) << "Initial value already the same!";          \
14096   EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value());                      \
14097   EXPECT_EQ(VALUE, Style.FIELD) << "Unexpected value after parsing!"
14098 
14099 TEST_F(FormatTest, ParsesConfigurationBools) {
14100   FormatStyle Style = {};
14101   Style.Language = FormatStyle::LK_Cpp;
14102   CHECK_PARSE_BOOL(AlignTrailingComments);
14103   CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
14104   CHECK_PARSE_BOOL(AlignConsecutiveBitFields);
14105   CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
14106   CHECK_PARSE_BOOL(AlignConsecutiveMacros);
14107   CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine);
14108   CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine);
14109   CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
14110   CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
14111   CHECK_PARSE_BOOL(AllowShortEnumsOnASingleLine);
14112   CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
14113   CHECK_PARSE_BOOL(BinPackArguments);
14114   CHECK_PARSE_BOOL(BinPackParameters);
14115   CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
14116   CHECK_PARSE_BOOL(BreakBeforeConceptDeclarations);
14117   CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
14118   CHECK_PARSE_BOOL(BreakStringLiterals);
14119   CHECK_PARSE_BOOL(CompactNamespaces);
14120   CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
14121   CHECK_PARSE_BOOL(DeriveLineEnding);
14122   CHECK_PARSE_BOOL(DerivePointerAlignment);
14123   CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
14124   CHECK_PARSE_BOOL(DisableFormat);
14125   CHECK_PARSE_BOOL(IndentCaseLabels);
14126   CHECK_PARSE_BOOL(IndentCaseBlocks);
14127   CHECK_PARSE_BOOL(IndentGotoLabels);
14128   CHECK_PARSE_BOOL(IndentPragmas);
14129   CHECK_PARSE_BOOL(IndentRequires);
14130   CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
14131   CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
14132   CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
14133   CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
14134   CHECK_PARSE_BOOL(Cpp11BracedListStyle);
14135   CHECK_PARSE_BOOL(ReflowComments);
14136   CHECK_PARSE_BOOL(SortIncludes);
14137   CHECK_PARSE_BOOL(SortUsingDeclarations);
14138   CHECK_PARSE_BOOL(SpacesInParentheses);
14139   CHECK_PARSE_BOOL(SpacesInSquareBrackets);
14140   CHECK_PARSE_BOOL(SpacesInAngles);
14141   CHECK_PARSE_BOOL(SpacesInConditionalStatement);
14142   CHECK_PARSE_BOOL(SpaceInEmptyBlock);
14143   CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
14144   CHECK_PARSE_BOOL(SpacesInContainerLiterals);
14145   CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
14146   CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
14147   CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
14148   CHECK_PARSE_BOOL(SpaceAfterLogicalNot);
14149   CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
14150   CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList);
14151   CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon);
14152   CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon);
14153   CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon);
14154   CHECK_PARSE_BOOL(SpaceBeforeSquareBrackets);
14155   CHECK_PARSE_BOOL(UseCRLF);
14156 
14157   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel);
14158   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
14159   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
14160   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
14161   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
14162   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
14163   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
14164   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
14165   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
14166   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
14167   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
14168   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeLambdaBody);
14169   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeWhile);
14170   CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
14171   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
14172   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
14173   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
14174 }
14175 
14176 #undef CHECK_PARSE_BOOL
14177 
14178 TEST_F(FormatTest, ParsesConfiguration) {
14179   FormatStyle Style = {};
14180   Style.Language = FormatStyle::LK_Cpp;
14181   CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
14182   CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
14183               ConstructorInitializerIndentWidth, 1234u);
14184   CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
14185   CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
14186   CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
14187   CHECK_PARSE("PenaltyBreakAssignment: 1234", PenaltyBreakAssignment, 1234u);
14188   CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
14189               PenaltyBreakBeforeFirstCallParameter, 1234u);
14190   CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234",
14191               PenaltyBreakTemplateDeclaration, 1234u);
14192   CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
14193   CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
14194               PenaltyReturnTypeOnItsOwnLine, 1234u);
14195   CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
14196               SpacesBeforeTrailingComments, 1234u);
14197   CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
14198   CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
14199   CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
14200 
14201   Style.PointerAlignment = FormatStyle::PAS_Middle;
14202   CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
14203               FormatStyle::PAS_Left);
14204   CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
14205               FormatStyle::PAS_Right);
14206   CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
14207               FormatStyle::PAS_Middle);
14208   // For backward compatibility:
14209   CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
14210               FormatStyle::PAS_Left);
14211   CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
14212               FormatStyle::PAS_Right);
14213   CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
14214               FormatStyle::PAS_Middle);
14215 
14216   Style.Standard = FormatStyle::LS_Auto;
14217   CHECK_PARSE("Standard: c++03", Standard, FormatStyle::LS_Cpp03);
14218   CHECK_PARSE("Standard: c++11", Standard, FormatStyle::LS_Cpp11);
14219   CHECK_PARSE("Standard: c++14", Standard, FormatStyle::LS_Cpp14);
14220   CHECK_PARSE("Standard: c++17", Standard, FormatStyle::LS_Cpp17);
14221   CHECK_PARSE("Standard: c++20", Standard, FormatStyle::LS_Cpp20);
14222   CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
14223   CHECK_PARSE("Standard: Latest", Standard, FormatStyle::LS_Latest);
14224   // Legacy aliases:
14225   CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
14226   CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Latest);
14227   CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
14228   CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
14229 
14230   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
14231   CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
14232               BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
14233   CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
14234               FormatStyle::BOS_None);
14235   CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
14236               FormatStyle::BOS_All);
14237   // For backward compatibility:
14238   CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
14239               FormatStyle::BOS_None);
14240   CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
14241               FormatStyle::BOS_All);
14242 
14243   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
14244   CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
14245               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
14246   CHECK_PARSE("BreakConstructorInitializers: AfterColon",
14247               BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
14248   CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
14249               BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
14250   // For backward compatibility:
14251   CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
14252               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
14253 
14254   Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
14255   CHECK_PARSE("BreakInheritanceList: BeforeComma", BreakInheritanceList,
14256               FormatStyle::BILS_BeforeComma);
14257   CHECK_PARSE("BreakInheritanceList: AfterColon", BreakInheritanceList,
14258               FormatStyle::BILS_AfterColon);
14259   CHECK_PARSE("BreakInheritanceList: BeforeColon", BreakInheritanceList,
14260               FormatStyle::BILS_BeforeColon);
14261   // For backward compatibility:
14262   CHECK_PARSE("BreakBeforeInheritanceComma: true", BreakInheritanceList,
14263               FormatStyle::BILS_BeforeComma);
14264 
14265   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
14266   CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
14267               FormatStyle::BAS_Align);
14268   CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
14269               FormatStyle::BAS_DontAlign);
14270   CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
14271               FormatStyle::BAS_AlwaysBreak);
14272   // For backward compatibility:
14273   CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
14274               FormatStyle::BAS_DontAlign);
14275   CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
14276               FormatStyle::BAS_Align);
14277 
14278   Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
14279   CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
14280               FormatStyle::ENAS_DontAlign);
14281   CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
14282               FormatStyle::ENAS_Left);
14283   CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
14284               FormatStyle::ENAS_Right);
14285   // For backward compatibility:
14286   CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
14287               FormatStyle::ENAS_Left);
14288   CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
14289               FormatStyle::ENAS_Right);
14290 
14291   Style.AlignOperands = FormatStyle::OAS_Align;
14292   CHECK_PARSE("AlignOperands: DontAlign", AlignOperands,
14293               FormatStyle::OAS_DontAlign);
14294   CHECK_PARSE("AlignOperands: Align", AlignOperands, FormatStyle::OAS_Align);
14295   CHECK_PARSE("AlignOperands: AlignAfterOperator", AlignOperands,
14296               FormatStyle::OAS_AlignAfterOperator);
14297   // For backward compatibility:
14298   CHECK_PARSE("AlignOperands: false", AlignOperands,
14299               FormatStyle::OAS_DontAlign);
14300   CHECK_PARSE("AlignOperands: true", AlignOperands, FormatStyle::OAS_Align);
14301 
14302   Style.UseTab = FormatStyle::UT_ForIndentation;
14303   CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
14304   CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
14305   CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
14306   CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
14307               FormatStyle::UT_ForContinuationAndIndentation);
14308   CHECK_PARSE("UseTab: AlignWithSpaces", UseTab,
14309               FormatStyle::UT_AlignWithSpaces);
14310   // For backward compatibility:
14311   CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
14312   CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
14313 
14314   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty;
14315   CHECK_PARSE("AllowShortBlocksOnASingleLine: Never",
14316               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never);
14317   CHECK_PARSE("AllowShortBlocksOnASingleLine: Empty",
14318               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Empty);
14319   CHECK_PARSE("AllowShortBlocksOnASingleLine: Always",
14320               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always);
14321   // For backward compatibility:
14322   CHECK_PARSE("AllowShortBlocksOnASingleLine: false",
14323               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never);
14324   CHECK_PARSE("AllowShortBlocksOnASingleLine: true",
14325               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always);
14326 
14327   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
14328   CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
14329               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
14330   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
14331               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
14332   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
14333               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
14334   CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
14335               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
14336   // For backward compatibility:
14337   CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
14338               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
14339   CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
14340               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
14341 
14342   Style.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Both;
14343   CHECK_PARSE("SpaceAroundPointerQualifiers: Default",
14344               SpaceAroundPointerQualifiers, FormatStyle::SAPQ_Default);
14345   CHECK_PARSE("SpaceAroundPointerQualifiers: Before",
14346               SpaceAroundPointerQualifiers, FormatStyle::SAPQ_Before);
14347   CHECK_PARSE("SpaceAroundPointerQualifiers: After",
14348               SpaceAroundPointerQualifiers, FormatStyle::SAPQ_After);
14349   CHECK_PARSE("SpaceAroundPointerQualifiers: Both",
14350               SpaceAroundPointerQualifiers, FormatStyle::SAPQ_Both);
14351 
14352   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
14353   CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
14354               FormatStyle::SBPO_Never);
14355   CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
14356               FormatStyle::SBPO_Always);
14357   CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
14358               FormatStyle::SBPO_ControlStatements);
14359   CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens,
14360               FormatStyle::SBPO_NonEmptyParentheses);
14361   // For backward compatibility:
14362   CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
14363               FormatStyle::SBPO_Never);
14364   CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
14365               FormatStyle::SBPO_ControlStatements);
14366 
14367   Style.ColumnLimit = 123;
14368   FormatStyle BaseStyle = getLLVMStyle();
14369   CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
14370   CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
14371 
14372   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
14373   CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
14374               FormatStyle::BS_Attach);
14375   CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
14376               FormatStyle::BS_Linux);
14377   CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
14378               FormatStyle::BS_Mozilla);
14379   CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
14380               FormatStyle::BS_Stroustrup);
14381   CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
14382               FormatStyle::BS_Allman);
14383   CHECK_PARSE("BreakBeforeBraces: Whitesmiths", BreakBeforeBraces,
14384               FormatStyle::BS_Whitesmiths);
14385   CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
14386   CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
14387               FormatStyle::BS_WebKit);
14388   CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
14389               FormatStyle::BS_Custom);
14390 
14391   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Never;
14392   CHECK_PARSE("BraceWrapping:\n"
14393               "  AfterControlStatement: MultiLine",
14394               BraceWrapping.AfterControlStatement,
14395               FormatStyle::BWACS_MultiLine);
14396   CHECK_PARSE("BraceWrapping:\n"
14397               "  AfterControlStatement: Always",
14398               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always);
14399   CHECK_PARSE("BraceWrapping:\n"
14400               "  AfterControlStatement: Never",
14401               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never);
14402   // For backward compatibility:
14403   CHECK_PARSE("BraceWrapping:\n"
14404               "  AfterControlStatement: true",
14405               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always);
14406   CHECK_PARSE("BraceWrapping:\n"
14407               "  AfterControlStatement: false",
14408               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never);
14409 
14410   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
14411   CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
14412               FormatStyle::RTBS_None);
14413   CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
14414               FormatStyle::RTBS_All);
14415   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
14416               AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
14417   CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
14418               AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
14419   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
14420               AlwaysBreakAfterReturnType,
14421               FormatStyle::RTBS_TopLevelDefinitions);
14422 
14423   Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
14424   CHECK_PARSE("AlwaysBreakTemplateDeclarations: No",
14425               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_No);
14426   CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine",
14427               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine);
14428   CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes",
14429               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes);
14430   CHECK_PARSE("AlwaysBreakTemplateDeclarations: false",
14431               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine);
14432   CHECK_PARSE("AlwaysBreakTemplateDeclarations: true",
14433               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes);
14434 
14435   Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
14436   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
14437               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
14438   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
14439               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
14440   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
14441               AlwaysBreakAfterDefinitionReturnType,
14442               FormatStyle::DRTBS_TopLevel);
14443 
14444   Style.NamespaceIndentation = FormatStyle::NI_All;
14445   CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
14446               FormatStyle::NI_None);
14447   CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
14448               FormatStyle::NI_Inner);
14449   CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
14450               FormatStyle::NI_All);
14451 
14452   Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always;
14453   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never",
14454               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
14455   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse",
14456               AllowShortIfStatementsOnASingleLine,
14457               FormatStyle::SIS_WithoutElse);
14458   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always",
14459               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always);
14460   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false",
14461               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
14462   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true",
14463               AllowShortIfStatementsOnASingleLine,
14464               FormatStyle::SIS_WithoutElse);
14465 
14466   Style.IndentExternBlock = FormatStyle::IEBS_NoIndent;
14467   CHECK_PARSE("IndentExternBlock: AfterExternBlock", IndentExternBlock,
14468               FormatStyle::IEBS_AfterExternBlock);
14469   CHECK_PARSE("IndentExternBlock: Indent", IndentExternBlock,
14470               FormatStyle::IEBS_Indent);
14471   CHECK_PARSE("IndentExternBlock: NoIndent", IndentExternBlock,
14472               FormatStyle::IEBS_NoIndent);
14473   CHECK_PARSE("IndentExternBlock: true", IndentExternBlock,
14474               FormatStyle::IEBS_Indent);
14475   CHECK_PARSE("IndentExternBlock: false", IndentExternBlock,
14476               FormatStyle::IEBS_NoIndent);
14477 
14478   Style.BitFieldColonSpacing = FormatStyle::BFCS_None;
14479   CHECK_PARSE("BitFieldColonSpacing: Both", BitFieldColonSpacing,
14480               FormatStyle::BFCS_Both);
14481   CHECK_PARSE("BitFieldColonSpacing: None", BitFieldColonSpacing,
14482               FormatStyle::BFCS_None);
14483   CHECK_PARSE("BitFieldColonSpacing: Before", BitFieldColonSpacing,
14484               FormatStyle::BFCS_Before);
14485   CHECK_PARSE("BitFieldColonSpacing: After", BitFieldColonSpacing,
14486               FormatStyle::BFCS_After);
14487 
14488   Style.SortJavaStaticImport = FormatStyle::SJSIO_Before;
14489   CHECK_PARSE("SortJavaStaticImport: After", SortJavaStaticImport,
14490               FormatStyle::SJSIO_After);
14491   CHECK_PARSE("SortJavaStaticImport: Before", SortJavaStaticImport,
14492               FormatStyle::SJSIO_Before);
14493 
14494   // FIXME: This is required because parsing a configuration simply overwrites
14495   // the first N elements of the list instead of resetting it.
14496   Style.ForEachMacros.clear();
14497   std::vector<std::string> BoostForeach;
14498   BoostForeach.push_back("BOOST_FOREACH");
14499   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
14500   std::vector<std::string> BoostAndQForeach;
14501   BoostAndQForeach.push_back("BOOST_FOREACH");
14502   BoostAndQForeach.push_back("Q_FOREACH");
14503   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
14504               BoostAndQForeach);
14505 
14506   Style.AttributeMacros.clear();
14507   CHECK_PARSE("BasedOnStyle: LLVM", AttributeMacros,
14508               std::vector<std::string>{"__capability"});
14509   CHECK_PARSE("AttributeMacros: [attr1, attr2]", AttributeMacros,
14510               std::vector<std::string>({"attr1", "attr2"}));
14511 
14512   Style.StatementMacros.clear();
14513   CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros,
14514               std::vector<std::string>{"QUNUSED"});
14515   CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros,
14516               std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"}));
14517 
14518   Style.NamespaceMacros.clear();
14519   CHECK_PARSE("NamespaceMacros: [TESTSUITE]", NamespaceMacros,
14520               std::vector<std::string>{"TESTSUITE"});
14521   CHECK_PARSE("NamespaceMacros: [TESTSUITE, SUITE]", NamespaceMacros,
14522               std::vector<std::string>({"TESTSUITE", "SUITE"}));
14523 
14524   Style.WhitespaceSensitiveMacros.clear();
14525   CHECK_PARSE("WhitespaceSensitiveMacros: [STRINGIZE]",
14526               WhitespaceSensitiveMacros, std::vector<std::string>{"STRINGIZE"});
14527   CHECK_PARSE("WhitespaceSensitiveMacros: [STRINGIZE, ASSERT]",
14528               WhitespaceSensitiveMacros,
14529               std::vector<std::string>({"STRINGIZE", "ASSERT"}));
14530   Style.WhitespaceSensitiveMacros.clear();
14531   CHECK_PARSE("WhitespaceSensitiveMacros: ['STRINGIZE']",
14532               WhitespaceSensitiveMacros, std::vector<std::string>{"STRINGIZE"});
14533   CHECK_PARSE("WhitespaceSensitiveMacros: ['STRINGIZE', 'ASSERT']",
14534               WhitespaceSensitiveMacros,
14535               std::vector<std::string>({"STRINGIZE", "ASSERT"}));
14536 
14537   Style.IncludeStyle.IncludeCategories.clear();
14538   std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = {
14539       {"abc/.*", 2, 0, false}, {".*", 1, 0, true}};
14540   CHECK_PARSE("IncludeCategories:\n"
14541               "  - Regex: abc/.*\n"
14542               "    Priority: 2\n"
14543               "  - Regex: .*\n"
14544               "    Priority: 1\n"
14545               "    CaseSensitive: true\n",
14546               IncludeStyle.IncludeCategories, ExpectedCategories);
14547   CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex,
14548               "abc$");
14549   CHECK_PARSE("IncludeIsMainSourceRegex: 'abc$'",
14550               IncludeStyle.IncludeIsMainSourceRegex, "abc$");
14551 
14552   Style.RawStringFormats.clear();
14553   std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
14554       {
14555           FormatStyle::LK_TextProto,
14556           {"pb", "proto"},
14557           {"PARSE_TEXT_PROTO"},
14558           /*CanonicalDelimiter=*/"",
14559           "llvm",
14560       },
14561       {
14562           FormatStyle::LK_Cpp,
14563           {"cc", "cpp"},
14564           {"C_CODEBLOCK", "CPPEVAL"},
14565           /*CanonicalDelimiter=*/"cc",
14566           /*BasedOnStyle=*/"",
14567       },
14568   };
14569 
14570   CHECK_PARSE("RawStringFormats:\n"
14571               "  - Language: TextProto\n"
14572               "    Delimiters:\n"
14573               "      - 'pb'\n"
14574               "      - 'proto'\n"
14575               "    EnclosingFunctions:\n"
14576               "      - 'PARSE_TEXT_PROTO'\n"
14577               "    BasedOnStyle: llvm\n"
14578               "  - Language: Cpp\n"
14579               "    Delimiters:\n"
14580               "      - 'cc'\n"
14581               "      - 'cpp'\n"
14582               "    EnclosingFunctions:\n"
14583               "      - 'C_CODEBLOCK'\n"
14584               "      - 'CPPEVAL'\n"
14585               "    CanonicalDelimiter: 'cc'",
14586               RawStringFormats, ExpectedRawStringFormats);
14587 }
14588 
14589 TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
14590   FormatStyle Style = {};
14591   Style.Language = FormatStyle::LK_Cpp;
14592   CHECK_PARSE("Language: Cpp\n"
14593               "IndentWidth: 12",
14594               IndentWidth, 12u);
14595   EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
14596                                "IndentWidth: 34",
14597                                &Style),
14598             ParseError::Unsuitable);
14599   FormatStyle BinPackedTCS = {};
14600   BinPackedTCS.Language = FormatStyle::LK_JavaScript;
14601   EXPECT_EQ(parseConfiguration("BinPackArguments: true\n"
14602                                "InsertTrailingCommas: Wrapped",
14603                                &BinPackedTCS),
14604             ParseError::BinPackTrailingCommaConflict);
14605   EXPECT_EQ(12u, Style.IndentWidth);
14606   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
14607   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
14608 
14609   Style.Language = FormatStyle::LK_JavaScript;
14610   CHECK_PARSE("Language: JavaScript\n"
14611               "IndentWidth: 12",
14612               IndentWidth, 12u);
14613   CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
14614   EXPECT_EQ(parseConfiguration("Language: Cpp\n"
14615                                "IndentWidth: 34",
14616                                &Style),
14617             ParseError::Unsuitable);
14618   EXPECT_EQ(23u, Style.IndentWidth);
14619   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
14620   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
14621 
14622   CHECK_PARSE("BasedOnStyle: LLVM\n"
14623               "IndentWidth: 67",
14624               IndentWidth, 67u);
14625 
14626   CHECK_PARSE("---\n"
14627               "Language: JavaScript\n"
14628               "IndentWidth: 12\n"
14629               "---\n"
14630               "Language: Cpp\n"
14631               "IndentWidth: 34\n"
14632               "...\n",
14633               IndentWidth, 12u);
14634 
14635   Style.Language = FormatStyle::LK_Cpp;
14636   CHECK_PARSE("---\n"
14637               "Language: JavaScript\n"
14638               "IndentWidth: 12\n"
14639               "---\n"
14640               "Language: Cpp\n"
14641               "IndentWidth: 34\n"
14642               "...\n",
14643               IndentWidth, 34u);
14644   CHECK_PARSE("---\n"
14645               "IndentWidth: 78\n"
14646               "---\n"
14647               "Language: JavaScript\n"
14648               "IndentWidth: 56\n"
14649               "...\n",
14650               IndentWidth, 78u);
14651 
14652   Style.ColumnLimit = 123;
14653   Style.IndentWidth = 234;
14654   Style.BreakBeforeBraces = FormatStyle::BS_Linux;
14655   Style.TabWidth = 345;
14656   EXPECT_FALSE(parseConfiguration("---\n"
14657                                   "IndentWidth: 456\n"
14658                                   "BreakBeforeBraces: Allman\n"
14659                                   "---\n"
14660                                   "Language: JavaScript\n"
14661                                   "IndentWidth: 111\n"
14662                                   "TabWidth: 111\n"
14663                                   "---\n"
14664                                   "Language: Cpp\n"
14665                                   "BreakBeforeBraces: Stroustrup\n"
14666                                   "TabWidth: 789\n"
14667                                   "...\n",
14668                                   &Style));
14669   EXPECT_EQ(123u, Style.ColumnLimit);
14670   EXPECT_EQ(456u, Style.IndentWidth);
14671   EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
14672   EXPECT_EQ(789u, Style.TabWidth);
14673 
14674   EXPECT_EQ(parseConfiguration("---\n"
14675                                "Language: JavaScript\n"
14676                                "IndentWidth: 56\n"
14677                                "---\n"
14678                                "IndentWidth: 78\n"
14679                                "...\n",
14680                                &Style),
14681             ParseError::Error);
14682   EXPECT_EQ(parseConfiguration("---\n"
14683                                "Language: JavaScript\n"
14684                                "IndentWidth: 56\n"
14685                                "---\n"
14686                                "Language: JavaScript\n"
14687                                "IndentWidth: 78\n"
14688                                "...\n",
14689                                &Style),
14690             ParseError::Error);
14691 
14692   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
14693 }
14694 
14695 #undef CHECK_PARSE
14696 
14697 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
14698   FormatStyle Style = {};
14699   Style.Language = FormatStyle::LK_JavaScript;
14700   Style.BreakBeforeTernaryOperators = true;
14701   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
14702   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
14703 
14704   Style.BreakBeforeTernaryOperators = true;
14705   EXPECT_EQ(0, parseConfiguration("---\n"
14706                                   "BasedOnStyle: Google\n"
14707                                   "---\n"
14708                                   "Language: JavaScript\n"
14709                                   "IndentWidth: 76\n"
14710                                   "...\n",
14711                                   &Style)
14712                    .value());
14713   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
14714   EXPECT_EQ(76u, Style.IndentWidth);
14715   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
14716 }
14717 
14718 TEST_F(FormatTest, ConfigurationRoundTripTest) {
14719   FormatStyle Style = getLLVMStyle();
14720   std::string YAML = configurationAsText(Style);
14721   FormatStyle ParsedStyle = {};
14722   ParsedStyle.Language = FormatStyle::LK_Cpp;
14723   EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
14724   EXPECT_EQ(Style, ParsedStyle);
14725 }
14726 
14727 TEST_F(FormatTest, WorksFor8bitEncodings) {
14728   EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
14729             "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
14730             "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
14731             "\"\xef\xee\xf0\xf3...\"",
14732             format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
14733                    "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
14734                    "\xef\xee\xf0\xf3...\"",
14735                    getLLVMStyleWithColumns(12)));
14736 }
14737 
14738 TEST_F(FormatTest, HandlesUTF8BOM) {
14739   EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
14740   EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
14741             format("\xef\xbb\xbf#include <iostream>"));
14742   EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
14743             format("\xef\xbb\xbf\n#include <iostream>"));
14744 }
14745 
14746 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
14747 #if !defined(_MSC_VER)
14748 
14749 TEST_F(FormatTest, CountsUTF8CharactersProperly) {
14750   verifyFormat("\"Однажды в студёную зимнюю пору...\"",
14751                getLLVMStyleWithColumns(35));
14752   verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
14753                getLLVMStyleWithColumns(31));
14754   verifyFormat("// Однажды в студёную зимнюю пору...",
14755                getLLVMStyleWithColumns(36));
14756   verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
14757   verifyFormat("/* Однажды в студёную зимнюю пору... */",
14758                getLLVMStyleWithColumns(39));
14759   verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
14760                getLLVMStyleWithColumns(35));
14761 }
14762 
14763 TEST_F(FormatTest, SplitsUTF8Strings) {
14764   // Non-printable characters' width is currently considered to be the length in
14765   // bytes in UTF8. The characters can be displayed in very different manner
14766   // (zero-width, single width with a substitution glyph, expanded to their code
14767   // (e.g. "<8d>"), so there's no single correct way to handle them.
14768   EXPECT_EQ("\"aaaaÄ\"\n"
14769             "\"\xc2\x8d\";",
14770             format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
14771   EXPECT_EQ("\"aaaaaaaÄ\"\n"
14772             "\"\xc2\x8d\";",
14773             format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
14774   EXPECT_EQ("\"Однажды, в \"\n"
14775             "\"студёную \"\n"
14776             "\"зимнюю \"\n"
14777             "\"пору,\"",
14778             format("\"Однажды, в студёную зимнюю пору,\"",
14779                    getLLVMStyleWithColumns(13)));
14780   EXPECT_EQ(
14781       "\"一 二 三 \"\n"
14782       "\"四 五六 \"\n"
14783       "\"七 八 九 \"\n"
14784       "\"十\"",
14785       format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
14786   EXPECT_EQ("\"一\t\"\n"
14787             "\"二 \t\"\n"
14788             "\"三 四 \"\n"
14789             "\"五\t\"\n"
14790             "\"六 \t\"\n"
14791             "\"七 \"\n"
14792             "\"八九十\tqq\"",
14793             format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
14794                    getLLVMStyleWithColumns(11)));
14795 
14796   // UTF8 character in an escape sequence.
14797   EXPECT_EQ("\"aaaaaa\"\n"
14798             "\"\\\xC2\x8D\"",
14799             format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
14800 }
14801 
14802 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
14803   EXPECT_EQ("const char *sssss =\n"
14804             "    \"一二三四五六七八\\\n"
14805             " 九 十\";",
14806             format("const char *sssss = \"一二三四五六七八\\\n"
14807                    " 九 十\";",
14808                    getLLVMStyleWithColumns(30)));
14809 }
14810 
14811 TEST_F(FormatTest, SplitsUTF8LineComments) {
14812   EXPECT_EQ("// aaaaÄ\xc2\x8d",
14813             format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
14814   EXPECT_EQ("// Я из лесу\n"
14815             "// вышел; был\n"
14816             "// сильный\n"
14817             "// мороз.",
14818             format("// Я из лесу вышел; был сильный мороз.",
14819                    getLLVMStyleWithColumns(13)));
14820   EXPECT_EQ("// 一二三\n"
14821             "// 四五六七\n"
14822             "// 八  九\n"
14823             "// 十",
14824             format("// 一二三 四五六七 八  九 十", getLLVMStyleWithColumns(9)));
14825 }
14826 
14827 TEST_F(FormatTest, SplitsUTF8BlockComments) {
14828   EXPECT_EQ("/* Гляжу,\n"
14829             " * поднимается\n"
14830             " * медленно в\n"
14831             " * гору\n"
14832             " * Лошадка,\n"
14833             " * везущая\n"
14834             " * хворосту\n"
14835             " * воз. */",
14836             format("/* Гляжу, поднимается медленно в гору\n"
14837                    " * Лошадка, везущая хворосту воз. */",
14838                    getLLVMStyleWithColumns(13)));
14839   EXPECT_EQ(
14840       "/* 一二三\n"
14841       " * 四五六七\n"
14842       " * 八  九\n"
14843       " * 十  */",
14844       format("/* 一二三 四五六七 八  九 十  */", getLLVMStyleWithColumns(9)));
14845   EXPECT_EQ("/* �������� ��������\n"
14846             " * ��������\n"
14847             " * ������-�� */",
14848             format("/* �������� �������� �������� ������-�� */", getLLVMStyleWithColumns(12)));
14849 }
14850 
14851 #endif // _MSC_VER
14852 
14853 TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
14854   FormatStyle Style = getLLVMStyle();
14855 
14856   Style.ConstructorInitializerIndentWidth = 4;
14857   verifyFormat(
14858       "SomeClass::Constructor()\n"
14859       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
14860       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
14861       Style);
14862 
14863   Style.ConstructorInitializerIndentWidth = 2;
14864   verifyFormat(
14865       "SomeClass::Constructor()\n"
14866       "  : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
14867       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
14868       Style);
14869 
14870   Style.ConstructorInitializerIndentWidth = 0;
14871   verifyFormat(
14872       "SomeClass::Constructor()\n"
14873       ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
14874       "  aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
14875       Style);
14876   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
14877   verifyFormat(
14878       "SomeLongTemplateVariableName<\n"
14879       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
14880       Style);
14881   verifyFormat("bool smaller = 1 < "
14882                "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
14883                "                       "
14884                "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
14885                Style);
14886 
14887   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
14888   verifyFormat("SomeClass::Constructor() :\n"
14889                "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n"
14890                "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}",
14891                Style);
14892 }
14893 
14894 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
14895   FormatStyle Style = getLLVMStyle();
14896   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
14897   Style.ConstructorInitializerIndentWidth = 4;
14898   verifyFormat("SomeClass::Constructor()\n"
14899                "    : a(a)\n"
14900                "    , b(b)\n"
14901                "    , c(c) {}",
14902                Style);
14903   verifyFormat("SomeClass::Constructor()\n"
14904                "    : a(a) {}",
14905                Style);
14906 
14907   Style.ColumnLimit = 0;
14908   verifyFormat("SomeClass::Constructor()\n"
14909                "    : a(a) {}",
14910                Style);
14911   verifyFormat("SomeClass::Constructor() noexcept\n"
14912                "    : a(a) {}",
14913                Style);
14914   verifyFormat("SomeClass::Constructor()\n"
14915                "    : a(a)\n"
14916                "    , b(b)\n"
14917                "    , c(c) {}",
14918                Style);
14919   verifyFormat("SomeClass::Constructor()\n"
14920                "    : a(a) {\n"
14921                "  foo();\n"
14922                "  bar();\n"
14923                "}",
14924                Style);
14925 
14926   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
14927   verifyFormat("SomeClass::Constructor()\n"
14928                "    : a(a)\n"
14929                "    , b(b)\n"
14930                "    , c(c) {\n}",
14931                Style);
14932   verifyFormat("SomeClass::Constructor()\n"
14933                "    : a(a) {\n}",
14934                Style);
14935 
14936   Style.ColumnLimit = 80;
14937   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
14938   Style.ConstructorInitializerIndentWidth = 2;
14939   verifyFormat("SomeClass::Constructor()\n"
14940                "  : a(a)\n"
14941                "  , b(b)\n"
14942                "  , c(c) {}",
14943                Style);
14944 
14945   Style.ConstructorInitializerIndentWidth = 0;
14946   verifyFormat("SomeClass::Constructor()\n"
14947                ": a(a)\n"
14948                ", b(b)\n"
14949                ", c(c) {}",
14950                Style);
14951 
14952   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
14953   Style.ConstructorInitializerIndentWidth = 4;
14954   verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
14955   verifyFormat(
14956       "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
14957       Style);
14958   verifyFormat(
14959       "SomeClass::Constructor()\n"
14960       "    : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
14961       Style);
14962   Style.ConstructorInitializerIndentWidth = 4;
14963   Style.ColumnLimit = 60;
14964   verifyFormat("SomeClass::Constructor()\n"
14965                "    : aaaaaaaa(aaaaaaaa)\n"
14966                "    , aaaaaaaa(aaaaaaaa)\n"
14967                "    , aaaaaaaa(aaaaaaaa) {}",
14968                Style);
14969 }
14970 
14971 TEST_F(FormatTest, Destructors) {
14972   verifyFormat("void F(int &i) { i.~int(); }");
14973   verifyFormat("void F(int &i) { i->~int(); }");
14974 }
14975 
14976 TEST_F(FormatTest, FormatsWithWebKitStyle) {
14977   FormatStyle Style = getWebKitStyle();
14978 
14979   // Don't indent in outer namespaces.
14980   verifyFormat("namespace outer {\n"
14981                "int i;\n"
14982                "namespace inner {\n"
14983                "    int i;\n"
14984                "} // namespace inner\n"
14985                "} // namespace outer\n"
14986                "namespace other_outer {\n"
14987                "int i;\n"
14988                "}",
14989                Style);
14990 
14991   // Don't indent case labels.
14992   verifyFormat("switch (variable) {\n"
14993                "case 1:\n"
14994                "case 2:\n"
14995                "    doSomething();\n"
14996                "    break;\n"
14997                "default:\n"
14998                "    ++variable;\n"
14999                "}",
15000                Style);
15001 
15002   // Wrap before binary operators.
15003   EXPECT_EQ("void f()\n"
15004             "{\n"
15005             "    if (aaaaaaaaaaaaaaaa\n"
15006             "        && bbbbbbbbbbbbbbbbbbbbbbbb\n"
15007             "        && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
15008             "        return;\n"
15009             "}",
15010             format("void f() {\n"
15011                    "if (aaaaaaaaaaaaaaaa\n"
15012                    "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
15013                    "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
15014                    "return;\n"
15015                    "}",
15016                    Style));
15017 
15018   // Allow functions on a single line.
15019   verifyFormat("void f() { return; }", Style);
15020 
15021   // Allow empty blocks on a single line and insert a space in empty blocks.
15022   EXPECT_EQ("void f() { }", format("void f() {}", Style));
15023   EXPECT_EQ("while (true) { }", format("while (true) {}", Style));
15024   // However, don't merge non-empty short loops.
15025   EXPECT_EQ("while (true) {\n"
15026             "    continue;\n"
15027             "}",
15028             format("while (true) { continue; }", Style));
15029 
15030   // Constructor initializers are formatted one per line with the "," on the
15031   // new line.
15032   verifyFormat("Constructor()\n"
15033                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
15034                "    , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
15035                "          aaaaaaaaaaaaaa)\n"
15036                "    , aaaaaaaaaaaaaaaaaaaaaaa()\n"
15037                "{\n"
15038                "}",
15039                Style);
15040   verifyFormat("SomeClass::Constructor()\n"
15041                "    : a(a)\n"
15042                "{\n"
15043                "}",
15044                Style);
15045   EXPECT_EQ("SomeClass::Constructor()\n"
15046             "    : a(a)\n"
15047             "{\n"
15048             "}",
15049             format("SomeClass::Constructor():a(a){}", Style));
15050   verifyFormat("SomeClass::Constructor()\n"
15051                "    : a(a)\n"
15052                "    , b(b)\n"
15053                "    , c(c)\n"
15054                "{\n"
15055                "}",
15056                Style);
15057   verifyFormat("SomeClass::Constructor()\n"
15058                "    : a(a)\n"
15059                "{\n"
15060                "    foo();\n"
15061                "    bar();\n"
15062                "}",
15063                Style);
15064 
15065   // Access specifiers should be aligned left.
15066   verifyFormat("class C {\n"
15067                "public:\n"
15068                "    int i;\n"
15069                "};",
15070                Style);
15071 
15072   // Do not align comments.
15073   verifyFormat("int a; // Do not\n"
15074                "double b; // align comments.",
15075                Style);
15076 
15077   // Do not align operands.
15078   EXPECT_EQ("ASSERT(aaaa\n"
15079             "    || bbbb);",
15080             format("ASSERT ( aaaa\n||bbbb);", Style));
15081 
15082   // Accept input's line breaks.
15083   EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
15084             "    || bbbbbbbbbbbbbbb) {\n"
15085             "    i++;\n"
15086             "}",
15087             format("if (aaaaaaaaaaaaaaa\n"
15088                    "|| bbbbbbbbbbbbbbb) { i++; }",
15089                    Style));
15090   EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
15091             "    i++;\n"
15092             "}",
15093             format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
15094 
15095   // Don't automatically break all macro definitions (llvm.org/PR17842).
15096   verifyFormat("#define aNumber 10", Style);
15097   // However, generally keep the line breaks that the user authored.
15098   EXPECT_EQ("#define aNumber \\\n"
15099             "    10",
15100             format("#define aNumber \\\n"
15101                    " 10",
15102                    Style));
15103 
15104   // Keep empty and one-element array literals on a single line.
15105   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
15106             "                                  copyItems:YES];",
15107             format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
15108                    "copyItems:YES];",
15109                    Style));
15110   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
15111             "                                  copyItems:YES];",
15112             format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
15113                    "             copyItems:YES];",
15114                    Style));
15115   // FIXME: This does not seem right, there should be more indentation before
15116   // the array literal's entries. Nested blocks have the same problem.
15117   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
15118             "    @\"a\",\n"
15119             "    @\"a\"\n"
15120             "]\n"
15121             "                                  copyItems:YES];",
15122             format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
15123                    "     @\"a\",\n"
15124                    "     @\"a\"\n"
15125                    "     ]\n"
15126                    "       copyItems:YES];",
15127                    Style));
15128   EXPECT_EQ(
15129       "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
15130       "                                  copyItems:YES];",
15131       format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
15132              "   copyItems:YES];",
15133              Style));
15134 
15135   verifyFormat("[self.a b:c c:d];", Style);
15136   EXPECT_EQ("[self.a b:c\n"
15137             "        c:d];",
15138             format("[self.a b:c\n"
15139                    "c:d];",
15140                    Style));
15141 }
15142 
15143 TEST_F(FormatTest, FormatsLambdas) {
15144   verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
15145   verifyFormat(
15146       "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n");
15147   verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
15148   verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
15149   verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
15150   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
15151   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
15152   verifyFormat("auto c = [a = [b = 42] {}] {};\n");
15153   verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
15154   verifyFormat("int x = f(*+[] {});");
15155   verifyFormat("void f() {\n"
15156                "  other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
15157                "}\n");
15158   verifyFormat("void f() {\n"
15159                "  other(x.begin(), //\n"
15160                "        x.end(),   //\n"
15161                "        [&](int, int) { return 1; });\n"
15162                "}\n");
15163   verifyFormat("void f() {\n"
15164                "  other.other.other.other.other(\n"
15165                "      x.begin(), x.end(),\n"
15166                "      [something, rather](int, int, int, int, int, int, int) { "
15167                "return 1; });\n"
15168                "}\n");
15169   verifyFormat(
15170       "void f() {\n"
15171       "  other.other.other.other.other(\n"
15172       "      x.begin(), x.end(),\n"
15173       "      [something, rather](int, int, int, int, int, int, int) {\n"
15174       "        //\n"
15175       "      });\n"
15176       "}\n");
15177   verifyFormat("SomeFunction([]() { // A cool function...\n"
15178                "  return 43;\n"
15179                "});");
15180   EXPECT_EQ("SomeFunction([]() {\n"
15181             "#define A a\n"
15182             "  return 43;\n"
15183             "});",
15184             format("SomeFunction([](){\n"
15185                    "#define A a\n"
15186                    "return 43;\n"
15187                    "});"));
15188   verifyFormat("void f() {\n"
15189                "  SomeFunction([](decltype(x), A *a) {});\n"
15190                "  SomeFunction([](typeof(x), A *a) {});\n"
15191                "  SomeFunction([](_Atomic(x), A *a) {});\n"
15192                "  SomeFunction([](__underlying_type(x), A *a) {});\n"
15193                "}");
15194   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
15195                "    [](const aaaaaaaaaa &a) { return a; });");
15196   verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
15197                "  SomeOtherFunctioooooooooooooooooooooooooon();\n"
15198                "});");
15199   verifyFormat("Constructor()\n"
15200                "    : Field([] { // comment\n"
15201                "        int i;\n"
15202                "      }) {}");
15203   verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
15204                "  return some_parameter.size();\n"
15205                "};");
15206   verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
15207                "    [](const string &s) { return s; };");
15208   verifyFormat("int i = aaaaaa ? 1 //\n"
15209                "               : [] {\n"
15210                "                   return 2; //\n"
15211                "                 }();");
15212   verifyFormat("llvm::errs() << \"number of twos is \"\n"
15213                "             << std::count_if(v.begin(), v.end(), [](int x) {\n"
15214                "                  return x == 2; // force break\n"
15215                "                });");
15216   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
15217                "    [=](int iiiiiiiiiiii) {\n"
15218                "      return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
15219                "             aaaaaaaaaaaaaaaaaaaaaaa;\n"
15220                "    });",
15221                getLLVMStyleWithColumns(60));
15222   verifyFormat("SomeFunction({[&] {\n"
15223                "                // comment\n"
15224                "              },\n"
15225                "              [&] {\n"
15226                "                // comment\n"
15227                "              }});");
15228   verifyFormat("SomeFunction({[&] {\n"
15229                "  // comment\n"
15230                "}});");
15231   verifyFormat(
15232       "virtual aaaaaaaaaaaaaaaa(\n"
15233       "    std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n"
15234       "    aaaaa aaaaaaaaa);");
15235 
15236   // Lambdas with return types.
15237   verifyFormat("int c = []() -> int { return 2; }();\n");
15238   verifyFormat("int c = []() -> int * { return 2; }();\n");
15239   verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
15240   verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
15241   verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
15242   verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
15243   verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
15244   verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
15245   verifyFormat("[a, a]() -> a<1> {};");
15246   verifyFormat("[]() -> foo<5 + 2> { return {}; };");
15247   verifyFormat("[]() -> foo<5 - 2> { return {}; };");
15248   verifyFormat("[]() -> foo<5 / 2> { return {}; };");
15249   verifyFormat("[]() -> foo<5 * 2> { return {}; };");
15250   verifyFormat("[]() -> foo<5 % 2> { return {}; };");
15251   verifyFormat("[]() -> foo<5 << 2> { return {}; };");
15252   verifyFormat("[]() -> foo<!5> { return {}; };");
15253   verifyFormat("[]() -> foo<~5> { return {}; };");
15254   verifyFormat("[]() -> foo<5 | 2> { return {}; };");
15255   verifyFormat("[]() -> foo<5 || 2> { return {}; };");
15256   verifyFormat("[]() -> foo<5 & 2> { return {}; };");
15257   verifyFormat("[]() -> foo<5 && 2> { return {}; };");
15258   verifyFormat("[]() -> foo<5 == 2> { return {}; };");
15259   verifyFormat("[]() -> foo<5 != 2> { return {}; };");
15260   verifyFormat("[]() -> foo<5 >= 2> { return {}; };");
15261   verifyFormat("[]() -> foo<5 <= 2> { return {}; };");
15262   verifyFormat("[]() -> foo<5 < 2> { return {}; };");
15263   verifyFormat("[]() -> foo<2 ? 1 : 0> { return {}; };");
15264   verifyFormat("namespace bar {\n"
15265                "// broken:\n"
15266                "auto foo{[]() -> foo<5 + 2> { return {}; }};\n"
15267                "} // namespace bar");
15268   verifyFormat("namespace bar {\n"
15269                "// broken:\n"
15270                "auto foo{[]() -> foo<5 - 2> { return {}; }};\n"
15271                "} // namespace bar");
15272   verifyFormat("namespace bar {\n"
15273                "// broken:\n"
15274                "auto foo{[]() -> foo<5 / 2> { return {}; }};\n"
15275                "} // namespace bar");
15276   verifyFormat("namespace bar {\n"
15277                "// broken:\n"
15278                "auto foo{[]() -> foo<5 * 2> { return {}; }};\n"
15279                "} // namespace bar");
15280   verifyFormat("namespace bar {\n"
15281                "// broken:\n"
15282                "auto foo{[]() -> foo<5 % 2> { return {}; }};\n"
15283                "} // namespace bar");
15284   verifyFormat("namespace bar {\n"
15285                "// broken:\n"
15286                "auto foo{[]() -> foo<5 << 2> { return {}; }};\n"
15287                "} // namespace bar");
15288   verifyFormat("namespace bar {\n"
15289                "// broken:\n"
15290                "auto foo{[]() -> foo<!5> { return {}; }};\n"
15291                "} // namespace bar");
15292   verifyFormat("namespace bar {\n"
15293                "// broken:\n"
15294                "auto foo{[]() -> foo<~5> { return {}; }};\n"
15295                "} // namespace bar");
15296   verifyFormat("namespace bar {\n"
15297                "// broken:\n"
15298                "auto foo{[]() -> foo<5 | 2> { return {}; }};\n"
15299                "} // namespace bar");
15300   verifyFormat("namespace bar {\n"
15301                "// broken:\n"
15302                "auto foo{[]() -> foo<5 || 2> { return {}; }};\n"
15303                "} // namespace bar");
15304   verifyFormat("namespace bar {\n"
15305                "// broken:\n"
15306                "auto foo{[]() -> foo<5 & 2> { return {}; }};\n"
15307                "} // namespace bar");
15308   verifyFormat("namespace bar {\n"
15309                "// broken:\n"
15310                "auto foo{[]() -> foo<5 && 2> { return {}; }};\n"
15311                "} // namespace bar");
15312   verifyFormat("namespace bar {\n"
15313                "// broken:\n"
15314                "auto foo{[]() -> foo<5 == 2> { return {}; }};\n"
15315                "} // namespace bar");
15316   verifyFormat("namespace bar {\n"
15317                "// broken:\n"
15318                "auto foo{[]() -> foo<5 != 2> { return {}; }};\n"
15319                "} // namespace bar");
15320   verifyFormat("namespace bar {\n"
15321                "// broken:\n"
15322                "auto foo{[]() -> foo<5 >= 2> { return {}; }};\n"
15323                "} // namespace bar");
15324   verifyFormat("namespace bar {\n"
15325                "// broken:\n"
15326                "auto foo{[]() -> foo<5 <= 2> { return {}; }};\n"
15327                "} // namespace bar");
15328   verifyFormat("namespace bar {\n"
15329                "// broken:\n"
15330                "auto foo{[]() -> foo<5 < 2> { return {}; }};\n"
15331                "} // namespace bar");
15332   verifyFormat("namespace bar {\n"
15333                "// broken:\n"
15334                "auto foo{[]() -> foo<2 ? 1 : 0> { return {}; }};\n"
15335                "} // namespace bar");
15336   verifyFormat("[]() -> a<1> {};");
15337   verifyFormat("[]() -> a<1> { ; };");
15338   verifyFormat("[]() -> a<1> { ; }();");
15339   verifyFormat("[a, a]() -> a<true> {};");
15340   verifyFormat("[]() -> a<true> {};");
15341   verifyFormat("[]() -> a<true> { ; };");
15342   verifyFormat("[]() -> a<true> { ; }();");
15343   verifyFormat("[a, a]() -> a<false> {};");
15344   verifyFormat("[]() -> a<false> {};");
15345   verifyFormat("[]() -> a<false> { ; };");
15346   verifyFormat("[]() -> a<false> { ; }();");
15347   verifyFormat("auto foo{[]() -> foo<false> { ; }};");
15348   verifyFormat("namespace bar {\n"
15349                "auto foo{[]() -> foo<false> { ; }};\n"
15350                "} // namespace bar");
15351   verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
15352                "                   int j) -> int {\n"
15353                "  return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
15354                "};");
15355   verifyFormat(
15356       "aaaaaaaaaaaaaaaaaaaaaa(\n"
15357       "    [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
15358       "      return aaaaaaaaaaaaaaaaa;\n"
15359       "    });",
15360       getLLVMStyleWithColumns(70));
15361   verifyFormat("[]() //\n"
15362                "    -> int {\n"
15363                "  return 1; //\n"
15364                "};");
15365   verifyFormat("[]() -> Void<T...> {};");
15366   verifyFormat("[a, b]() -> Tuple<T...> { return {}; };");
15367 
15368   // Lambdas with explicit template argument lists.
15369   verifyFormat(
15370       "auto L = []<template <typename> class T, class U>(T<U> &&a) {};\n");
15371 
15372   // Multiple lambdas in the same parentheses change indentation rules. These
15373   // lambdas are forced to start on new lines.
15374   verifyFormat("SomeFunction(\n"
15375                "    []() {\n"
15376                "      //\n"
15377                "    },\n"
15378                "    []() {\n"
15379                "      //\n"
15380                "    });");
15381 
15382   // A lambda passed as arg0 is always pushed to the next line.
15383   verifyFormat("SomeFunction(\n"
15384                "    [this] {\n"
15385                "      //\n"
15386                "    },\n"
15387                "    1);\n");
15388 
15389   // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like
15390   // the arg0 case above.
15391   auto Style = getGoogleStyle();
15392   Style.BinPackArguments = false;
15393   verifyFormat("SomeFunction(\n"
15394                "    a,\n"
15395                "    [this] {\n"
15396                "      //\n"
15397                "    },\n"
15398                "    b);\n",
15399                Style);
15400   verifyFormat("SomeFunction(\n"
15401                "    a,\n"
15402                "    [this] {\n"
15403                "      //\n"
15404                "    },\n"
15405                "    b);\n");
15406 
15407   // A lambda with a very long line forces arg0 to be pushed out irrespective of
15408   // the BinPackArguments value (as long as the code is wide enough).
15409   verifyFormat(
15410       "something->SomeFunction(\n"
15411       "    a,\n"
15412       "    [this] {\n"
15413       "      "
15414       "D0000000000000000000000000000000000000000000000000000000000001();\n"
15415       "    },\n"
15416       "    b);\n");
15417 
15418   // A multi-line lambda is pulled up as long as the introducer fits on the
15419   // previous line and there are no further args.
15420   verifyFormat("function(1, [this, that] {\n"
15421                "  //\n"
15422                "});\n");
15423   verifyFormat("function([this, that] {\n"
15424                "  //\n"
15425                "});\n");
15426   // FIXME: this format is not ideal and we should consider forcing the first
15427   // arg onto its own line.
15428   verifyFormat("function(a, b, c, //\n"
15429                "         d, [this, that] {\n"
15430                "           //\n"
15431                "         });\n");
15432 
15433   // Multiple lambdas are treated correctly even when there is a short arg0.
15434   verifyFormat("SomeFunction(\n"
15435                "    1,\n"
15436                "    [this] {\n"
15437                "      //\n"
15438                "    },\n"
15439                "    [this] {\n"
15440                "      //\n"
15441                "    },\n"
15442                "    1);\n");
15443 
15444   // More complex introducers.
15445   verifyFormat("return [i, args...] {};");
15446 
15447   // Not lambdas.
15448   verifyFormat("constexpr char hello[]{\"hello\"};");
15449   verifyFormat("double &operator[](int i) { return 0; }\n"
15450                "int i;");
15451   verifyFormat("std::unique_ptr<int[]> foo() {}");
15452   verifyFormat("int i = a[a][a]->f();");
15453   verifyFormat("int i = (*b)[a]->f();");
15454 
15455   // Other corner cases.
15456   verifyFormat("void f() {\n"
15457                "  bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
15458                "  );\n"
15459                "}");
15460 
15461   // Lambdas created through weird macros.
15462   verifyFormat("void f() {\n"
15463                "  MACRO((const AA &a) { return 1; });\n"
15464                "  MACRO((AA &a) { return 1; });\n"
15465                "}");
15466 
15467   verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
15468                "      doo_dah();\n"
15469                "      doo_dah();\n"
15470                "    })) {\n"
15471                "}");
15472   verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
15473                "                doo_dah();\n"
15474                "                doo_dah();\n"
15475                "              })) {\n"
15476                "}");
15477   verifyFormat("if CONSTEXPR (blah_blah(whatever, whatever, [] {\n"
15478                "                doo_dah();\n"
15479                "                doo_dah();\n"
15480                "              })) {\n"
15481                "}");
15482   verifyFormat("auto lambda = []() {\n"
15483                "  int a = 2\n"
15484                "#if A\n"
15485                "          + 2\n"
15486                "#endif\n"
15487                "      ;\n"
15488                "};");
15489 
15490   // Lambdas with complex multiline introducers.
15491   verifyFormat(
15492       "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
15493       "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
15494       "        -> ::std::unordered_set<\n"
15495       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
15496       "      //\n"
15497       "    });");
15498 
15499   FormatStyle DoNotMerge = getLLVMStyle();
15500   DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None;
15501   verifyFormat("auto c = []() {\n"
15502                "  return b;\n"
15503                "};",
15504                "auto c = []() { return b; };", DoNotMerge);
15505   verifyFormat("auto c = []() {\n"
15506                "};",
15507                " auto c = []() {};", DoNotMerge);
15508 
15509   FormatStyle MergeEmptyOnly = getLLVMStyle();
15510   MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty;
15511   verifyFormat("auto c = []() {\n"
15512                "  return b;\n"
15513                "};",
15514                "auto c = []() {\n"
15515                "  return b;\n"
15516                " };",
15517                MergeEmptyOnly);
15518   verifyFormat("auto c = []() {};",
15519                "auto c = []() {\n"
15520                "};",
15521                MergeEmptyOnly);
15522 
15523   FormatStyle MergeInline = getLLVMStyle();
15524   MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline;
15525   verifyFormat("auto c = []() {\n"
15526                "  return b;\n"
15527                "};",
15528                "auto c = []() { return b; };", MergeInline);
15529   verifyFormat("function([]() { return b; })", "function([]() { return b; })",
15530                MergeInline);
15531   verifyFormat("function([]() { return b; }, a)",
15532                "function([]() { return b; }, a)", MergeInline);
15533   verifyFormat("function(a, []() { return b; })",
15534                "function(a, []() { return b; })", MergeInline);
15535 
15536   // Check option "BraceWrapping.BeforeLambdaBody" and different state of
15537   // AllowShortLambdasOnASingleLine
15538   FormatStyle LLVMWithBeforeLambdaBody = getLLVMStyle();
15539   LLVMWithBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom;
15540   LLVMWithBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true;
15541   LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine =
15542       FormatStyle::ShortLambdaStyle::SLS_None;
15543   verifyFormat("FctWithOneNestedLambdaInline_SLS_None(\n"
15544                "    []()\n"
15545                "    {\n"
15546                "      return 17;\n"
15547                "    });",
15548                LLVMWithBeforeLambdaBody);
15549   verifyFormat("FctWithOneNestedLambdaEmpty_SLS_None(\n"
15550                "    []()\n"
15551                "    {\n"
15552                "    });",
15553                LLVMWithBeforeLambdaBody);
15554   verifyFormat("auto fct_SLS_None = []()\n"
15555                "{\n"
15556                "  return 17;\n"
15557                "};",
15558                LLVMWithBeforeLambdaBody);
15559   verifyFormat("TwoNestedLambdas_SLS_None(\n"
15560                "    []()\n"
15561                "    {\n"
15562                "      return Call(\n"
15563                "          []()\n"
15564                "          {\n"
15565                "            return 17;\n"
15566                "          });\n"
15567                "    });",
15568                LLVMWithBeforeLambdaBody);
15569   verifyFormat("void Fct()\n"
15570                "{\n"
15571                "  return {[]()\n"
15572                "          {\n"
15573                "            return 17;\n"
15574                "          }};\n"
15575                "}",
15576                LLVMWithBeforeLambdaBody);
15577 
15578   LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine =
15579       FormatStyle::ShortLambdaStyle::SLS_Empty;
15580   verifyFormat("FctWithOneNestedLambdaInline_SLS_Empty(\n"
15581                "    []()\n"
15582                "    {\n"
15583                "      return 17;\n"
15584                "    });",
15585                LLVMWithBeforeLambdaBody);
15586   verifyFormat("FctWithOneNestedLambdaEmpty_SLS_Empty([]() {});",
15587                LLVMWithBeforeLambdaBody);
15588   verifyFormat("FctWithOneNestedLambdaEmptyInsideAVeryVeryVeryVeryVeryVeryVeryL"
15589                "ongFunctionName_SLS_Empty(\n"
15590                "    []() {});",
15591                LLVMWithBeforeLambdaBody);
15592   verifyFormat("FctWithMultipleParams_SLS_Empty(A, B,\n"
15593                "                                []()\n"
15594                "                                {\n"
15595                "                                  return 17;\n"
15596                "                                });",
15597                LLVMWithBeforeLambdaBody);
15598   verifyFormat("auto fct_SLS_Empty = []()\n"
15599                "{\n"
15600                "  return 17;\n"
15601                "};",
15602                LLVMWithBeforeLambdaBody);
15603   verifyFormat("TwoNestedLambdas_SLS_Empty(\n"
15604                "    []()\n"
15605                "    {\n"
15606                "      return Call([]() {});\n"
15607                "    });",
15608                LLVMWithBeforeLambdaBody);
15609   verifyFormat("TwoNestedLambdas_SLS_Empty(A,\n"
15610                "                           []()\n"
15611                "                           {\n"
15612                "                             return Call([]() {});\n"
15613                "                           });",
15614                LLVMWithBeforeLambdaBody);
15615   verifyFormat(
15616       "FctWithLongLineInLambda_SLS_Empty(\n"
15617       "    []()\n"
15618       "    {\n"
15619       "      return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n"
15620       "                               AndShouldNotBeConsiderAsInline,\n"
15621       "                               LambdaBodyMustBeBreak);\n"
15622       "    });",
15623       LLVMWithBeforeLambdaBody);
15624 
15625   LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine =
15626       FormatStyle::ShortLambdaStyle::SLS_Inline;
15627   verifyFormat("FctWithOneNestedLambdaInline_SLS_Inline([]() { return 17; });",
15628                LLVMWithBeforeLambdaBody);
15629   verifyFormat("FctWithOneNestedLambdaEmpty_SLS_Inline([]() {});",
15630                LLVMWithBeforeLambdaBody);
15631   verifyFormat("auto fct_SLS_Inline = []()\n"
15632                "{\n"
15633                "  return 17;\n"
15634                "};",
15635                LLVMWithBeforeLambdaBody);
15636   verifyFormat("TwoNestedLambdas_SLS_Inline([]() { return Call([]() { return "
15637                "17; }); });",
15638                LLVMWithBeforeLambdaBody);
15639   verifyFormat(
15640       "FctWithLongLineInLambda_SLS_Inline(\n"
15641       "    []()\n"
15642       "    {\n"
15643       "      return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n"
15644       "                               AndShouldNotBeConsiderAsInline,\n"
15645       "                               LambdaBodyMustBeBreak);\n"
15646       "    });",
15647       LLVMWithBeforeLambdaBody);
15648   verifyFormat("FctWithMultipleParams_SLS_Inline("
15649                "VeryLongParameterThatShouldAskToBeOnMultiLine,\n"
15650                "                                 []() { return 17; });",
15651                LLVMWithBeforeLambdaBody);
15652   verifyFormat(
15653       "FctWithMultipleParams_SLS_Inline(FirstParam, []() { return 17; });",
15654       LLVMWithBeforeLambdaBody);
15655 
15656   LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine =
15657       FormatStyle::ShortLambdaStyle::SLS_All;
15658   verifyFormat("FctWithOneNestedLambdaInline_SLS_All([]() { return 17; });",
15659                LLVMWithBeforeLambdaBody);
15660   verifyFormat("FctWithOneNestedLambdaEmpty_SLS_All([]() {});",
15661                LLVMWithBeforeLambdaBody);
15662   verifyFormat("auto fct_SLS_All = []() { return 17; };",
15663                LLVMWithBeforeLambdaBody);
15664   verifyFormat("FctWithOneParam_SLS_All(\n"
15665                "    []()\n"
15666                "    {\n"
15667                "      // A cool function...\n"
15668                "      return 43;\n"
15669                "    });",
15670                LLVMWithBeforeLambdaBody);
15671   verifyFormat("FctWithMultipleParams_SLS_All("
15672                "VeryLongParameterThatShouldAskToBeOnMultiLine,\n"
15673                "                              []() { return 17; });",
15674                LLVMWithBeforeLambdaBody);
15675   verifyFormat("FctWithMultipleParams_SLS_All(A, []() { return 17; });",
15676                LLVMWithBeforeLambdaBody);
15677   verifyFormat("FctWithMultipleParams_SLS_All(A, B, []() { return 17; });",
15678                LLVMWithBeforeLambdaBody);
15679   verifyFormat(
15680       "FctWithLongLineInLambda_SLS_All(\n"
15681       "    []()\n"
15682       "    {\n"
15683       "      return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n"
15684       "                               AndShouldNotBeConsiderAsInline,\n"
15685       "                               LambdaBodyMustBeBreak);\n"
15686       "    });",
15687       LLVMWithBeforeLambdaBody);
15688   verifyFormat(
15689       "auto fct_SLS_All = []()\n"
15690       "{\n"
15691       "  return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n"
15692       "                           AndShouldNotBeConsiderAsInline,\n"
15693       "                           LambdaBodyMustBeBreak);\n"
15694       "};",
15695       LLVMWithBeforeLambdaBody);
15696   LLVMWithBeforeLambdaBody.BinPackParameters = false;
15697   verifyFormat("FctAllOnSameLine_SLS_All([]() { return S; }, Fst, Second);",
15698                LLVMWithBeforeLambdaBody);
15699   verifyFormat(
15700       "FctWithLongLineInLambda_SLS_All([]() { return SomeValueNotSoLong; },\n"
15701       "                                FirstParam,\n"
15702       "                                SecondParam,\n"
15703       "                                ThirdParam,\n"
15704       "                                FourthParam);",
15705       LLVMWithBeforeLambdaBody);
15706   verifyFormat("FctWithLongLineInLambda_SLS_All(\n"
15707                "    []() { return "
15708                "SomeValueVeryVeryVeryVeryVeryVeryVeryVeryVeryLong; },\n"
15709                "    FirstParam,\n"
15710                "    SecondParam,\n"
15711                "    ThirdParam,\n"
15712                "    FourthParam);",
15713                LLVMWithBeforeLambdaBody);
15714   verifyFormat(
15715       "FctWithLongLineInLambda_SLS_All(FirstParam,\n"
15716       "                                SecondParam,\n"
15717       "                                ThirdParam,\n"
15718       "                                FourthParam,\n"
15719       "                                []() { return SomeValueNotSoLong; });",
15720       LLVMWithBeforeLambdaBody);
15721   verifyFormat("FctWithLongLineInLambda_SLS_All(\n"
15722                "    []()\n"
15723                "    {\n"
15724                "      return "
15725                "HereAVeryLongLineThatWillBeFormattedOnMultipleLineAndShouldNotB"
15726                "eConsiderAsInline;\n"
15727                "    });",
15728                LLVMWithBeforeLambdaBody);
15729   verifyFormat(
15730       "FctWithLongLineInLambda_SLS_All(\n"
15731       "    []()\n"
15732       "    {\n"
15733       "      return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n"
15734       "                               AndShouldNotBeConsiderAsInline,\n"
15735       "                               LambdaBodyMustBeBreak);\n"
15736       "    });",
15737       LLVMWithBeforeLambdaBody);
15738   verifyFormat("FctWithTwoParams_SLS_All(\n"
15739                "    []()\n"
15740                "    {\n"
15741                "      // A cool function...\n"
15742                "      return 43;\n"
15743                "    },\n"
15744                "    87);",
15745                LLVMWithBeforeLambdaBody);
15746   verifyFormat("FctWithTwoParams_SLS_All([]() { return 43; }, 87);",
15747                LLVMWithBeforeLambdaBody);
15748   verifyFormat("FctWithOneNestedLambdas_SLS_All([]() { return 17; });",
15749                LLVMWithBeforeLambdaBody);
15750   verifyFormat(
15751       "TwoNestedLambdas_SLS_All([]() { return Call([]() { return 17; }); });",
15752       LLVMWithBeforeLambdaBody);
15753   verifyFormat("TwoNestedLambdas_SLS_All([]() { return Call([]() { return 17; "
15754                "}); }, x);",
15755                LLVMWithBeforeLambdaBody);
15756   verifyFormat("TwoNestedLambdas_SLS_All(\n"
15757                "    []()\n"
15758                "    {\n"
15759                "      // A cool function...\n"
15760                "      return Call([]() { return 17; });\n"
15761                "    });",
15762                LLVMWithBeforeLambdaBody);
15763   verifyFormat("TwoNestedLambdas_SLS_All(\n"
15764                "    []()\n"
15765                "    {\n"
15766                "      return Call(\n"
15767                "          []()\n"
15768                "          {\n"
15769                "            // A cool function...\n"
15770                "            return 17;\n"
15771                "          });\n"
15772                "    });",
15773                LLVMWithBeforeLambdaBody);
15774 }
15775 
15776 TEST_F(FormatTest, LambdaWithLineComments) {
15777   FormatStyle LLVMWithBeforeLambdaBody = getLLVMStyle();
15778   LLVMWithBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom;
15779   LLVMWithBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true;
15780   LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine =
15781       FormatStyle::ShortLambdaStyle::SLS_All;
15782 
15783   verifyFormat("auto k = []() { return; }", LLVMWithBeforeLambdaBody);
15784   verifyFormat("auto k = []() // comment\n"
15785                "{ return; }",
15786                LLVMWithBeforeLambdaBody);
15787   verifyFormat("auto k = []() /* comment */ { return; }",
15788                LLVMWithBeforeLambdaBody);
15789   verifyFormat("auto k = []() /* comment */ /* comment */ { return; }",
15790                LLVMWithBeforeLambdaBody);
15791   verifyFormat("auto k = []() // X\n"
15792                "{ return; }",
15793                LLVMWithBeforeLambdaBody);
15794   verifyFormat(
15795       "auto k = []() // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"
15796       "{ return; }",
15797       LLVMWithBeforeLambdaBody);
15798 }
15799 
15800 TEST_F(FormatTest, EmptyLinesInLambdas) {
15801   verifyFormat("auto lambda = []() {\n"
15802                "  x(); //\n"
15803                "};",
15804                "auto lambda = []() {\n"
15805                "\n"
15806                "  x(); //\n"
15807                "\n"
15808                "};");
15809 }
15810 
15811 TEST_F(FormatTest, FormatsBlocks) {
15812   FormatStyle ShortBlocks = getLLVMStyle();
15813   ShortBlocks.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always;
15814   verifyFormat("int (^Block)(int, int);", ShortBlocks);
15815   verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
15816   verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
15817   verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
15818   verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
15819   verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
15820 
15821   verifyFormat("foo(^{ bar(); });", ShortBlocks);
15822   verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
15823   verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
15824 
15825   verifyFormat("[operation setCompletionBlock:^{\n"
15826                "  [self onOperationDone];\n"
15827                "}];");
15828   verifyFormat("int i = {[operation setCompletionBlock:^{\n"
15829                "  [self onOperationDone];\n"
15830                "}]};");
15831   verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
15832                "  f();\n"
15833                "}];");
15834   verifyFormat("int a = [operation block:^int(int *i) {\n"
15835                "  return 1;\n"
15836                "}];");
15837   verifyFormat("[myObject doSomethingWith:arg1\n"
15838                "                      aaa:^int(int *a) {\n"
15839                "                        return 1;\n"
15840                "                      }\n"
15841                "                      bbb:f(a * bbbbbbbb)];");
15842 
15843   verifyFormat("[operation setCompletionBlock:^{\n"
15844                "  [self.delegate newDataAvailable];\n"
15845                "}];",
15846                getLLVMStyleWithColumns(60));
15847   verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
15848                "  NSString *path = [self sessionFilePath];\n"
15849                "  if (path) {\n"
15850                "    // ...\n"
15851                "  }\n"
15852                "});");
15853   verifyFormat("[[SessionService sharedService]\n"
15854                "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
15855                "      if (window) {\n"
15856                "        [self windowDidLoad:window];\n"
15857                "      } else {\n"
15858                "        [self errorLoadingWindow];\n"
15859                "      }\n"
15860                "    }];");
15861   verifyFormat("void (^largeBlock)(void) = ^{\n"
15862                "  // ...\n"
15863                "};\n",
15864                getLLVMStyleWithColumns(40));
15865   verifyFormat("[[SessionService sharedService]\n"
15866                "    loadWindowWithCompletionBlock: //\n"
15867                "        ^(SessionWindow *window) {\n"
15868                "          if (window) {\n"
15869                "            [self windowDidLoad:window];\n"
15870                "          } else {\n"
15871                "            [self errorLoadingWindow];\n"
15872                "          }\n"
15873                "        }];",
15874                getLLVMStyleWithColumns(60));
15875   verifyFormat("[myObject doSomethingWith:arg1\n"
15876                "    firstBlock:^(Foo *a) {\n"
15877                "      // ...\n"
15878                "      int i;\n"
15879                "    }\n"
15880                "    secondBlock:^(Bar *b) {\n"
15881                "      // ...\n"
15882                "      int i;\n"
15883                "    }\n"
15884                "    thirdBlock:^Foo(Bar *b) {\n"
15885                "      // ...\n"
15886                "      int i;\n"
15887                "    }];");
15888   verifyFormat("[myObject doSomethingWith:arg1\n"
15889                "               firstBlock:-1\n"
15890                "              secondBlock:^(Bar *b) {\n"
15891                "                // ...\n"
15892                "                int i;\n"
15893                "              }];");
15894 
15895   verifyFormat("f(^{\n"
15896                "  @autoreleasepool {\n"
15897                "    if (a) {\n"
15898                "      g();\n"
15899                "    }\n"
15900                "  }\n"
15901                "});");
15902   verifyFormat("Block b = ^int *(A *a, B *b) {}");
15903   verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
15904                "};");
15905 
15906   FormatStyle FourIndent = getLLVMStyle();
15907   FourIndent.ObjCBlockIndentWidth = 4;
15908   verifyFormat("[operation setCompletionBlock:^{\n"
15909                "    [self onOperationDone];\n"
15910                "}];",
15911                FourIndent);
15912 }
15913 
15914 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
15915   FormatStyle ZeroColumn = getLLVMStyle();
15916   ZeroColumn.ColumnLimit = 0;
15917 
15918   verifyFormat("[[SessionService sharedService] "
15919                "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
15920                "  if (window) {\n"
15921                "    [self windowDidLoad:window];\n"
15922                "  } else {\n"
15923                "    [self errorLoadingWindow];\n"
15924                "  }\n"
15925                "}];",
15926                ZeroColumn);
15927   EXPECT_EQ("[[SessionService sharedService]\n"
15928             "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
15929             "      if (window) {\n"
15930             "        [self windowDidLoad:window];\n"
15931             "      } else {\n"
15932             "        [self errorLoadingWindow];\n"
15933             "      }\n"
15934             "    }];",
15935             format("[[SessionService sharedService]\n"
15936                    "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
15937                    "                if (window) {\n"
15938                    "    [self windowDidLoad:window];\n"
15939                    "  } else {\n"
15940                    "    [self errorLoadingWindow];\n"
15941                    "  }\n"
15942                    "}];",
15943                    ZeroColumn));
15944   verifyFormat("[myObject doSomethingWith:arg1\n"
15945                "    firstBlock:^(Foo *a) {\n"
15946                "      // ...\n"
15947                "      int i;\n"
15948                "    }\n"
15949                "    secondBlock:^(Bar *b) {\n"
15950                "      // ...\n"
15951                "      int i;\n"
15952                "    }\n"
15953                "    thirdBlock:^Foo(Bar *b) {\n"
15954                "      // ...\n"
15955                "      int i;\n"
15956                "    }];",
15957                ZeroColumn);
15958   verifyFormat("f(^{\n"
15959                "  @autoreleasepool {\n"
15960                "    if (a) {\n"
15961                "      g();\n"
15962                "    }\n"
15963                "  }\n"
15964                "});",
15965                ZeroColumn);
15966   verifyFormat("void (^largeBlock)(void) = ^{\n"
15967                "  // ...\n"
15968                "};",
15969                ZeroColumn);
15970 
15971   ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always;
15972   EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
15973             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
15974   ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never;
15975   EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
15976             "  int i;\n"
15977             "};",
15978             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
15979 }
15980 
15981 TEST_F(FormatTest, SupportsCRLF) {
15982   EXPECT_EQ("int a;\r\n"
15983             "int b;\r\n"
15984             "int c;\r\n",
15985             format("int a;\r\n"
15986                    "  int b;\r\n"
15987                    "    int c;\r\n",
15988                    getLLVMStyle()));
15989   EXPECT_EQ("int a;\r\n"
15990             "int b;\r\n"
15991             "int c;\r\n",
15992             format("int a;\r\n"
15993                    "  int b;\n"
15994                    "    int c;\r\n",
15995                    getLLVMStyle()));
15996   EXPECT_EQ("int a;\n"
15997             "int b;\n"
15998             "int c;\n",
15999             format("int a;\r\n"
16000                    "  int b;\n"
16001                    "    int c;\n",
16002                    getLLVMStyle()));
16003   EXPECT_EQ("\"aaaaaaa \"\r\n"
16004             "\"bbbbbbb\";\r\n",
16005             format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
16006   EXPECT_EQ("#define A \\\r\n"
16007             "  b;      \\\r\n"
16008             "  c;      \\\r\n"
16009             "  d;\r\n",
16010             format("#define A \\\r\n"
16011                    "  b; \\\r\n"
16012                    "  c; d; \r\n",
16013                    getGoogleStyle()));
16014 
16015   EXPECT_EQ("/*\r\n"
16016             "multi line block comments\r\n"
16017             "should not introduce\r\n"
16018             "an extra carriage return\r\n"
16019             "*/\r\n",
16020             format("/*\r\n"
16021                    "multi line block comments\r\n"
16022                    "should not introduce\r\n"
16023                    "an extra carriage return\r\n"
16024                    "*/\r\n"));
16025   EXPECT_EQ("/*\r\n"
16026             "\r\n"
16027             "*/",
16028             format("/*\r\n"
16029                    "    \r\r\r\n"
16030                    "*/"));
16031 
16032   FormatStyle style = getLLVMStyle();
16033 
16034   style.DeriveLineEnding = true;
16035   style.UseCRLF = false;
16036   EXPECT_EQ("union FooBarBazQux {\n"
16037             "  int foo;\n"
16038             "  int bar;\n"
16039             "  int baz;\n"
16040             "};",
16041             format("union FooBarBazQux {\r\n"
16042                    "  int foo;\n"
16043                    "  int bar;\r\n"
16044                    "  int baz;\n"
16045                    "};",
16046                    style));
16047   style.UseCRLF = true;
16048   EXPECT_EQ("union FooBarBazQux {\r\n"
16049             "  int foo;\r\n"
16050             "  int bar;\r\n"
16051             "  int baz;\r\n"
16052             "};",
16053             format("union FooBarBazQux {\r\n"
16054                    "  int foo;\n"
16055                    "  int bar;\r\n"
16056                    "  int baz;\n"
16057                    "};",
16058                    style));
16059 
16060   style.DeriveLineEnding = false;
16061   style.UseCRLF = false;
16062   EXPECT_EQ("union FooBarBazQux {\n"
16063             "  int foo;\n"
16064             "  int bar;\n"
16065             "  int baz;\n"
16066             "  int qux;\n"
16067             "};",
16068             format("union FooBarBazQux {\r\n"
16069                    "  int foo;\n"
16070                    "  int bar;\r\n"
16071                    "  int baz;\n"
16072                    "  int qux;\r\n"
16073                    "};",
16074                    style));
16075   style.UseCRLF = true;
16076   EXPECT_EQ("union FooBarBazQux {\r\n"
16077             "  int foo;\r\n"
16078             "  int bar;\r\n"
16079             "  int baz;\r\n"
16080             "  int qux;\r\n"
16081             "};",
16082             format("union FooBarBazQux {\r\n"
16083                    "  int foo;\n"
16084                    "  int bar;\r\n"
16085                    "  int baz;\n"
16086                    "  int qux;\n"
16087                    "};",
16088                    style));
16089 
16090   style.DeriveLineEnding = true;
16091   style.UseCRLF = false;
16092   EXPECT_EQ("union FooBarBazQux {\r\n"
16093             "  int foo;\r\n"
16094             "  int bar;\r\n"
16095             "  int baz;\r\n"
16096             "  int qux;\r\n"
16097             "};",
16098             format("union FooBarBazQux {\r\n"
16099                    "  int foo;\n"
16100                    "  int bar;\r\n"
16101                    "  int baz;\n"
16102                    "  int qux;\r\n"
16103                    "};",
16104                    style));
16105   style.UseCRLF = true;
16106   EXPECT_EQ("union FooBarBazQux {\n"
16107             "  int foo;\n"
16108             "  int bar;\n"
16109             "  int baz;\n"
16110             "  int qux;\n"
16111             "};",
16112             format("union FooBarBazQux {\r\n"
16113                    "  int foo;\n"
16114                    "  int bar;\r\n"
16115                    "  int baz;\n"
16116                    "  int qux;\n"
16117                    "};",
16118                    style));
16119 }
16120 
16121 TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
16122   verifyFormat("MY_CLASS(C) {\n"
16123                "  int i;\n"
16124                "  int j;\n"
16125                "};");
16126 }
16127 
16128 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
16129   FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
16130   TwoIndent.ContinuationIndentWidth = 2;
16131 
16132   EXPECT_EQ("int i =\n"
16133             "  longFunction(\n"
16134             "    arg);",
16135             format("int i = longFunction(arg);", TwoIndent));
16136 
16137   FormatStyle SixIndent = getLLVMStyleWithColumns(20);
16138   SixIndent.ContinuationIndentWidth = 6;
16139 
16140   EXPECT_EQ("int i =\n"
16141             "      longFunction(\n"
16142             "            arg);",
16143             format("int i = longFunction(arg);", SixIndent));
16144 }
16145 
16146 TEST_F(FormatTest, WrappedClosingParenthesisIndent) {
16147   FormatStyle Style = getLLVMStyle();
16148   verifyFormat("int Foo::getter(\n"
16149                "    //\n"
16150                ") const {\n"
16151                "  return foo;\n"
16152                "}",
16153                Style);
16154   verifyFormat("void Foo::setter(\n"
16155                "    //\n"
16156                ") {\n"
16157                "  foo = 1;\n"
16158                "}",
16159                Style);
16160 }
16161 
16162 TEST_F(FormatTest, SpacesInAngles) {
16163   FormatStyle Spaces = getLLVMStyle();
16164   Spaces.SpacesInAngles = true;
16165 
16166   verifyFormat("static_cast< int >(arg);", Spaces);
16167   verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
16168   verifyFormat("f< int, float >();", Spaces);
16169   verifyFormat("template <> g() {}", Spaces);
16170   verifyFormat("template < std::vector< int > > f() {}", Spaces);
16171   verifyFormat("std::function< void(int, int) > fct;", Spaces);
16172   verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
16173                Spaces);
16174 
16175   Spaces.Standard = FormatStyle::LS_Cpp03;
16176   Spaces.SpacesInAngles = true;
16177   verifyFormat("A< A< int > >();", Spaces);
16178 
16179   Spaces.SpacesInAngles = false;
16180   verifyFormat("A<A<int> >();", Spaces);
16181 
16182   Spaces.Standard = FormatStyle::LS_Cpp11;
16183   Spaces.SpacesInAngles = true;
16184   verifyFormat("A< A< int > >();", Spaces);
16185 
16186   Spaces.SpacesInAngles = false;
16187   verifyFormat("A<A<int>>();", Spaces);
16188 }
16189 
16190 TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
16191   FormatStyle Style = getLLVMStyle();
16192   Style.SpaceAfterTemplateKeyword = false;
16193   verifyFormat("template<int> void foo();", Style);
16194 }
16195 
16196 TEST_F(FormatTest, TripleAngleBrackets) {
16197   verifyFormat("f<<<1, 1>>>();");
16198   verifyFormat("f<<<1, 1, 1, s>>>();");
16199   verifyFormat("f<<<a, b, c, d>>>();");
16200   EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
16201   verifyFormat("f<param><<<1, 1>>>();");
16202   verifyFormat("f<1><<<1, 1>>>();");
16203   EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
16204   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
16205                "aaaaaaaaaaa<<<\n    1, 1>>>();");
16206   verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
16207                "    <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
16208 }
16209 
16210 TEST_F(FormatTest, MergeLessLessAtEnd) {
16211   verifyFormat("<<");
16212   EXPECT_EQ("< < <", format("\\\n<<<"));
16213   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
16214                "aaallvm::outs() <<");
16215   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
16216                "aaaallvm::outs()\n    <<");
16217 }
16218 
16219 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
16220   std::string code = "#if A\n"
16221                      "#if B\n"
16222                      "a.\n"
16223                      "#endif\n"
16224                      "    a = 1;\n"
16225                      "#else\n"
16226                      "#endif\n"
16227                      "#if C\n"
16228                      "#else\n"
16229                      "#endif\n";
16230   EXPECT_EQ(code, format(code));
16231 }
16232 
16233 TEST_F(FormatTest, HandleConflictMarkers) {
16234   // Git/SVN conflict markers.
16235   EXPECT_EQ("int a;\n"
16236             "void f() {\n"
16237             "  callme(some(parameter1,\n"
16238             "<<<<<<< text by the vcs\n"
16239             "              parameter2),\n"
16240             "||||||| text by the vcs\n"
16241             "              parameter2),\n"
16242             "         parameter3,\n"
16243             "======= text by the vcs\n"
16244             "              parameter2, parameter3),\n"
16245             ">>>>>>> text by the vcs\n"
16246             "         otherparameter);\n",
16247             format("int a;\n"
16248                    "void f() {\n"
16249                    "  callme(some(parameter1,\n"
16250                    "<<<<<<< text by the vcs\n"
16251                    "  parameter2),\n"
16252                    "||||||| text by the vcs\n"
16253                    "  parameter2),\n"
16254                    "  parameter3,\n"
16255                    "======= text by the vcs\n"
16256                    "  parameter2,\n"
16257                    "  parameter3),\n"
16258                    ">>>>>>> text by the vcs\n"
16259                    "  otherparameter);\n"));
16260 
16261   // Perforce markers.
16262   EXPECT_EQ("void f() {\n"
16263             "  function(\n"
16264             ">>>> text by the vcs\n"
16265             "      parameter,\n"
16266             "==== text by the vcs\n"
16267             "      parameter,\n"
16268             "==== text by the vcs\n"
16269             "      parameter,\n"
16270             "<<<< text by the vcs\n"
16271             "      parameter);\n",
16272             format("void f() {\n"
16273                    "  function(\n"
16274                    ">>>> text by the vcs\n"
16275                    "  parameter,\n"
16276                    "==== text by the vcs\n"
16277                    "  parameter,\n"
16278                    "==== text by the vcs\n"
16279                    "  parameter,\n"
16280                    "<<<< text by the vcs\n"
16281                    "  parameter);\n"));
16282 
16283   EXPECT_EQ("<<<<<<<\n"
16284             "|||||||\n"
16285             "=======\n"
16286             ">>>>>>>",
16287             format("<<<<<<<\n"
16288                    "|||||||\n"
16289                    "=======\n"
16290                    ">>>>>>>"));
16291 
16292   EXPECT_EQ("<<<<<<<\n"
16293             "|||||||\n"
16294             "int i;\n"
16295             "=======\n"
16296             ">>>>>>>",
16297             format("<<<<<<<\n"
16298                    "|||||||\n"
16299                    "int i;\n"
16300                    "=======\n"
16301                    ">>>>>>>"));
16302 
16303   // FIXME: Handle parsing of macros around conflict markers correctly:
16304   EXPECT_EQ("#define Macro \\\n"
16305             "<<<<<<<\n"
16306             "Something \\\n"
16307             "|||||||\n"
16308             "Else \\\n"
16309             "=======\n"
16310             "Other \\\n"
16311             ">>>>>>>\n"
16312             "    End int i;\n",
16313             format("#define Macro \\\n"
16314                    "<<<<<<<\n"
16315                    "  Something \\\n"
16316                    "|||||||\n"
16317                    "  Else \\\n"
16318                    "=======\n"
16319                    "  Other \\\n"
16320                    ">>>>>>>\n"
16321                    "  End\n"
16322                    "int i;\n"));
16323 }
16324 
16325 TEST_F(FormatTest, DisableRegions) {
16326   EXPECT_EQ("int i;\n"
16327             "// clang-format off\n"
16328             "  int j;\n"
16329             "// clang-format on\n"
16330             "int k;",
16331             format(" int  i;\n"
16332                    "   // clang-format off\n"
16333                    "  int j;\n"
16334                    " // clang-format on\n"
16335                    "   int   k;"));
16336   EXPECT_EQ("int i;\n"
16337             "/* clang-format off */\n"
16338             "  int j;\n"
16339             "/* clang-format on */\n"
16340             "int k;",
16341             format(" int  i;\n"
16342                    "   /* clang-format off */\n"
16343                    "  int j;\n"
16344                    " /* clang-format on */\n"
16345                    "   int   k;"));
16346 
16347   // Don't reflow comments within disabled regions.
16348   EXPECT_EQ("// clang-format off\n"
16349             "// long long long long long long line\n"
16350             "/* clang-format on */\n"
16351             "/* long long long\n"
16352             " * long long long\n"
16353             " * line */\n"
16354             "int i;\n"
16355             "/* clang-format off */\n"
16356             "/* long long long long long long line */\n",
16357             format("// clang-format off\n"
16358                    "// long long long long long long line\n"
16359                    "/* clang-format on */\n"
16360                    "/* long long long long long long line */\n"
16361                    "int i;\n"
16362                    "/* clang-format off */\n"
16363                    "/* long long long long long long line */\n",
16364                    getLLVMStyleWithColumns(20)));
16365 }
16366 
16367 TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
16368   format("? ) =");
16369   verifyNoCrash("#define a\\\n /**/}");
16370 }
16371 
16372 TEST_F(FormatTest, FormatsTableGenCode) {
16373   FormatStyle Style = getLLVMStyle();
16374   Style.Language = FormatStyle::LK_TableGen;
16375   verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
16376 }
16377 
16378 TEST_F(FormatTest, ArrayOfTemplates) {
16379   EXPECT_EQ("auto a = new unique_ptr<int>[10];",
16380             format("auto a = new unique_ptr<int > [ 10];"));
16381 
16382   FormatStyle Spaces = getLLVMStyle();
16383   Spaces.SpacesInSquareBrackets = true;
16384   EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
16385             format("auto a = new unique_ptr<int > [10];", Spaces));
16386 }
16387 
16388 TEST_F(FormatTest, ArrayAsTemplateType) {
16389   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
16390             format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
16391 
16392   FormatStyle Spaces = getLLVMStyle();
16393   Spaces.SpacesInSquareBrackets = true;
16394   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
16395             format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
16396 }
16397 
16398 TEST_F(FormatTest, NoSpaceAfterSuper) { verifyFormat("__super::FooBar();"); }
16399 
16400 TEST(FormatStyle, GetStyleWithEmptyFileName) {
16401   llvm::vfs::InMemoryFileSystem FS;
16402   auto Style1 = getStyle("file", "", "Google", "", &FS);
16403   ASSERT_TRUE((bool)Style1);
16404   ASSERT_EQ(*Style1, getGoogleStyle());
16405 }
16406 
16407 TEST(FormatStyle, GetStyleOfFile) {
16408   llvm::vfs::InMemoryFileSystem FS;
16409   // Test 1: format file in the same directory.
16410   ASSERT_TRUE(
16411       FS.addFile("/a/.clang-format", 0,
16412                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
16413   ASSERT_TRUE(
16414       FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
16415   auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
16416   ASSERT_TRUE((bool)Style1);
16417   ASSERT_EQ(*Style1, getLLVMStyle());
16418 
16419   // Test 2.1: fallback to default.
16420   ASSERT_TRUE(
16421       FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
16422   auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
16423   ASSERT_TRUE((bool)Style2);
16424   ASSERT_EQ(*Style2, getMozillaStyle());
16425 
16426   // Test 2.2: no format on 'none' fallback style.
16427   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
16428   ASSERT_TRUE((bool)Style2);
16429   ASSERT_EQ(*Style2, getNoStyle());
16430 
16431   // Test 2.3: format if config is found with no based style while fallback is
16432   // 'none'.
16433   ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
16434                          llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
16435   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
16436   ASSERT_TRUE((bool)Style2);
16437   ASSERT_EQ(*Style2, getLLVMStyle());
16438 
16439   // Test 2.4: format if yaml with no based style, while fallback is 'none'.
16440   Style2 = getStyle("{}", "a.h", "none", "", &FS);
16441   ASSERT_TRUE((bool)Style2);
16442   ASSERT_EQ(*Style2, getLLVMStyle());
16443 
16444   // Test 3: format file in parent directory.
16445   ASSERT_TRUE(
16446       FS.addFile("/c/.clang-format", 0,
16447                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
16448   ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
16449                          llvm::MemoryBuffer::getMemBuffer("int i;")));
16450   auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
16451   ASSERT_TRUE((bool)Style3);
16452   ASSERT_EQ(*Style3, getGoogleStyle());
16453 
16454   // Test 4: error on invalid fallback style
16455   auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
16456   ASSERT_FALSE((bool)Style4);
16457   llvm::consumeError(Style4.takeError());
16458 
16459   // Test 5: error on invalid yaml on command line
16460   auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
16461   ASSERT_FALSE((bool)Style5);
16462   llvm::consumeError(Style5.takeError());
16463 
16464   // Test 6: error on invalid style
16465   auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
16466   ASSERT_FALSE((bool)Style6);
16467   llvm::consumeError(Style6.takeError());
16468 
16469   // Test 7: found config file, error on parsing it
16470   ASSERT_TRUE(
16471       FS.addFile("/d/.clang-format", 0,
16472                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
16473                                                   "InvalidKey: InvalidValue")));
16474   ASSERT_TRUE(
16475       FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
16476   auto Style7a = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
16477   ASSERT_FALSE((bool)Style7a);
16478   llvm::consumeError(Style7a.takeError());
16479 
16480   auto Style7b = getStyle("file", "/d/.clang-format", "LLVM", "", &FS, true);
16481   ASSERT_TRUE((bool)Style7b);
16482 
16483   // Test 8: inferred per-language defaults apply.
16484   auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS);
16485   ASSERT_TRUE((bool)StyleTd);
16486   ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen));
16487 }
16488 
16489 TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
16490   // Column limit is 20.
16491   std::string Code = "Type *a =\n"
16492                      "    new Type();\n"
16493                      "g(iiiii, 0, jjjjj,\n"
16494                      "  0, kkkkk, 0, mm);\n"
16495                      "int  bad     = format   ;";
16496   std::string Expected = "auto a = new Type();\n"
16497                          "g(iiiii, nullptr,\n"
16498                          "  jjjjj, nullptr,\n"
16499                          "  kkkkk, nullptr,\n"
16500                          "  mm);\n"
16501                          "int  bad     = format   ;";
16502   FileID ID = Context.createInMemoryFile("format.cpp", Code);
16503   tooling::Replacements Replaces = toReplacements(
16504       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
16505                             "auto "),
16506        tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
16507                             "nullptr"),
16508        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
16509                             "nullptr"),
16510        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
16511                             "nullptr")});
16512 
16513   format::FormatStyle Style = format::getLLVMStyle();
16514   Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
16515   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
16516   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
16517       << llvm::toString(FormattedReplaces.takeError()) << "\n";
16518   auto Result = applyAllReplacements(Code, *FormattedReplaces);
16519   EXPECT_TRUE(static_cast<bool>(Result));
16520   EXPECT_EQ(Expected, *Result);
16521 }
16522 
16523 TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
16524   std::string Code = "#include \"a.h\"\n"
16525                      "#include \"c.h\"\n"
16526                      "\n"
16527                      "int main() {\n"
16528                      "  return 0;\n"
16529                      "}";
16530   std::string Expected = "#include \"a.h\"\n"
16531                          "#include \"b.h\"\n"
16532                          "#include \"c.h\"\n"
16533                          "\n"
16534                          "int main() {\n"
16535                          "  return 0;\n"
16536                          "}";
16537   FileID ID = Context.createInMemoryFile("fix.cpp", Code);
16538   tooling::Replacements Replaces = toReplacements(
16539       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
16540                             "#include \"b.h\"\n")});
16541 
16542   format::FormatStyle Style = format::getLLVMStyle();
16543   Style.SortIncludes = true;
16544   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
16545   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
16546       << llvm::toString(FormattedReplaces.takeError()) << "\n";
16547   auto Result = applyAllReplacements(Code, *FormattedReplaces);
16548   EXPECT_TRUE(static_cast<bool>(Result));
16549   EXPECT_EQ(Expected, *Result);
16550 }
16551 
16552 TEST_F(FormatTest, FormatSortsUsingDeclarations) {
16553   EXPECT_EQ("using std::cin;\n"
16554             "using std::cout;",
16555             format("using std::cout;\n"
16556                    "using std::cin;",
16557                    getGoogleStyle()));
16558 }
16559 
16560 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
16561   format::FormatStyle Style = format::getLLVMStyle();
16562   Style.Standard = FormatStyle::LS_Cpp03;
16563   // cpp03 recognize this string as identifier u8 and literal character 'a'
16564   EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
16565 }
16566 
16567 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
16568   // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
16569   // all modes, including C++11, C++14 and C++17
16570   EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
16571 }
16572 
16573 TEST_F(FormatTest, DoNotFormatLikelyXml) {
16574   EXPECT_EQ("<!-- ;> -->", format("<!-- ;> -->", getGoogleStyle()));
16575   EXPECT_EQ(" <!-- >; -->", format(" <!-- >; -->", getGoogleStyle()));
16576 }
16577 
16578 TEST_F(FormatTest, StructuredBindings) {
16579   // Structured bindings is a C++17 feature.
16580   // all modes, including C++11, C++14 and C++17
16581   verifyFormat("auto [a, b] = f();");
16582   EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
16583   EXPECT_EQ("const auto [a, b] = f();", format("const   auto[a, b] = f();"));
16584   EXPECT_EQ("auto const [a, b] = f();", format("auto  const[a, b] = f();"));
16585   EXPECT_EQ("auto const volatile [a, b] = f();",
16586             format("auto  const   volatile[a, b] = f();"));
16587   EXPECT_EQ("auto [a, b, c] = f();", format("auto   [  a  ,  b,c   ] = f();"));
16588   EXPECT_EQ("auto &[a, b, c] = f();",
16589             format("auto   &[  a  ,  b,c   ] = f();"));
16590   EXPECT_EQ("auto &&[a, b, c] = f();",
16591             format("auto   &&[  a  ,  b,c   ] = f();"));
16592   EXPECT_EQ("auto const &[a, b] = f();", format("auto  const&[a, b] = f();"));
16593   EXPECT_EQ("auto const volatile &&[a, b] = f();",
16594             format("auto  const  volatile  &&[a, b] = f();"));
16595   EXPECT_EQ("auto const &&[a, b] = f();",
16596             format("auto  const   &&  [a, b] = f();"));
16597   EXPECT_EQ("const auto &[a, b] = f();",
16598             format("const  auto  &  [a, b] = f();"));
16599   EXPECT_EQ("const auto volatile &&[a, b] = f();",
16600             format("const  auto   volatile  &&[a, b] = f();"));
16601   EXPECT_EQ("volatile const auto &&[a, b] = f();",
16602             format("volatile  const  auto   &&[a, b] = f();"));
16603   EXPECT_EQ("const auto &&[a, b] = f();",
16604             format("const  auto  &&  [a, b] = f();"));
16605 
16606   // Make sure we don't mistake structured bindings for lambdas.
16607   FormatStyle PointerMiddle = getLLVMStyle();
16608   PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
16609   verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
16610   verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
16611   verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
16612   verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
16613   verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
16614   verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
16615   verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
16616   verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
16617   verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
16618   verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
16619   verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
16620   verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
16621 
16622   EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
16623             format("for (const auto   &&   [a, b] : some_range) {\n}"));
16624   EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
16625             format("for (const auto   &   [a, b] : some_range) {\n}"));
16626   EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
16627             format("for (const auto[a, b] : some_range) {\n}"));
16628   EXPECT_EQ("auto [x, y](expr);", format("auto[x,y]  (expr);"));
16629   EXPECT_EQ("auto &[x, y](expr);", format("auto  &  [x,y]  (expr);"));
16630   EXPECT_EQ("auto &&[x, y](expr);", format("auto  &&  [x,y]  (expr);"));
16631   EXPECT_EQ("auto const &[x, y](expr);",
16632             format("auto  const  &  [x,y]  (expr);"));
16633   EXPECT_EQ("auto const &&[x, y](expr);",
16634             format("auto  const  &&  [x,y]  (expr);"));
16635   EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y]     {expr};"));
16636   EXPECT_EQ("auto const &[x, y]{expr};",
16637             format("auto  const  &  [x,y]  {expr};"));
16638   EXPECT_EQ("auto const &&[x, y]{expr};",
16639             format("auto  const  &&  [x,y]  {expr};"));
16640 
16641   format::FormatStyle Spaces = format::getLLVMStyle();
16642   Spaces.SpacesInSquareBrackets = true;
16643   verifyFormat("auto [ a, b ] = f();", Spaces);
16644   verifyFormat("auto &&[ a, b ] = f();", Spaces);
16645   verifyFormat("auto &[ a, b ] = f();", Spaces);
16646   verifyFormat("auto const &&[ a, b ] = f();", Spaces);
16647   verifyFormat("auto const &[ a, b ] = f();", Spaces);
16648 }
16649 
16650 TEST_F(FormatTest, FileAndCode) {
16651   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", ""));
16652   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", ""));
16653   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", ""));
16654   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", ""));
16655   EXPECT_EQ(FormatStyle::LK_ObjC,
16656             guessLanguage("foo.h", "@interface Foo\n@end\n"));
16657   EXPECT_EQ(
16658       FormatStyle::LK_ObjC,
16659       guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }"));
16660   EXPECT_EQ(FormatStyle::LK_ObjC,
16661             guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))"));
16662   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;"));
16663   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", ""));
16664   EXPECT_EQ(FormatStyle::LK_ObjC,
16665             guessLanguage("foo", "@interface Foo\n@end\n"));
16666   EXPECT_EQ(FormatStyle::LK_ObjC,
16667             guessLanguage("foo.h", "int DoStuff(CGRect rect);\n"));
16668   EXPECT_EQ(
16669       FormatStyle::LK_ObjC,
16670       guessLanguage("foo.h",
16671                     "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n"));
16672   EXPECT_EQ(
16673       FormatStyle::LK_Cpp,
16674       guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;"));
16675 }
16676 
16677 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) {
16678   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];"));
16679   EXPECT_EQ(FormatStyle::LK_ObjC,
16680             guessLanguage("foo.h", "array[[calculator getIndex]];"));
16681   EXPECT_EQ(FormatStyle::LK_Cpp,
16682             guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];"));
16683   EXPECT_EQ(
16684       FormatStyle::LK_Cpp,
16685       guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];"));
16686   EXPECT_EQ(FormatStyle::LK_ObjC,
16687             guessLanguage("foo.h", "[[noreturn foo] bar];"));
16688   EXPECT_EQ(FormatStyle::LK_Cpp,
16689             guessLanguage("foo.h", "[[clang::fallthrough]];"));
16690   EXPECT_EQ(FormatStyle::LK_ObjC,
16691             guessLanguage("foo.h", "[[clang:fallthrough] foo];"));
16692   EXPECT_EQ(FormatStyle::LK_Cpp,
16693             guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];"));
16694   EXPECT_EQ(FormatStyle::LK_Cpp,
16695             guessLanguage("foo.h", "[[using clang: fallthrough]];"));
16696   EXPECT_EQ(FormatStyle::LK_ObjC,
16697             guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];"));
16698   EXPECT_EQ(FormatStyle::LK_Cpp,
16699             guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];"));
16700   EXPECT_EQ(
16701       FormatStyle::LK_Cpp,
16702       guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)"));
16703   EXPECT_EQ(
16704       FormatStyle::LK_Cpp,
16705       guessLanguage("foo.h",
16706                     "[[clang::callable_when(\"unconsumed\", \"unknown\")]]"));
16707   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]"));
16708 }
16709 
16710 TEST_F(FormatTest, GuessLanguageWithCaret) {
16711   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);"));
16712   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);"));
16713   EXPECT_EQ(FormatStyle::LK_ObjC,
16714             guessLanguage("foo.h", "int(^)(char, float);"));
16715   EXPECT_EQ(FormatStyle::LK_ObjC,
16716             guessLanguage("foo.h", "int(^foo)(char, float);"));
16717   EXPECT_EQ(FormatStyle::LK_ObjC,
16718             guessLanguage("foo.h", "int(^foo[10])(char, float);"));
16719   EXPECT_EQ(FormatStyle::LK_ObjC,
16720             guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);"));
16721   EXPECT_EQ(
16722       FormatStyle::LK_ObjC,
16723       guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);"));
16724 }
16725 
16726 TEST_F(FormatTest, GuessLanguageWithPragmas) {
16727   EXPECT_EQ(FormatStyle::LK_Cpp,
16728             guessLanguage("foo.h", "__pragma(warning(disable:))"));
16729   EXPECT_EQ(FormatStyle::LK_Cpp,
16730             guessLanguage("foo.h", "#pragma(warning(disable:))"));
16731   EXPECT_EQ(FormatStyle::LK_Cpp,
16732             guessLanguage("foo.h", "_Pragma(warning(disable:))"));
16733 }
16734 
16735 TEST_F(FormatTest, FormatsInlineAsmSymbolicNames) {
16736   // ASM symbolic names are identifiers that must be surrounded by [] without
16737   // space in between:
16738   // https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#InputOperands
16739 
16740   // Example from https://bugs.llvm.org/show_bug.cgi?id=45108.
16741   verifyFormat(R"(//
16742 asm volatile("mrs %x[result], FPCR" : [result] "=r"(result));
16743 )");
16744 
16745   // A list of several ASM symbolic names.
16746   verifyFormat(R"(asm("mov %[e], %[d]" : [d] "=rm"(d), [e] "rm"(*e));)");
16747 
16748   // ASM symbolic names in inline ASM with inputs and outputs.
16749   verifyFormat(R"(//
16750 asm("cmoveq %1, %2, %[result]"
16751     : [result] "=r"(result)
16752     : "r"(test), "r"(new), "[result]"(old));
16753 )");
16754 
16755   // ASM symbolic names in inline ASM with no outputs.
16756   verifyFormat(R"(asm("mov %[e], %[d]" : : [d] "=rm"(d), [e] "rm"(*e));)");
16757 }
16758 
16759 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) {
16760   EXPECT_EQ(FormatStyle::LK_Cpp,
16761             guessLanguage("foo.h", "void f() {\n"
16762                                    "  asm (\"mov %[e], %[d]\"\n"
16763                                    "     : [d] \"=rm\" (d)\n"
16764                                    "       [e] \"rm\" (*e));\n"
16765                                    "}"));
16766   EXPECT_EQ(FormatStyle::LK_Cpp,
16767             guessLanguage("foo.h", "void f() {\n"
16768                                    "  _asm (\"mov %[e], %[d]\"\n"
16769                                    "     : [d] \"=rm\" (d)\n"
16770                                    "       [e] \"rm\" (*e));\n"
16771                                    "}"));
16772   EXPECT_EQ(FormatStyle::LK_Cpp,
16773             guessLanguage("foo.h", "void f() {\n"
16774                                    "  __asm (\"mov %[e], %[d]\"\n"
16775                                    "     : [d] \"=rm\" (d)\n"
16776                                    "       [e] \"rm\" (*e));\n"
16777                                    "}"));
16778   EXPECT_EQ(FormatStyle::LK_Cpp,
16779             guessLanguage("foo.h", "void f() {\n"
16780                                    "  __asm__ (\"mov %[e], %[d]\"\n"
16781                                    "     : [d] \"=rm\" (d)\n"
16782                                    "       [e] \"rm\" (*e));\n"
16783                                    "}"));
16784   EXPECT_EQ(FormatStyle::LK_Cpp,
16785             guessLanguage("foo.h", "void f() {\n"
16786                                    "  asm (\"mov %[e], %[d]\"\n"
16787                                    "     : [d] \"=rm\" (d),\n"
16788                                    "       [e] \"rm\" (*e));\n"
16789                                    "}"));
16790   EXPECT_EQ(FormatStyle::LK_Cpp,
16791             guessLanguage("foo.h", "void f() {\n"
16792                                    "  asm volatile (\"mov %[e], %[d]\"\n"
16793                                    "     : [d] \"=rm\" (d)\n"
16794                                    "       [e] \"rm\" (*e));\n"
16795                                    "}"));
16796 }
16797 
16798 TEST_F(FormatTest, GuessLanguageWithChildLines) {
16799   EXPECT_EQ(FormatStyle::LK_Cpp,
16800             guessLanguage("foo.h", "#define FOO ({ std::string s; })"));
16801   EXPECT_EQ(FormatStyle::LK_ObjC,
16802             guessLanguage("foo.h", "#define FOO ({ NSString *s; })"));
16803   EXPECT_EQ(
16804       FormatStyle::LK_Cpp,
16805       guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })"));
16806   EXPECT_EQ(
16807       FormatStyle::LK_ObjC,
16808       guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })"));
16809 }
16810 
16811 TEST_F(FormatTest, TypenameMacros) {
16812   std::vector<std::string> TypenameMacros = {"STACK_OF", "LIST", "TAILQ_ENTRY"};
16813 
16814   // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=30353
16815   FormatStyle Google = getGoogleStyleWithColumns(0);
16816   Google.TypenameMacros = TypenameMacros;
16817   verifyFormat("struct foo {\n"
16818                "  int bar;\n"
16819                "  TAILQ_ENTRY(a) bleh;\n"
16820                "};",
16821                Google);
16822 
16823   FormatStyle Macros = getLLVMStyle();
16824   Macros.TypenameMacros = TypenameMacros;
16825 
16826   verifyFormat("STACK_OF(int) a;", Macros);
16827   verifyFormat("STACK_OF(int) *a;", Macros);
16828   verifyFormat("STACK_OF(int const *) *a;", Macros);
16829   verifyFormat("STACK_OF(int *const) *a;", Macros);
16830   verifyFormat("STACK_OF(int, string) a;", Macros);
16831   verifyFormat("STACK_OF(LIST(int)) a;", Macros);
16832   verifyFormat("STACK_OF(LIST(int)) a, b;", Macros);
16833   verifyFormat("for (LIST(int) *a = NULL; a;) {\n}", Macros);
16834   verifyFormat("STACK_OF(int) f(LIST(int) *arg);", Macros);
16835   verifyFormat("vector<LIST(uint64_t) *attr> x;", Macros);
16836   verifyFormat("vector<LIST(uint64_t) *const> f(LIST(uint64_t) *arg);", Macros);
16837 
16838   Macros.PointerAlignment = FormatStyle::PAS_Left;
16839   verifyFormat("STACK_OF(int)* a;", Macros);
16840   verifyFormat("STACK_OF(int*)* a;", Macros);
16841   verifyFormat("x = (STACK_OF(uint64_t))*a;", Macros);
16842   verifyFormat("x = (STACK_OF(uint64_t))&a;", Macros);
16843   verifyFormat("vector<STACK_OF(uint64_t)* attr> x;", Macros);
16844 }
16845 
16846 TEST_F(FormatTest, AtomicQualifier) {
16847   // Check that we treate _Atomic as a type and not a function call
16848   FormatStyle Google = getGoogleStyleWithColumns(0);
16849   verifyFormat("struct foo {\n"
16850                "  int a1;\n"
16851                "  _Atomic(a) a2;\n"
16852                "  _Atomic(_Atomic(int) *const) a3;\n"
16853                "};",
16854                Google);
16855   verifyFormat("_Atomic(uint64_t) a;");
16856   verifyFormat("_Atomic(uint64_t) *a;");
16857   verifyFormat("_Atomic(uint64_t const *) *a;");
16858   verifyFormat("_Atomic(uint64_t *const) *a;");
16859   verifyFormat("_Atomic(const uint64_t *) *a;");
16860   verifyFormat("_Atomic(uint64_t) a;");
16861   verifyFormat("_Atomic(_Atomic(uint64_t)) a;");
16862   verifyFormat("_Atomic(_Atomic(uint64_t)) a, b;");
16863   verifyFormat("for (_Atomic(uint64_t) *a = NULL; a;) {\n}");
16864   verifyFormat("_Atomic(uint64_t) f(_Atomic(uint64_t) *arg);");
16865 
16866   verifyFormat("_Atomic(uint64_t) *s(InitValue);");
16867   verifyFormat("_Atomic(uint64_t) *s{InitValue};");
16868   FormatStyle Style = getLLVMStyle();
16869   Style.PointerAlignment = FormatStyle::PAS_Left;
16870   verifyFormat("_Atomic(uint64_t)* s(InitValue);", Style);
16871   verifyFormat("_Atomic(uint64_t)* s{InitValue};", Style);
16872   verifyFormat("_Atomic(int)* a;", Style);
16873   verifyFormat("_Atomic(int*)* a;", Style);
16874   verifyFormat("vector<_Atomic(uint64_t)* attr> x;", Style);
16875 
16876   Style.SpacesInCStyleCastParentheses = true;
16877   Style.SpacesInParentheses = false;
16878   verifyFormat("x = ( _Atomic(uint64_t) )*a;", Style);
16879   Style.SpacesInCStyleCastParentheses = false;
16880   Style.SpacesInParentheses = true;
16881   verifyFormat("x = (_Atomic( uint64_t ))*a;", Style);
16882   verifyFormat("x = (_Atomic( uint64_t ))&a;", Style);
16883 }
16884 
16885 TEST_F(FormatTest, AmbersandInLamda) {
16886   // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=41899
16887   FormatStyle AlignStyle = getLLVMStyle();
16888   AlignStyle.PointerAlignment = FormatStyle::PAS_Left;
16889   verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle);
16890   AlignStyle.PointerAlignment = FormatStyle::PAS_Right;
16891   verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle);
16892 }
16893 
16894 TEST_F(FormatTest, SpacesInConditionalStatement) {
16895   FormatStyle Spaces = getLLVMStyle();
16896   Spaces.SpacesInConditionalStatement = true;
16897   verifyFormat("for ( int i = 0; i; i++ )\n  continue;", Spaces);
16898   verifyFormat("if ( !a )\n  return;", Spaces);
16899   verifyFormat("if ( a )\n  return;", Spaces);
16900   verifyFormat("if constexpr ( a )\n  return;", Spaces);
16901   verifyFormat("switch ( a )\ncase 1:\n  return;", Spaces);
16902   verifyFormat("while ( a )\n  return;", Spaces);
16903   verifyFormat("while ( (a && b) )\n  return;", Spaces);
16904   verifyFormat("do {\n} while ( 1 != 0 );", Spaces);
16905   verifyFormat("try {\n} catch ( const std::exception & ) {\n}", Spaces);
16906   // Check that space on the left of "::" is inserted as expected at beginning
16907   // of condition.
16908   verifyFormat("while ( ::func() )\n  return;", Spaces);
16909 }
16910 
16911 TEST_F(FormatTest, AlternativeOperators) {
16912   // Test case for ensuring alternate operators are not
16913   // combined with their right most neighbour.
16914   verifyFormat("int a and b;");
16915   verifyFormat("int a and_eq b;");
16916   verifyFormat("int a bitand b;");
16917   verifyFormat("int a bitor b;");
16918   verifyFormat("int a compl b;");
16919   verifyFormat("int a not b;");
16920   verifyFormat("int a not_eq b;");
16921   verifyFormat("int a or b;");
16922   verifyFormat("int a xor b;");
16923   verifyFormat("int a xor_eq b;");
16924   verifyFormat("return this not_eq bitand other;");
16925   verifyFormat("bool operator not_eq(const X bitand other)");
16926 
16927   verifyFormat("int a and 5;");
16928   verifyFormat("int a and_eq 5;");
16929   verifyFormat("int a bitand 5;");
16930   verifyFormat("int a bitor 5;");
16931   verifyFormat("int a compl 5;");
16932   verifyFormat("int a not 5;");
16933   verifyFormat("int a not_eq 5;");
16934   verifyFormat("int a or 5;");
16935   verifyFormat("int a xor 5;");
16936   verifyFormat("int a xor_eq 5;");
16937 
16938   verifyFormat("int a compl(5);");
16939   verifyFormat("int a not(5);");
16940 
16941   /* FIXME handle alternate tokens
16942    * https://en.cppreference.com/w/cpp/language/operator_alternative
16943   // alternative tokens
16944   verifyFormat("compl foo();");     //  ~foo();
16945   verifyFormat("foo() <%%>;");      // foo();
16946   verifyFormat("void foo() <%%>;"); // void foo(){}
16947   verifyFormat("int a <:1:>;");     // int a[1];[
16948   verifyFormat("%:define ABC abc"); // #define ABC abc
16949   verifyFormat("%:%:");             // ##
16950   */
16951 }
16952 
16953 TEST_F(FormatTest, STLWhileNotDefineChed) {
16954   verifyFormat("#if defined(while)\n"
16955                "#define while EMIT WARNING C4005\n"
16956                "#endif // while");
16957 }
16958 
16959 TEST_F(FormatTest, OperatorSpacing) {
16960   FormatStyle Style = getLLVMStyle();
16961   Style.PointerAlignment = FormatStyle::PAS_Right;
16962   verifyFormat("Foo::operator*();", Style);
16963   verifyFormat("Foo::operator void *();", Style);
16964   verifyFormat("Foo::operator void **();", Style);
16965   verifyFormat("Foo::operator void *&();", Style);
16966   verifyFormat("Foo::operator void *&&();", Style);
16967   verifyFormat("Foo::operator()(void *);", Style);
16968   verifyFormat("Foo::operator*(void *);", Style);
16969   verifyFormat("Foo::operator*();", Style);
16970   verifyFormat("Foo::operator**();", Style);
16971   verifyFormat("Foo::operator&();", Style);
16972   verifyFormat("Foo::operator<int> *();", Style);
16973   verifyFormat("Foo::operator<Foo> *();", Style);
16974   verifyFormat("Foo::operator<int> **();", Style);
16975   verifyFormat("Foo::operator<Foo> **();", Style);
16976   verifyFormat("Foo::operator<int> &();", Style);
16977   verifyFormat("Foo::operator<Foo> &();", Style);
16978   verifyFormat("Foo::operator<int> &&();", Style);
16979   verifyFormat("Foo::operator<Foo> &&();", Style);
16980   verifyFormat("Foo::operator<int> *&();", Style);
16981   verifyFormat("Foo::operator<Foo> *&();", Style);
16982   verifyFormat("Foo::operator<int> *&&();", Style);
16983   verifyFormat("Foo::operator<Foo> *&&();", Style);
16984   verifyFormat("operator*(int (*)(), class Foo);", Style);
16985 
16986   verifyFormat("Foo::operator&();", Style);
16987   verifyFormat("Foo::operator void &();", Style);
16988   verifyFormat("Foo::operator()(void &);", Style);
16989   verifyFormat("Foo::operator&(void &);", Style);
16990   verifyFormat("Foo::operator&();", Style);
16991   verifyFormat("operator&(int (&)(), class Foo);", Style);
16992 
16993   verifyFormat("Foo::operator&&();", Style);
16994   verifyFormat("Foo::operator**();", Style);
16995   verifyFormat("Foo::operator void &&();", Style);
16996   verifyFormat("Foo::operator()(void &&);", Style);
16997   verifyFormat("Foo::operator&&(void &&);", Style);
16998   verifyFormat("Foo::operator&&();", Style);
16999   verifyFormat("operator&&(int(&&)(), class Foo);", Style);
17000   verifyFormat("operator const nsTArrayRight<E> &()", Style);
17001   verifyFormat("[[nodiscard]] operator const nsTArrayRight<E, Allocator> &()",
17002                Style);
17003   verifyFormat("operator void **()", Style);
17004   verifyFormat("operator const FooRight<Object> &()", Style);
17005   verifyFormat("operator const FooRight<Object> *()", Style);
17006   verifyFormat("operator const FooRight<Object> **()", Style);
17007   verifyFormat("operator const FooRight<Object> *&()", Style);
17008   verifyFormat("operator const FooRight<Object> *&&()", Style);
17009 
17010   Style.PointerAlignment = FormatStyle::PAS_Left;
17011   verifyFormat("Foo::operator*();", Style);
17012   verifyFormat("Foo::operator**();", Style);
17013   verifyFormat("Foo::operator void*();", Style);
17014   verifyFormat("Foo::operator void**();", Style);
17015   verifyFormat("Foo::operator void*&();", Style);
17016   verifyFormat("Foo::operator/*comment*/ void*();", Style);
17017   verifyFormat("Foo::operator/*a*/ const /*b*/ void*();", Style);
17018   verifyFormat("Foo::operator/*a*/ volatile /*b*/ void*();", Style);
17019   verifyFormat("Foo::operator()(void*);", Style);
17020   verifyFormat("Foo::operator*(void*);", Style);
17021   verifyFormat("Foo::operator*();", Style);
17022   verifyFormat("Foo::operator<int>*();", Style);
17023   verifyFormat("Foo::operator<Foo>*();", Style);
17024   verifyFormat("Foo::operator<int>**();", Style);
17025   verifyFormat("Foo::operator<Foo>**();", Style);
17026   verifyFormat("Foo::operator<Foo>*&();", Style);
17027   verifyFormat("Foo::operator<int>&();", Style);
17028   verifyFormat("Foo::operator<Foo>&();", Style);
17029   verifyFormat("Foo::operator<int>&&();", Style);
17030   verifyFormat("Foo::operator<Foo>&&();", Style);
17031   verifyFormat("Foo::operator<int>*&();", Style);
17032   verifyFormat("Foo::operator<Foo>*&();", Style);
17033   verifyFormat("operator*(int (*)(), class Foo);", Style);
17034 
17035   verifyFormat("Foo::operator&();", Style);
17036   verifyFormat("Foo::operator void&();", Style);
17037   verifyFormat("Foo::operator/*comment*/ void&();", Style);
17038   verifyFormat("Foo::operator/*a*/ const /*b*/ void&();", Style);
17039   verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&();", Style);
17040   verifyFormat("Foo::operator()(void&);", Style);
17041   verifyFormat("Foo::operator&(void&);", Style);
17042   verifyFormat("Foo::operator&();", Style);
17043   verifyFormat("operator&(int (&)(), class Foo);", Style);
17044 
17045   verifyFormat("Foo::operator&&();", Style);
17046   verifyFormat("Foo::operator void&&();", Style);
17047   verifyFormat("Foo::operator/*comment*/ void&&();", Style);
17048   verifyFormat("Foo::operator/*a*/ const /*b*/ void&&();", Style);
17049   verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&&();", Style);
17050   verifyFormat("Foo::operator()(void&&);", Style);
17051   verifyFormat("Foo::operator&&(void&&);", Style);
17052   verifyFormat("Foo::operator&&();", Style);
17053   verifyFormat("operator&&(int(&&)(), class Foo);", Style);
17054   verifyFormat("operator const nsTArrayLeft<E>&()", Style);
17055   verifyFormat("[[nodiscard]] operator const nsTArrayLeft<E, Allocator>&()",
17056                Style);
17057   verifyFormat("operator void**()", Style);
17058   verifyFormat("operator const FooLeft<Object>&()", Style);
17059   verifyFormat("operator const FooLeft<Object>*()", Style);
17060   verifyFormat("operator const FooLeft<Object>**()", Style);
17061   verifyFormat("operator const FooLeft<Object>*&()", Style);
17062   verifyFormat("operator const FooLeft<Object>*&&()", Style);
17063 
17064   // PR45107
17065   verifyFormat("operator Vector<String>&();", Style);
17066   verifyFormat("operator const Vector<String>&();", Style);
17067   verifyFormat("operator foo::Bar*();", Style);
17068   verifyFormat("operator const Foo<X>::Bar<Y>*();", Style);
17069   verifyFormat("operator/*a*/ const /*b*/ Foo /*c*/<X> /*d*/ ::Bar<Y>*();",
17070                Style);
17071 
17072   Style.PointerAlignment = FormatStyle::PAS_Middle;
17073   verifyFormat("Foo::operator*();", Style);
17074   verifyFormat("Foo::operator void *();", Style);
17075   verifyFormat("Foo::operator()(void *);", Style);
17076   verifyFormat("Foo::operator*(void *);", Style);
17077   verifyFormat("Foo::operator*();", Style);
17078   verifyFormat("operator*(int (*)(), class Foo);", Style);
17079 
17080   verifyFormat("Foo::operator&();", Style);
17081   verifyFormat("Foo::operator void &();", Style);
17082   verifyFormat("Foo::operator()(void &);", Style);
17083   verifyFormat("Foo::operator&(void &);", Style);
17084   verifyFormat("Foo::operator&();", Style);
17085   verifyFormat("operator&(int (&)(), class Foo);", Style);
17086 
17087   verifyFormat("Foo::operator&&();", Style);
17088   verifyFormat("Foo::operator void &&();", Style);
17089   verifyFormat("Foo::operator()(void &&);", Style);
17090   verifyFormat("Foo::operator&&(void &&);", Style);
17091   verifyFormat("Foo::operator&&();", Style);
17092   verifyFormat("operator&&(int(&&)(), class Foo);", Style);
17093 }
17094 
17095 TEST_F(FormatTest, OperatorPassedAsAFunctionPtr) {
17096   FormatStyle Style = getLLVMStyle();
17097   // PR46157
17098   verifyFormat("foo(operator+, -42);", Style);
17099   verifyFormat("foo(operator++, -42);", Style);
17100   verifyFormat("foo(operator--, -42);", Style);
17101   verifyFormat("foo(-42, operator--);", Style);
17102   verifyFormat("foo(-42, operator, );", Style);
17103   verifyFormat("foo(operator, , -42);", Style);
17104 }
17105 
17106 TEST_F(FormatTest, WhitespaceSensitiveMacros) {
17107   FormatStyle Style = getLLVMStyle();
17108   Style.WhitespaceSensitiveMacros.push_back("FOO");
17109 
17110   // Don't use the helpers here, since 'mess up' will change the whitespace
17111   // and these are all whitespace sensitive by definition
17112   EXPECT_EQ("FOO(String-ized&Messy+But(: :Still)=Intentional);",
17113             format("FOO(String-ized&Messy+But(: :Still)=Intentional);", Style));
17114   EXPECT_EQ(
17115       "FOO(String-ized&Messy+But\\(: :Still)=Intentional);",
17116       format("FOO(String-ized&Messy+But\\(: :Still)=Intentional);", Style));
17117   EXPECT_EQ("FOO(String-ized&Messy+But,: :Still=Intentional);",
17118             format("FOO(String-ized&Messy+But,: :Still=Intentional);", Style));
17119   EXPECT_EQ("FOO(String-ized&Messy+But,: :\n"
17120             "       Still=Intentional);",
17121             format("FOO(String-ized&Messy+But,: :\n"
17122                    "       Still=Intentional);",
17123                    Style));
17124   Style.AlignConsecutiveAssignments = true;
17125   EXPECT_EQ("FOO(String-ized=&Messy+But,: :\n"
17126             "       Still=Intentional);",
17127             format("FOO(String-ized=&Messy+But,: :\n"
17128                    "       Still=Intentional);",
17129                    Style));
17130 
17131   Style.ColumnLimit = 21;
17132   EXPECT_EQ("FOO(String-ized&Messy+But: :Still=Intentional);",
17133             format("FOO(String-ized&Messy+But: :Still=Intentional);", Style));
17134 }
17135 
17136 TEST_F(FormatTest, VeryLongNamespaceCommentSplit) {
17137   // These tests are not in NamespaceFixer because that doesn't
17138   // test its interaction with line wrapping
17139   FormatStyle Style = getLLVMStyle();
17140   Style.ColumnLimit = 80;
17141   verifyFormat("namespace {\n"
17142                "int i;\n"
17143                "int j;\n"
17144                "} // namespace",
17145                Style);
17146 
17147   verifyFormat("namespace AAA {\n"
17148                "int i;\n"
17149                "int j;\n"
17150                "} // namespace AAA",
17151                Style);
17152 
17153   EXPECT_EQ("namespace Averyveryveryverylongnamespace {\n"
17154             "int i;\n"
17155             "int j;\n"
17156             "} // namespace Averyveryveryverylongnamespace",
17157             format("namespace Averyveryveryverylongnamespace {\n"
17158                    "int i;\n"
17159                    "int j;\n"
17160                    "}",
17161                    Style));
17162 
17163   EXPECT_EQ(
17164       "namespace "
17165       "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::\n"
17166       "    went::mad::now {\n"
17167       "int i;\n"
17168       "int j;\n"
17169       "} // namespace\n"
17170       "  // "
17171       "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::"
17172       "went::mad::now",
17173       format("namespace "
17174              "would::it::save::you::a::lot::of::time::if_::i::"
17175              "just::gave::up::and_::went::mad::now {\n"
17176              "int i;\n"
17177              "int j;\n"
17178              "}",
17179              Style));
17180 
17181   // This used to duplicate the comment again and again on subsequent runs
17182   EXPECT_EQ(
17183       "namespace "
17184       "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::\n"
17185       "    went::mad::now {\n"
17186       "int i;\n"
17187       "int j;\n"
17188       "} // namespace\n"
17189       "  // "
17190       "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::"
17191       "went::mad::now",
17192       format("namespace "
17193              "would::it::save::you::a::lot::of::time::if_::i::"
17194              "just::gave::up::and_::went::mad::now {\n"
17195              "int i;\n"
17196              "int j;\n"
17197              "} // namespace\n"
17198              "  // "
17199              "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::"
17200              "and_::went::mad::now",
17201              Style));
17202 }
17203 
17204 TEST_F(FormatTest, LikelyUnlikely) {
17205   FormatStyle Style = getLLVMStyle();
17206 
17207   verifyFormat("if (argc > 5) [[unlikely]] {\n"
17208                "  return 29;\n"
17209                "}",
17210                Style);
17211 
17212   verifyFormat("if (argc > 5) [[likely]] {\n"
17213                "  return 29;\n"
17214                "}",
17215                Style);
17216 
17217   verifyFormat("if (argc > 5) [[unlikely]] {\n"
17218                "  return 29;\n"
17219                "} else [[likely]] {\n"
17220                "  return 42;\n"
17221                "}\n",
17222                Style);
17223 
17224   verifyFormat("if (argc > 5) [[unlikely]] {\n"
17225                "  return 29;\n"
17226                "} else if (argc > 10) [[likely]] {\n"
17227                "  return 99;\n"
17228                "} else {\n"
17229                "  return 42;\n"
17230                "}\n",
17231                Style);
17232 
17233   verifyFormat("if (argc > 5) [[gnu::unused]] {\n"
17234                "  return 29;\n"
17235                "}",
17236                Style);
17237 }
17238 
17239 TEST_F(FormatTest, PenaltyIndentedWhitespace) {
17240   verifyFormat("Constructor()\n"
17241                "    : aaaaaa(aaaaaa), aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
17242                "                          aaaa(aaaaaaaaaaaaaaaaaa, "
17243                "aaaaaaaaaaaaaaaaaat))");
17244   verifyFormat("Constructor()\n"
17245                "    : aaaaaaaaaaaaa(aaaaaa), "
17246                "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa)");
17247 
17248   FormatStyle StyleWithWhitespacePenalty = getLLVMStyle();
17249   StyleWithWhitespacePenalty.PenaltyIndentedWhitespace = 5;
17250   verifyFormat("Constructor()\n"
17251                "    : aaaaaa(aaaaaa),\n"
17252                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
17253                "          aaaa(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaat))",
17254                StyleWithWhitespacePenalty);
17255   verifyFormat("Constructor()\n"
17256                "    : aaaaaaaaaaaaa(aaaaaa), "
17257                "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa)",
17258                StyleWithWhitespacePenalty);
17259 }
17260 
17261 TEST_F(FormatTest, LLVMDefaultStyle) {
17262   FormatStyle Style = getLLVMStyle();
17263   verifyFormat("extern \"C\" {\n"
17264                "int foo();\n"
17265                "}",
17266                Style);
17267 }
17268 TEST_F(FormatTest, GNUDefaultStyle) {
17269   FormatStyle Style = getGNUStyle();
17270   verifyFormat("extern \"C\"\n"
17271                "{\n"
17272                "  int foo ();\n"
17273                "}",
17274                Style);
17275 }
17276 TEST_F(FormatTest, MozillaDefaultStyle) {
17277   FormatStyle Style = getMozillaStyle();
17278   verifyFormat("extern \"C\"\n"
17279                "{\n"
17280                "  int foo();\n"
17281                "}",
17282                Style);
17283 }
17284 TEST_F(FormatTest, GoogleDefaultStyle) {
17285   FormatStyle Style = getGoogleStyle();
17286   verifyFormat("extern \"C\" {\n"
17287                "int foo();\n"
17288                "}",
17289                Style);
17290 }
17291 TEST_F(FormatTest, ChromiumDefaultStyle) {
17292   FormatStyle Style = getChromiumStyle(FormatStyle::LanguageKind::LK_Cpp);
17293   verifyFormat("extern \"C\" {\n"
17294                "int foo();\n"
17295                "}",
17296                Style);
17297 }
17298 TEST_F(FormatTest, MicrosoftDefaultStyle) {
17299   FormatStyle Style = getMicrosoftStyle(FormatStyle::LanguageKind::LK_Cpp);
17300   verifyFormat("extern \"C\"\n"
17301                "{\n"
17302                "    int foo();\n"
17303                "}",
17304                Style);
17305 }
17306 TEST_F(FormatTest, WebKitDefaultStyle) {
17307   FormatStyle Style = getWebKitStyle();
17308   verifyFormat("extern \"C\" {\n"
17309                "int foo();\n"
17310                "}",
17311                Style);
17312 }
17313 
17314 TEST_F(FormatTest, ConceptsAndRequires) {
17315   FormatStyle Style = getLLVMStyle();
17316   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
17317 
17318   verifyFormat("template <typename T>\n"
17319                "concept Hashable = requires(T a) {\n"
17320                "  { std::hash<T>{}(a) } -> std::convertible_to<std::size_t>;\n"
17321                "};",
17322                Style);
17323   verifyFormat("template <typename T>\n"
17324                "concept EqualityComparable = requires(T a, T b) {\n"
17325                "  { a == b } -> bool;\n"
17326                "};",
17327                Style);
17328   verifyFormat("template <typename T>\n"
17329                "concept EqualityComparable = requires(T a, T b) {\n"
17330                "  { a == b } -> bool;\n"
17331                "  { a != b } -> bool;\n"
17332                "};",
17333                Style);
17334   verifyFormat("template <typename T>\n"
17335                "concept EqualityComparable = requires(T a, T b) {\n"
17336                "  { a == b } -> bool;\n"
17337                "  { a != b } -> bool;\n"
17338                "};",
17339                Style);
17340 
17341   verifyFormat("template <typename It>\n"
17342                "requires Iterator<It>\n"
17343                "void sort(It begin, It end) {\n"
17344                "  //....\n"
17345                "}",
17346                Style);
17347 
17348   verifyFormat("template <typename T>\n"
17349                "concept Large = sizeof(T) > 10;",
17350                Style);
17351 
17352   verifyFormat("template <typename T, typename U>\n"
17353                "concept FooableWith = requires(T t, U u) {\n"
17354                "  typename T::foo_type;\n"
17355                "  { t.foo(u) } -> typename T::foo_type;\n"
17356                "  t++;\n"
17357                "};\n"
17358                "void doFoo(FooableWith<int> auto t) {\n"
17359                "  t.foo(3);\n"
17360                "}",
17361                Style);
17362   verifyFormat("template <typename T>\n"
17363                "concept Context = sizeof(T) == 1;",
17364                Style);
17365   verifyFormat("template <typename T>\n"
17366                "concept Context = is_specialization_of_v<context, T>;",
17367                Style);
17368   verifyFormat("template <typename T>\n"
17369                "concept Node = std::is_object_v<T>;",
17370                Style);
17371   verifyFormat("template <typename T>\n"
17372                "concept Tree = true;",
17373                Style);
17374 
17375   verifyFormat("template <typename T> int g(T i) requires Concept1<I> {\n"
17376                "  //...\n"
17377                "}",
17378                Style);
17379 
17380   verifyFormat(
17381       "template <typename T> int g(T i) requires Concept1<I> && Concept2<I> {\n"
17382       "  //...\n"
17383       "}",
17384       Style);
17385 
17386   verifyFormat(
17387       "template <typename T> int g(T i) requires Concept1<I> || Concept2<I> {\n"
17388       "  //...\n"
17389       "}",
17390       Style);
17391 
17392   verifyFormat("template <typename T>\n"
17393                "veryveryvery_long_return_type g(T i) requires Concept1<I> || "
17394                "Concept2<I> {\n"
17395                "  //...\n"
17396                "}",
17397                Style);
17398 
17399   verifyFormat("template <typename T>\n"
17400                "veryveryvery_long_return_type g(T i) requires Concept1<I> && "
17401                "Concept2<I> {\n"
17402                "  //...\n"
17403                "}",
17404                Style);
17405 
17406   verifyFormat(
17407       "template <typename T>\n"
17408       "veryveryvery_long_return_type g(T i) requires Concept1 && Concept2 {\n"
17409       "  //...\n"
17410       "}",
17411       Style);
17412 
17413   verifyFormat(
17414       "template <typename T>\n"
17415       "veryveryvery_long_return_type g(T i) requires Concept1 || Concept2 {\n"
17416       "  //...\n"
17417       "}",
17418       Style);
17419 
17420   verifyFormat("template <typename It>\n"
17421                "requires Foo<It>() && Bar<It> {\n"
17422                "  //....\n"
17423                "}",
17424                Style);
17425 
17426   verifyFormat("template <typename It>\n"
17427                "requires Foo<Bar<It>>() && Bar<Foo<It, It>> {\n"
17428                "  //....\n"
17429                "}",
17430                Style);
17431 
17432   verifyFormat("template <typename It>\n"
17433                "requires Foo<Bar<It, It>>() && Bar<Foo<It, It>> {\n"
17434                "  //....\n"
17435                "}",
17436                Style);
17437 
17438   verifyFormat(
17439       "template <typename It>\n"
17440       "requires Foo<Bar<It>, Baz<It>>() && Bar<Foo<It>, Baz<It, It>> {\n"
17441       "  //....\n"
17442       "}",
17443       Style);
17444 
17445   Style.IndentRequires = true;
17446   verifyFormat("template <typename It>\n"
17447                "  requires Iterator<It>\n"
17448                "void sort(It begin, It end) {\n"
17449                "  //....\n"
17450                "}",
17451                Style);
17452   verifyFormat("template <std::size index_>\n"
17453                "  requires(index_ < sizeof...(Children_))\n"
17454                "Tree auto &child() {\n"
17455                "  // ...\n"
17456                "}",
17457                Style);
17458 
17459   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
17460   verifyFormat("template <typename T>\n"
17461                "concept Hashable = requires (T a) {\n"
17462                "  { std::hash<T>{}(a) } -> std::convertible_to<std::size_t>;\n"
17463                "};",
17464                Style);
17465 
17466   verifyFormat("template <class T = void>\n"
17467                "  requires EqualityComparable<T> || Same<T, void>\n"
17468                "struct equal_to;",
17469                Style);
17470 
17471   verifyFormat("template <class T>\n"
17472                "  requires requires {\n"
17473                "    T{};\n"
17474                "    T (int);\n"
17475                "  }\n",
17476                Style);
17477 
17478   Style.ColumnLimit = 78;
17479   verifyFormat("template <typename T>\n"
17480                "concept Context = Traits<typename T::traits_type> and\n"
17481                "    Interface<typename T::interface_type> and\n"
17482                "    Request<typename T::request_type> and\n"
17483                "    Response<typename T::response_type> and\n"
17484                "    ContextExtension<typename T::extension_type> and\n"
17485                "    ::std::is_copy_constructable<T> and "
17486                "::std::is_move_constructable<T> and\n"
17487                "    requires (T c) {\n"
17488                "  { c.response; } -> Response;\n"
17489                "} and requires (T c) {\n"
17490                "  { c.request; } -> Request;\n"
17491                "}\n",
17492                Style);
17493 
17494   verifyFormat("template <typename T>\n"
17495                "concept Context = Traits<typename T::traits_type> or\n"
17496                "    Interface<typename T::interface_type> or\n"
17497                "    Request<typename T::request_type> or\n"
17498                "    Response<typename T::response_type> or\n"
17499                "    ContextExtension<typename T::extension_type> or\n"
17500                "    ::std::is_copy_constructable<T> or "
17501                "::std::is_move_constructable<T> or\n"
17502                "    requires (T c) {\n"
17503                "  { c.response; } -> Response;\n"
17504                "} or requires (T c) {\n"
17505                "  { c.request; } -> Request;\n"
17506                "}\n",
17507                Style);
17508 
17509   verifyFormat("template <typename T>\n"
17510                "concept Context = Traits<typename T::traits_type> &&\n"
17511                "    Interface<typename T::interface_type> &&\n"
17512                "    Request<typename T::request_type> &&\n"
17513                "    Response<typename T::response_type> &&\n"
17514                "    ContextExtension<typename T::extension_type> &&\n"
17515                "    ::std::is_copy_constructable<T> && "
17516                "::std::is_move_constructable<T> &&\n"
17517                "    requires (T c) {\n"
17518                "  { c.response; } -> Response;\n"
17519                "} && requires (T c) {\n"
17520                "  { c.request; } -> Request;\n"
17521                "}\n",
17522                Style);
17523 
17524   verifyFormat("template <typename T>\nconcept someConcept = Constraint1<T> && "
17525                "Constraint2<T>;");
17526 
17527   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
17528   Style.BraceWrapping.AfterFunction = true;
17529   Style.BraceWrapping.AfterClass = true;
17530   Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
17531   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
17532   verifyFormat("void Foo () requires (std::copyable<T>)\n"
17533                "{\n"
17534                "  return\n"
17535                "}\n",
17536                Style);
17537 
17538   verifyFormat("void Foo () requires std::copyable<T>\n"
17539                "{\n"
17540                "  return\n"
17541                "}\n",
17542                Style);
17543 
17544   verifyFormat("template <std::semiregular F, std::semiregular... Args>\n"
17545                "  requires (std::invocable<F, std::invoke_result_t<Args>...>)\n"
17546                "struct constant;",
17547                Style);
17548 
17549   verifyFormat("template <std::semiregular F, std::semiregular... Args>\n"
17550                "  requires std::invocable<F, std::invoke_result_t<Args>...>\n"
17551                "struct constant;",
17552                Style);
17553 
17554   verifyFormat("template <class T>\n"
17555                "class plane_with_very_very_very_long_name\n"
17556                "{\n"
17557                "  constexpr plane_with_very_very_very_long_name () requires "
17558                "std::copyable<T>\n"
17559                "      : plane_with_very_very_very_long_name (1)\n"
17560                "  {\n"
17561                "  }\n"
17562                "}\n",
17563                Style);
17564 
17565   verifyFormat("template <class T>\n"
17566                "class plane_with_long_name\n"
17567                "{\n"
17568                "  constexpr plane_with_long_name () requires std::copyable<T>\n"
17569                "      : plane_with_long_name (1)\n"
17570                "  {\n"
17571                "  }\n"
17572                "}\n",
17573                Style);
17574 
17575   Style.BreakBeforeConceptDeclarations = false;
17576   verifyFormat("template <typename T> concept Tree = true;", Style);
17577 
17578   Style.IndentRequires = false;
17579   verifyFormat("template <std::semiregular F, std::semiregular... Args>\n"
17580                "requires (std::invocable<F, std::invoke_result_t<Args>...>) "
17581                "struct constant;",
17582                Style);
17583 }
17584 
17585 TEST_F(FormatTest, IndentPragmas) {
17586   FormatStyle Style = getLLVMStyle();
17587   Style.IndentPPDirectives = FormatStyle::PPDIS_None;
17588 
17589   Style.IndentPragmas = false;
17590   verifyFormat("#pragma once", Style);
17591   verifyFormat("#pragma omp simd\n"
17592                "for (int i = 0; i < 10; i++) {\n"
17593                "}",
17594                Style);
17595   verifyFormat("void foo() {\n"
17596                "#pragma omp simd\n"
17597                "  for (int i = 0; i < 10; i++) {\n"
17598                "  }\n"
17599                "}",
17600                Style);
17601   verifyFormat("void foo() {\n"
17602                "// outer loop\n"
17603                "#pragma omp simd\n"
17604                "  for (int k = 0; k < 10; k++) {\n"
17605                "// inner loop\n"
17606                "#pragma omp simd\n"
17607                "    for (int j = 0; j < 10; j++) {\n"
17608                "    }\n"
17609                "  }\n"
17610                "}",
17611                Style);
17612 
17613   verifyFormat("void foo() {\n"
17614                "// outer loop\n"
17615                "#if 1\n"
17616                "#pragma omp simd\n"
17617                "  for (int k = 0; k < 10; k++) {\n"
17618                "// inner loop\n"
17619                "#pragma omp simd\n"
17620                "    for (int j = 0; j < 10; j++) {\n"
17621                "    }\n"
17622                "  }\n"
17623                "#endif\n"
17624                "}",
17625                Style);
17626 
17627   Style.IndentPragmas = true;
17628   verifyFormat("#pragma once", Style);
17629   verifyFormat("#pragma omp simd\n"
17630                "for (int i = 0; i < 10; i++) {\n"
17631                "}",
17632                Style);
17633   verifyFormat("void foo() {\n"
17634                "  #pragma omp simd\n"
17635                "  for (int i = 0; i < 10; i++) {\n"
17636                "  }\n"
17637                "}",
17638                Style);
17639   verifyFormat("void foo() {\n"
17640                "  #pragma omp simd\n"
17641                "  for (int i = 0; i < 10; i++) {\n"
17642                "    #pragma omp simd\n"
17643                "    for (int j = 0; j < 10; j++) {\n"
17644                "    }\n"
17645                "  }\n"
17646                "}",
17647                Style);
17648 
17649   verifyFormat("void foo() {\n"
17650                "  #pragma omp simd\n"
17651                "  for (...) {\n"
17652                "    #pragma omp simd\n"
17653                "    for (...) {\n"
17654                "    }\n"
17655                "  }\n"
17656                "}",
17657                Style);
17658 
17659   Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash;
17660 
17661   verifyFormat("void foo() {\n"
17662                "# pragma omp simd\n"
17663                "  for (int i = 0; i < 10; i++) {\n"
17664                "#   pragma omp simd\n"
17665                "    for (int j = 0; j < 10; j++) {\n"
17666                "    }\n"
17667                "  }\n"
17668                "}",
17669                Style);
17670 
17671   verifyFormat("void foo() {\n"
17672                "#if 1\n"
17673                "# pragma omp simd\n"
17674                "  for (int k = 0; k < 10; k++) {\n"
17675                "#   pragma omp simd\n"
17676                "    for (int j = 0; j < 10; j++) {\n"
17677                "    }\n"
17678                "  }\n"
17679                "#endif\n"
17680                "}",
17681                Style);
17682 
17683   Style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash;
17684   EXPECT_EQ("void foo() {\n"
17685             "#if 1\n"
17686             "  #pragma omp simd\n"
17687             "  for (int k = 0; k < 10; k++) {\n"
17688             "    #pragma omp simd\n"
17689             "    for (int j = 0; j < 10; j++) {\n"
17690             "    }\n"
17691             "  }\n"
17692             "#endif\n"
17693             "}",
17694             format("void foo() {\n"
17695                    "#if 1\n"
17696                    "  #pragma omp simd\n"
17697                    "  for (int k = 0; k < 10; k++) {\n"
17698                    "    #pragma omp simd\n"
17699                    "    for (int j = 0; j < 10; j++) {\n"
17700                    "    }\n"
17701                    "  }\n"
17702                    "#endif\n"
17703                    "}",
17704                    Style));
17705 }
17706 
17707 } // namespace
17708 } // namespace format
17709 } // namespace clang
17710