<div dir="ltr">This should be fixed by r<span style="color:rgb(33,33,33);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15.6px">332465</span></div><br><div class="gmail_quote"><div dir="ltr">On Wed, May 16, 2018 at 2:50 PM Eric Liu <<a href="mailto:ioeric@google.com">ioeric@google.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">OK, I'll send a fix for the index test. Please make sure you run all clang tests (`ninja check-clang` and `ninja check-clang-tools`) before landing a patch! Thanks! </div><br><div class="gmail_quote"><div dir="ltr">On Wed, May 16, 2018 at 2:32 PM Eric Liu <<a href="mailto:ioeric@google.com" target="_blank">ioeric@google.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I can also reproduce on my local machine (Debian).</div><br><div class="gmail_quote"><div dir="ltr">On Wed, May 16, 2018 at 1:01 PM David Zarzycki via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This change broke `test/Index/overriding-ftemplate-comments.cpp` on Red Hat Fedora 28. Was this expected?<br>
<br>
> On May 16, 2018, at 4:25 AM, Francois Ferrand via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>> wrote:<br>
> <br>
> Author: typz<br>
> Date: Wed May 16 01:25:03 2018<br>
> New Revision: 332436<br>
> <br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=332436&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=332436&view=rev</a><br>
> Log:<br>
> clang-format: Allow optimizer to break template declaration.<br>
> <br>
> Summary:<br>
> Introduce `PenaltyBreakTemplateDeclaration` to control the penalty,<br>
> and change `AlwaysBreakTemplateDeclarations` to an enum with 3 modes:<br>
> * `No` for regular, penalty based, wrapping of template declaration<br>
> * `MultiLine` for always wrapping before multi-line declarations (e.g.<br>
>  same as legacy behavior when `AlwaysBreakTemplateDeclarations=false`)<br>
> * `Yes` for always wrapping (e.g. same as legacy behavior when<br>
>  `AlwaysBreakTemplateDeclarations=true`)<br>
> <br>
> Reviewers: krasimir, djasper, klimek<br>
> <br>
> Subscribers: cfe-commits<br>
> <br>
> Differential Revision: <a href="https://reviews.llvm.org/D42684" rel="noreferrer" target="_blank">https://reviews.llvm.org/D42684</a><br>
> <br>
> Modified:<br>
>    cfe/trunk/docs/ClangFormatStyleOptions.rst<br>
>    cfe/trunk/include/clang/Format/Format.h<br>
>    cfe/trunk/lib/Format/ContinuationIndenter.cpp<br>
>    cfe/trunk/lib/Format/Format.cpp<br>
>    cfe/trunk/lib/Format/TokenAnnotator.cpp<br>
>    cfe/trunk/unittests/Format/FormatTest.cpp<br>
> <br>
> Modified: cfe/trunk/docs/ClangFormatStyleOptions.rst<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/ClangFormatStyleOptions.rst?rev=332436&r1=332435&r2=332436&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/ClangFormatStyleOptions.rst?rev=332436&r1=332435&r2=332436&view=diff</a><br>
> ==============================================================================<br>
> --- cfe/trunk/docs/ClangFormatStyleOptions.rst (original)<br>
> +++ cfe/trunk/docs/ClangFormatStyleOptions.rst Wed May 16 01:25:03 2018<br>
> @@ -490,15 +490,50 @@ the configuration (without a prefix: ``A<br>
>          "bbbb"                                    "cccc";<br>
>          "cccc";<br>
> <br>
> -**AlwaysBreakTemplateDeclarations** (``bool``)<br>
> -  If ``true``, always break after the ``template<...>`` of a template<br>
> -  declaration.<br>
> +**AlwaysBreakTemplateDeclarations** (``BreakTemplateDeclarationsStyle``)<br>
> +  The template declaration breaking style to use.<br>
> +<br>
> +  Possible values:<br>
> +<br>
> +  * ``BTDS_No`` (in configuration: ``No``)<br>
> +    Do not force break before declaration.<br>
> +    ``PenaltyBreakTemplateDeclaration`` is taken into account.<br>
> +<br>
> +    .. code-block:: c++<br>
> +<br>
> +       template <typename T> T foo() {<br>
> +       }<br>
> +       template <typename T> T foo(int aaaaaaaaaaaaaaaaaaaaa,<br>
> +                                   int bbbbbbbbbbbbbbbbbbbbb) {<br>
> +       }<br>
> +<br>
> +  * ``BTDS_MultiLine`` (in configuration: ``MultiLine``)<br>
> +    Force break after template declaration only when the following<br>
> +    declaration spans multiple lines.<br>
> +<br>
> +    .. code-block:: c++<br>
> +<br>
> +       template <typename T> T foo() {<br>
> +       }<br>
> +       template <typename T><br>
> +       T foo(int aaaaaaaaaaaaaaaaaaaaa,<br>
> +             int bbbbbbbbbbbbbbbbbbbbb) {<br>
> +       }<br>
> +<br>
> +  * ``BTDS_Yes`` (in configuration: ``Yes``)<br>
> +    Always break after template declaration.<br>
> +<br>
> +    .. code-block:: c++<br>
> +<br>
> +       template <typename T><br>
> +       T foo() {<br>
> +       }<br>
> +       template <typename T><br>
> +       T foo(int aaaaaaaaaaaaaaaaaaaaa,<br>
> +             int bbbbbbbbbbbbbbbbbbbbb) {<br>
> +       }<br>
> <br>
> -  .. code-block:: c++<br>
> <br>
> -     true:                                  false:<br>
> -     template <typename T>          vs.     template <typename T> class C {};<br>
> -     class C {};<br>
> <br>
> **BinPackArguments** (``bool``)<br>
>   If ``false``, a function call's arguments will either be all on the<br>
> @@ -1590,6 +1625,9 @@ the configuration (without a prefix: ``A<br>
> **PenaltyBreakString** (``unsigned``)<br>
>   The penalty for each line break introduced inside a string literal.<br>
> <br>
> +**PenaltyBreakTemplateDeclaration** (``unsigned``)<br>
> +  The penalty for breaking after template declaration.<br>
> +<br>
> **PenaltyExcessCharacter** (``unsigned``)<br>
>   The penalty for each character outside of the column limit.<br>
> <br>
> <br>
> Modified: cfe/trunk/include/clang/Format/Format.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Format/Format.h?rev=332436&r1=332435&r2=332436&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Format/Format.h?rev=332436&r1=332435&r2=332436&view=diff</a><br>
> ==============================================================================<br>
> --- cfe/trunk/include/clang/Format/Format.h (original)<br>
> +++ cfe/trunk/include/clang/Format/Format.h Wed May 16 01:25:03 2018<br>
> @@ -351,14 +351,44 @@ struct FormatStyle {<br>
>   /// \endcode<br>
>   bool AlwaysBreakBeforeMultilineStrings;<br>
> <br>
> -  /// If ``true``, always break after the ``template<...>`` of a template<br>
> -  /// declaration.<br>
> -  /// \code<br>
> -  ///    true:                                  false:<br>
> -  ///    template <typename T>          vs.     template <typename T> class C {};<br>
> -  ///    class C {};<br>
> -  /// \endcode<br>
> -  bool AlwaysBreakTemplateDeclarations;<br>
> +  /// Different ways to break after the template declaration.<br>
> +  enum BreakTemplateDeclarationsStyle {<br>
> +      /// Do not force break before declaration.<br>
> +      /// ``PenaltyBreakTemplateDeclaration`` is taken into account.<br>
> +      /// \code<br>
> +      ///    template <typename T> T foo() {<br>
> +      ///    }<br>
> +      ///    template <typename T> T foo(int aaaaaaaaaaaaaaaaaaaaa,<br>
> +      ///                                int bbbbbbbbbbbbbbbbbbbbb) {<br>
> +      ///    }<br>
> +      /// \endcode<br>
> +      BTDS_No,<br>
> +      /// Force break after template declaration only when the following<br>
> +      /// declaration spans multiple lines.<br>
> +      /// \code<br>
> +      ///    template <typename T> T foo() {<br>
> +      ///    }<br>
> +      ///    template <typename T><br>
> +      ///    T foo(int aaaaaaaaaaaaaaaaaaaaa,<br>
> +      ///          int bbbbbbbbbbbbbbbbbbbbb) {<br>
> +      ///    }<br>
> +      /// \endcode<br>
> +      BTDS_MultiLine,<br>
> +      /// Always break after template declaration.<br>
> +      /// \code<br>
> +      ///    template <typename T><br>
> +      ///    T foo() {<br>
> +      ///    }<br>
> +      ///    template <typename T><br>
> +      ///    T foo(int aaaaaaaaaaaaaaaaaaaaa,<br>
> +      ///          int bbbbbbbbbbbbbbbbbbbbb) {<br>
> +      ///    }<br>
> +      /// \endcode<br>
> +      BTDS_Yes<br>
> +  };<br>
> +<br>
> +  /// The template declaration breaking style to use.<br>
> +  BreakTemplateDeclarationsStyle AlwaysBreakTemplateDeclarations;<br>
> <br>
>   /// If ``false``, a function call's arguments will either be all on the<br>
>   /// same line or will have one line each.<br>
> @@ -1295,6 +1325,9 @@ struct FormatStyle {<br>
>   /// The penalty for each line break introduced inside a string literal.<br>
>   unsigned PenaltyBreakString;<br>
> <br>
> +  /// The penalty for breaking after template declaration.<br>
> +  unsigned PenaltyBreakTemplateDeclaration;<br>
> +<br>
>   /// The penalty for each character outside of the column limit.<br>
>   unsigned PenaltyExcessCharacter;<br>
> <br>
> @@ -1679,6 +1712,8 @@ struct FormatStyle {<br>
>            PenaltyBreakString == R.PenaltyBreakString &&<br>
>            PenaltyExcessCharacter == R.PenaltyExcessCharacter &&<br>
>            PenaltyReturnTypeOnItsOwnLine == R.PenaltyReturnTypeOnItsOwnLine &&<br>
> +           PenaltyBreakTemplateDeclaration ==<br>
> +               R.PenaltyBreakTemplateDeclaration &&<br>
>            PointerAlignment == R.PointerAlignment &&<br>
>            RawStringFormats == R.RawStringFormats &&<br>
>            SpaceAfterCStyleCast == R.SpaceAfterCStyleCast &&<br>
> <br>
> Modified: cfe/trunk/lib/Format/ContinuationIndenter.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/ContinuationIndenter.cpp?rev=332436&r1=332435&r2=332436&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/ContinuationIndenter.cpp?rev=332436&r1=332435&r2=332436&view=diff</a><br>
> ==============================================================================<br>
> --- cfe/trunk/lib/Format/ContinuationIndenter.cpp (original)<br>
> +++ cfe/trunk/lib/Format/ContinuationIndenter.cpp Wed May 16 01:25:03 2018<br>
> @@ -402,6 +402,12 @@ bool ContinuationIndenter::mustBreak(con<br>
>         Style.Language == FormatStyle::LK_JavaScript))<br>
>     return true;<br>
> <br>
> +  // If the template declaration spans multiple lines, force wrap before the<br>
> +  // function/class declaration<br>
> +  if (Previous.ClosesTemplateDeclaration &&<br>
> +      State.Stack.back().BreakBeforeParameter)<br>
> +    return true;<br>
> +<br>
>   if (State.Column <= NewLineColumn)<br>
>     return false;<br>
> <br>
> @@ -453,7 +459,7 @@ bool ContinuationIndenter::mustBreak(con<br>
>     // for cases where the entire line does not fit on a single line as a<br>
>     // different LineFormatter would be used otherwise.<br>
>     if (Previous.ClosesTemplateDeclaration)<br>
> -      return true;<br>
> +      return Style.AlwaysBreakTemplateDeclarations != FormatStyle::BTDS_No;<br>
>     if (Previous.is(TT_FunctionAnnotationRParen))<br>
>       return true;<br>
>     if (Previous.is(TT_LeadingJavaAnnotation) && Current.isNot(tok::l_paren) &&<br>
> <br>
> Modified: cfe/trunk/lib/Format/Format.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/Format.cpp?rev=332436&r1=332435&r2=332436&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/Format.cpp?rev=332436&r1=332435&r2=332436&view=diff</a><br>
> ==============================================================================<br>
> --- cfe/trunk/lib/Format/Format.cpp (original)<br>
> +++ cfe/trunk/lib/Format/Format.cpp Wed May 16 01:25:03 2018<br>
> @@ -169,6 +169,19 @@ struct ScalarEnumerationTraits<FormatSty<br>
> };<br>
> <br>
> template <><br>
> +struct ScalarEnumerationTraits<FormatStyle::BreakTemplateDeclarationsStyle> {<br>
> +  static void enumeration(IO &IO, FormatStyle::BreakTemplateDeclarationsStyle &Value) {<br>
> +    IO.enumCase(Value, "No", FormatStyle::BTDS_No);<br>
> +    IO.enumCase(Value, "MultiLine", FormatStyle::BTDS_MultiLine);<br>
> +    IO.enumCase(Value, "Yes", FormatStyle::BTDS_Yes);<br>
> +<br>
> +    // For backward compatibility.<br>
> +    IO.enumCase(Value, "false", FormatStyle::BTDS_MultiLine);<br>
> +    IO.enumCase(Value, "true", FormatStyle::BTDS_Yes);<br>
> +  }<br>
> +};<br>
> +<br>
> +template <><br>
> struct ScalarEnumerationTraits<FormatStyle::DefinitionReturnTypeBreakingStyle> {<br>
>   static void<br>
>   enumeration(IO &IO, FormatStyle::DefinitionReturnTypeBreakingStyle &Value) {<br>
> @@ -400,6 +413,8 @@ template <> struct MappingTraits<FormatS<br>
>     IO.mapOptional("PenaltyBreakFirstLessLess",<br>
>                    Style.PenaltyBreakFirstLessLess);<br>
>     IO.mapOptional("PenaltyBreakString", Style.PenaltyBreakString);<br>
> +    IO.mapOptional("PenaltyBreakTemplateDeclaration",<br>
> +                   Style.PenaltyBreakTemplateDeclaration);<br>
>     IO.mapOptional("PenaltyExcessCharacter", Style.PenaltyExcessCharacter);<br>
>     IO.mapOptional("PenaltyReturnTypeOnItsOwnLine",<br>
>                    Style.PenaltyReturnTypeOnItsOwnLine);<br>
> @@ -598,7 +613,7 @@ FormatStyle getLLVMStyle() {<br>
>   LLVMStyle.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;<br>
>   LLVMStyle.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_None;<br>
>   LLVMStyle.AlwaysBreakBeforeMultilineStrings = false;<br>
> -  LLVMStyle.AlwaysBreakTemplateDeclarations = false;<br>
> +  LLVMStyle.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_MultiLine;<br>
>   LLVMStyle.BinPackArguments = true;<br>
>   LLVMStyle.BinPackParameters = true;<br>
>   LLVMStyle.BreakBeforeBinaryOperators = FormatStyle::BOS_None;<br>
> @@ -670,6 +685,7 @@ FormatStyle getLLVMStyle() {<br>
>   LLVMStyle.PenaltyExcessCharacter = 1000000;<br>
>   LLVMStyle.PenaltyReturnTypeOnItsOwnLine = 60;<br>
>   LLVMStyle.PenaltyBreakBeforeFirstCallParameter = 19;<br>
> +  LLVMStyle.PenaltyBreakTemplateDeclaration = prec::Relational;<br>
> <br>
>   LLVMStyle.DisableFormat = false;<br>
>   LLVMStyle.SortIncludes = true;<br>
> @@ -694,7 +710,7 @@ FormatStyle getGoogleStyle(FormatStyle::<br>
>   GoogleStyle.AllowShortIfStatementsOnASingleLine = true;<br>
>   GoogleStyle.AllowShortLoopsOnASingleLine = true;<br>
>   GoogleStyle.AlwaysBreakBeforeMultilineStrings = true;<br>
> -  GoogleStyle.AlwaysBreakTemplateDeclarations = true;<br>
> +  GoogleStyle.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;<br>
>   GoogleStyle.ConstructorInitializerAllOnOneLineOrOnePerLine = true;<br>
>   GoogleStyle.DerivePointerAlignment = true;<br>
>   GoogleStyle.IncludeStyle.IncludeCategories = {<br>
> @@ -819,7 +835,7 @@ FormatStyle getMozillaStyle() {<br>
>   MozillaStyle.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;<br>
>   MozillaStyle.AlwaysBreakAfterDefinitionReturnType =<br>
>       FormatStyle::DRTBS_TopLevel;<br>
> -  MozillaStyle.AlwaysBreakTemplateDeclarations = true;<br>
> +  MozillaStyle.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;<br>
>   MozillaStyle.BinPackParameters = false;<br>
>   MozillaStyle.BinPackArguments = false;<br>
>   MozillaStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;<br>
> <br>
> Modified: cfe/trunk/lib/Format/TokenAnnotator.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/TokenAnnotator.cpp?rev=332436&r1=332435&r2=332436&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/TokenAnnotator.cpp?rev=332436&r1=332435&r2=332436&view=diff</a><br>
> ==============================================================================<br>
> --- cfe/trunk/lib/Format/TokenAnnotator.cpp (original)<br>
> +++ cfe/trunk/lib/Format/TokenAnnotator.cpp Wed May 16 01:25:03 2018<br>
> @@ -2338,6 +2338,8 @@ unsigned TokenAnnotator::splitPenalty(co<br>
>       return 2;<br>
>     return 1;<br>
>   }<br>
> +  if (Left.ClosesTemplateDeclaration)<br>
> +    return Style.PenaltyBreakTemplateDeclaration;<br>
>   if (Left.is(TT_ConditionalExpr))<br>
>     return prec::Conditional;<br>
>   prec::Level Level = Left.getPrecedence();<br>
> @@ -2869,7 +2871,7 @@ bool TokenAnnotator::mustBreakBefore(con<br>
>   if (Right.Previous->ClosesTemplateDeclaration &&<br>
>       Right.Previous->MatchingParen &&<br>
>       Right.Previous->MatchingParen->NestingLevel == 0 &&<br>
> -      Style.AlwaysBreakTemplateDeclarations)<br>
> +      Style.AlwaysBreakTemplateDeclarations == FormatStyle::BTDS_Yes)<br>
>     return true;<br>
>   if (Right.is(TT_CtorInitializerComma) &&<br>
>       Style.BreakConstructorInitializers == FormatStyle::BCIS_BeforeComma &&<br>
> <br>
> Modified: cfe/trunk/unittests/Format/FormatTest.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=332436&r1=332435&r2=332436&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=332436&r1=332435&r2=332436&view=diff</a><br>
> ==============================================================================<br>
> --- cfe/trunk/unittests/Format/FormatTest.cpp (original)<br>
> +++ cfe/trunk/unittests/Format/FormatTest.cpp Wed May 16 01:25:03 2018<br>
> @@ -5475,7 +5475,7 @@ TEST_F(FormatTest, WrapsTemplateDeclarat<br>
>                "    const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");<br>
> <br>
>   FormatStyle AlwaysBreak = getLLVMStyle();<br>
> -  AlwaysBreak.AlwaysBreakTemplateDeclarations = true;<br>
> +  AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;<br>
>   verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);<br>
>   verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);<br>
>   verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);<br>
> @@ -5493,6 +5493,32 @@ TEST_F(FormatTest, WrapsTemplateDeclarat<br>
>                "public:\n"<br>
>                "  E *f();\n"<br>
>                "};");<br>
> +<br>
> +  FormatStyle NeverBreak = getLLVMStyle();<br>
> +  NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No;<br>
> +  verifyFormat("template <typename T> class C {};", NeverBreak);<br>
> +  verifyFormat("template <typename T> void f();", NeverBreak);<br>
> +  verifyFormat("template <typename T> void f() {}", NeverBreak);<br>
> +  verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}",<br>
> +               NeverBreak);<br>
> +  verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"<br>
> +               "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"<br>
> +               "    ccccccccccccccccccccccccccccccccccccccccccccccc);",<br>
> +               NeverBreak);<br>
> +  verifyFormat("template <template <typename> class Fooooooo,\n"<br>
> +               "          template <typename> class Baaaaaaar>\n"<br>
> +               "struct C {};",<br>
> +               NeverBreak);<br>
> +  verifyFormat("template <typename T> // T can be A, B or C.\n"<br>
> +               "struct C {};",<br>
> +               NeverBreak);<br>
> +  verifyFormat("template <enum E> class A {\n"<br>
> +               "public:\n"<br>
> +               "  E *f();\n"<br>
> +               "};", NeverBreak);<br>
> +  NeverBreak.PenaltyBreakTemplateDeclaration = 100;<br>
> +  verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}",<br>
> +               NeverBreak);<br>
> }<br>
> <br>
> TEST_F(FormatTest, WrapsTemplateParameters) {<br>
> @@ -10440,7 +10466,6 @@ TEST_F(FormatTest, ParsesConfigurationBo<br>
>   CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);<br>
>   CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);<br>
>   CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);<br>
> -  CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);<br>
>   CHECK_PARSE_BOOL(BinPackArguments);<br>
>   CHECK_PARSE_BOOL(BinPackParameters);<br>
>   CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);<br>
> @@ -10506,6 +10531,8 @@ TEST_F(FormatTest, ParsesConfiguration)<br>
>               PenaltyBreakAssignment, 1234u);<br>
>   CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",<br>
>               PenaltyBreakBeforeFirstCallParameter, 1234u);<br>
> +  CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234",<br>
> +              PenaltyBreakTemplateDeclaration, 1234u);<br>
>   CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);<br>
>   CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",<br>
>               PenaltyReturnTypeOnItsOwnLine, 1234u);<br>
> @@ -10660,6 +10687,18 @@ TEST_F(FormatTest, ParsesConfiguration)<br>
>               AlwaysBreakAfterReturnType,<br>
>               FormatStyle::RTBS_TopLevelDefinitions);<br>
> <br>
> +  Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;<br>
> +  CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", AlwaysBreakTemplateDeclarations,<br>
> +              FormatStyle::BTDS_No);<br>
> +  CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", AlwaysBreakTemplateDeclarations,<br>
> +              FormatStyle::BTDS_MultiLine);<br>
> +  CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", AlwaysBreakTemplateDeclarations,<br>
> +              FormatStyle::BTDS_Yes);<br>
> +  CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", AlwaysBreakTemplateDeclarations,<br>
> +              FormatStyle::BTDS_MultiLine);<br>
> +  CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", AlwaysBreakTemplateDeclarations,<br>
> +              FormatStyle::BTDS_Yes);<br>
> +<br>
>   Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;<br>
>   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",<br>
>               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);<br>
> <br>
> <br>
> _______________________________________________<br>
> cfe-commits mailing list<br>
> <a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div></blockquote></div></blockquote></div>