Fix test diff on Phabricator.

http://reviews.llvm.org/D10370

Files:
  docs/ClangFormatStyleOptions.rst
  include/clang/Format/Format.h
  lib/Format/ContinuationIndenter.cpp
  lib/Format/Format.cpp
  lib/Format/TokenAnnotator.cpp
  unittests/Format/FormatTest.cpp

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
Index: docs/ClangFormatStyleOptions.rst
===================================================================
--- docs/ClangFormatStyleOptions.rst
+++ docs/ClangFormatStyleOptions.rst
@@ -218,12 +218,24 @@
   If ``true``, ``while (true) continue;`` can be put on a
   single line.
 
+**AlwaysBreakAfterDeclarationReturnType** (``bool``)
+  If ``true``, always break after function declaration (prototype) return
+  types.
+
+  More truthfully called 'break before the identifier following the type
+  in a function declarations'. PenaltyReturnTypeOnItsOwnLine becomes
+  irrelevant for function declarations.
+
+  See also AlwaysBreakAfterDefinitionReturnType.
+
 **AlwaysBreakAfterDefinitionReturnType** (``bool``)
   If ``true``, always break after function definition return types.
 
   More truthfully called 'break before the identifier following the type
   in a function definition'. PenaltyReturnTypeOnItsOwnLine becomes
-  irrelevant.
+  irrelevant for function definitions.
+
+  See also AlwaysBreakAfterDeclarationReturnType.
 
 **AlwaysBreakBeforeMultilineStrings** (``bool``)
   If ``true``, always break before multiline string literals.
Index: include/clang/Format/Format.h
===================================================================
--- include/clang/Format/Format.h
+++ include/clang/Format/Format.h
@@ -275,11 +275,23 @@
   /// \brief The number of characters to use for indentation of ObjC blocks.
   unsigned ObjCBlockIndentWidth;
 
+  /// If \c true, always break after function declaration (prototype) return
+  /// types.
+  ///
+  /// More truthfully called 'break before the identifier following the type
+  /// in a function declarations'. PenaltyReturnTypeOnItsOwnLine becomes
+  /// irrelevant for function declarations.
+  ///
+  /// See also AlwaysBreakAfterDefinitionReturnType.
+  bool AlwaysBreakAfterDeclarationReturnType;
+
   /// \brief If \c true, always break after function definition return types.
   ///
   /// More truthfully called 'break before the identifier following the type
   /// in a function definition'. PenaltyReturnTypeOnItsOwnLine becomes
-  /// irrelevant.
+  /// irrelevant for function definitions.
+  ///
+  /// See also AlwaysBreakAfterDeclarationReturnType.
   bool AlwaysBreakAfterDefinitionReturnType;
 
   /// \brief If \c true, always break after the <tt>template<...></tt> of a
@@ -433,6 +445,8 @@
            AllowShortIfStatementsOnASingleLine ==
                R.AllowShortIfStatementsOnASingleLine &&
            AllowShortLoopsOnASingleLine == R.AllowShortLoopsOnASingleLine &&
+           AlwaysBreakAfterDeclarationReturnType ==
+               R.AlwaysBreakAfterDeclarationReturnType &&
            AlwaysBreakAfterDefinitionReturnType ==
                R.AlwaysBreakAfterDefinitionReturnType &&
            AlwaysBreakTemplateDeclarations ==
Index: lib/Format/ContinuationIndenter.cpp
===================================================================
--- lib/Format/ContinuationIndenter.cpp
+++ lib/Format/ContinuationIndenter.cpp
@@ -126,7 +126,9 @@
   // Don't break after very short return types (e.g. "void") as that is often
   // unexpected.
   if (Current.is(TT_FunctionDeclarationName) &&
-      !Style.AlwaysBreakAfterDefinitionReturnType && State.Column < 6)
+      !(Style.AlwaysBreakAfterDefinitionReturnType ||
+        Style.AlwaysBreakAfterDeclarationReturnType) &&
+      State.Column < 6)
     return false;
 
   return !State.Stack.back().NoLineBreak;
Index: lib/Format/Format.cpp
===================================================================
--- lib/Format/Format.cpp
+++ lib/Format/Format.cpp
@@ -187,6 +187,8 @@
                    Style.AllowShortLoopsOnASingleLine);
     IO.mapOptional("AllowShortFunctionsOnASingleLine",
                    Style.AllowShortFunctionsOnASingleLine);
