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