+    IO.mapOptional("AlwaysBreakAfterDeclarationReturnType",
+                   Style.AlwaysBreakAfterDeclarationReturnType);
     IO.mapOptional("AlwaysBreakAfterDefinitionReturnType",
                    Style.AlwaysBreakAfterDefinitionReturnType);
     IO.mapOptional("AlwaysBreakTemplateDeclarations",
@@ -337,6 +339,7 @@
   LLVMStyle.AllowShortCaseLabelsOnASingleLine = false;
   LLVMStyle.AllowShortIfStatementsOnASingleLine = false;
   LLVMStyle.AllowShortLoopsOnASingleLine = false;
+  LLVMStyle.AlwaysBreakAfterDeclarationReturnType = false;
   LLVMStyle.AlwaysBreakAfterDefinitionReturnType = false;
   LLVMStyle.AlwaysBreakBeforeMultilineStrings = false;
   LLVMStyle.AlwaysBreakTemplateDeclarations = false;
Index: lib/Format/TokenAnnotator.cpp
===================================================================
--- lib/Format/TokenAnnotator.cpp
+++ lib/Format/TokenAnnotator.cpp
@@ -1537,12 +1537,15 @@
     Current->MustBreakBefore =
         Current->MustBreakBefore || mustBreakBefore(Line, *Current);
 
-    if (Style.AlwaysBreakAfterDefinitionReturnType && InFunctionDecl &&
-        Current->is(TT_FunctionDeclarationName) &&
-        !Line.Last->isOneOf(tok::semi, tok::comment)) // Only for definitions.
+    if (!Current->MustBreakBefore && InFunctionDecl &&
+        Current->is(TT_FunctionDeclarationName)) {
       // FIXME: Line.Last points to other characters than tok::semi
       // and tok::lbrace.
-      Current->MustBreakBefore = true;
+      bool IsDefinition = !Line.Last->isOneOf(tok::semi, tok::comment);
+      if ((IsDefinition && Style.AlwaysBreakAfterDefinitionReturnType) ||
+          (!IsDefinition && Style.AlwaysBreakAfterDeclarationReturnType))
+        Current->MustBreakBefore = true;
+    }
 
     Current->CanBreakBefore =
         Current->MustBreakBefore || canBreakBefore(Line, *Current);
Index: unittests/Format/FormatTest.cpp
===================================================================
--- unittests/Format/FormatTest.cpp
+++ unittests/Format/FormatTest.cpp
@@ -4868,6 +4868,84 @@
                AfterType);
 }
 
+TEST_F(FormatTest, AlwaysBreakAfterDeclarationReturnType) {
+  FormatStyle AfterType = getLLVMStyle();
+  AfterType.AlwaysBreakAfterDeclarationReturnType = true;
+  verifyFormat("const char *\n"
+               "bar(void);\n"            // Break here.
+               "const char *f(void) {\n" // No break here.
+               "  f();\n"
+               "  return \"\";\n"
+               "}\n",
+               AfterType);
+  verifyFormat("template <class T>\n"
+               "T *\n"
+               "f(T &c);\n"                        // Break here.
+               "template <class T> T *f(T &c) {\n" // No break here.
+               "  f(c);\n"
+               "  return NULL;\n"
+               "}\n",
+               AfterType);
+  AfterType.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
+  verifyFormat("const char *\n"
+               "bar(void);\n"          // Break here.
+               "const char *f(void)\n" // No break here.
+               "{\n"
+               "  f();\n"
+               "  return \"\";\n"
+               "}\n",
+               AfterType);
+  verifyFormat("template <class T>\n"
+               "T *\n"
+               "f(T &c);\n"                      // Break here.
+               "template <class T> T *f(T &c)\n" // No break here.
+               "{\n"
+               "  f(c);\n"
+               "  return NULL;\n"
+               "}\n",
+               AfterType);
+}
+
+TEST_F(FormatTest, AlwaysBreakAfterDeclarationAndDefinitionReturnTypeMixed) {
+  FormatStyle AfterType = getLLVMStyle();
+  AfterType.AlwaysBreakAfterDeclarationReturnType = false;
+  AfterType.AlwaysBreakAfterDefinitionReturnType = false;
+  verifyFormat("void f(void) {\n" // No break here.
+               "  f();\n"
+               "  f();\n"
+               "}\n"
+               "void bar(void);\n", // No break here.
+               AfterType);
+  AfterType.AlwaysBreakAfterDeclarationReturnType = true;
+  AfterType.AlwaysBreakAfterDefinitionReturnType = false;
+  verifyFormat("void f(void) {\n" // No break here.
+               "  f();\n"
+               "  f();\n"
+               "}\n"
+               "void\n"
+               "bar(void);\n", // Break here.
+               AfterType);
+  AfterType.AlwaysBreakAfterDeclarationReturnType = false;
+  AfterType.AlwaysBreakAfterDefinitionReturnType = true;
+  verifyFormat("void\n"
+               "f(void) {\n" // Break here.
+               "  f();\n"
+               "  f();\n"
+               "}\n"
+               "void bar(void);\n", // No break here.
+               AfterType);
+  AfterType.AlwaysBreakAfterDeclarationReturnType = true;
+  AfterType.AlwaysBreakAfterDefinitionReturnType = true;
+  verifyFormat("void\n"
+               "f(void) {\n" // Break here.
+               "  f();\n"
+               "  f();\n"
+               "}\n"
+               "void\n"
+               "bar(void);\n", // Break here.
+               AfterType);
+}
+
 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
   FormatStyle NoBreak = getLLVMStyle();
   NoBreak.AlwaysBreakBeforeMultilineStrings = false;
@@ -9382,6 +9460,7 @@
   CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
   CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
   CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
+  CHECK_PARSE_BOOL(AlwaysBreakAfterDeclarationReturnType);
   CHECK_PARSE_BOOL(AlwaysBreakAfterDefinitionReturnType);
   CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
   CHECK_PARSE_BOOL(BinPackParameters);
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to