https://github.com/zeule updated https://github.com/llvm/llvm-project/pull/189218
>From a633769ca64e54ff22a2f8b6c87879b767d8c4b6 Mon Sep 17 00:00:00 2001 From: Eugene Shalygin <[email protected]> Date: Fri, 27 Mar 2026 17:02:04 +0100 Subject: [PATCH 1/2] [clang-format] fix aligning inheritance lists with UT_AlignWithSpaces --- clang/lib/Format/ContinuationIndenter.cpp | 16 +++++++ clang/unittests/Format/FormatTest.cpp | 56 +++++++++++++++++++++-- 2 files changed, 68 insertions(+), 4 deletions(-) diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp index a388b74920e0b..98e131114e8f4 100644 --- a/clang/lib/Format/ContinuationIndenter.cpp +++ b/clang/lib/Format/ContinuationIndenter.cpp @@ -1238,6 +1238,22 @@ unsigned ContinuationIndenter::addTokenOnNewLine(LineState &State, } } + switch (Style.BreakInheritanceList) { + case FormatStyle::BILS_BeforeColon: + case FormatStyle::BILS_AfterComma: + CurrentState.IsAligned |= + Current.is(TT_InheritanceColon) || Previous.is(TT_InheritanceComma); + break; + case FormatStyle::BILS_BeforeComma: + CurrentState.IsAligned |= + Current.isOneOf(TT_InheritanceColon, TT_InheritanceComma); + break; + case FormatStyle::BILS_AfterColon: + CurrentState.IsAligned |= + Previous.isOneOf(TT_InheritanceColon, TT_InheritanceComma); + break; + } + if ((PreviousNonComment && PreviousNonComment->isOneOf(tok::comma, tok::semi) && !CurrentState.AvoidBinPacking) || diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index e0b2644249e76..79537012bebdf 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -8411,30 +8411,78 @@ TEST_F(FormatTest, BreakConstructorInitializersAfterColon) { // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as // well - Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; + FormatStyle Tabbed = getLLVMStyle(); + Tabbed.IndentWidth = 4; + Tabbed.TabWidth = 4; + Tabbed.UseTab = FormatStyle::UT_AlignWithSpaces; + + Style.BreakInheritanceList = + Tabbed.BreakInheritanceList = FormatStyle::BILS_BeforeColon; verifyFormat( "class SomeClass\n" " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", Style); - Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma; + verifyFormat( + "class BeforeColonTabbed\n" + " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" + " protected bbbbbbbbbbbbbbbbbb,\n" + " private cccccccccccccccccccccc,\n" + " dddddddddd {};", + Tabbed); + Style.BreakInheritanceList = + Tabbed.BreakInheritanceList = FormatStyle::BILS_BeforeComma; verifyFormat( "class SomeClass\n" " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" " , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", Style); - Style.BreakInheritanceList = FormatStyle::BILS_AfterColon; + verifyFormat( + "class BeforeCommaTabbed\n" + " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + " , protected bbbbbbbbb\n" + " , private cccccccccc\n" + " , dddddddddd {};", + Tabbed); + Style.BreakInheritanceList = + Tabbed.BreakInheritanceList = FormatStyle::BILS_AfterColon; verifyFormat( "class SomeClass :\n" " public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", Style); - Style.BreakInheritanceList = FormatStyle::BILS_AfterComma; + verifyFormat( + "class AfterColonTabbed :\n" + " public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" + " protected bbbbbbbbb,\n" + " private cccccccccc,\n" + " dddddddddd {};", + Tabbed); + Style.BreakInheritanceList = + Tabbed.BreakInheritanceList = FormatStyle::BILS_AfterComma; verifyFormat( "class SomeClass\n" " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", Style); + verifyFormat( + "class AfterCommaTabbed : public aaaaaaaaa,\n" + " protected bbbbbbbbb,\n" + " private cccccccccc,\n" + " ddddddddd {};", + Tabbed); + verifyFormat( + "class SomeClass\n" + " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" + " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", + Tabbed); + Tabbed.ColumnLimit = 42; + verifyFormat( + "struct S {\n" + "\tclass Foo : public aaaaaaaaa,\n" + "\t private bbbbbbbbb {};\n" + "};", + Tabbed); } TEST_F(FormatTest, BreakConstructorInitializersAfterComma) { >From fade97c04af2036f57c09e947e7f5b4d8014eec2 Mon Sep 17 00:00:00 2001 From: Eugene Shalygin <[email protected]> Date: Sun, 29 Mar 2026 22:12:46 +0200 Subject: [PATCH 2/2] [clang-format] fix aligning binary operator operands Mark operators of binary operators as aligned. --- clang/lib/Format/ContinuationIndenter.cpp | 4 +++- clang/unittests/Format/FormatTest.cpp | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp index 98e131114e8f4..d4406b4e01437 100644 --- a/clang/lib/Format/ContinuationIndenter.cpp +++ b/clang/lib/Format/ContinuationIndenter.cpp @@ -1270,8 +1270,10 @@ unsigned ContinuationIndenter::addTokenOnNewLine(LineState &State, (PreviousNonComment && PreviousNonComment->is(tok::question))) { CurrentState.BreakBeforeParameter = true; } - if (Current.is(TT_BinaryOperator) && Current.CanBreakBefore) + if (Current.is(TT_BinaryOperator) && Current.CanBreakBefore) { CurrentState.BreakBeforeParameter = false; + CurrentState.IsAligned = true; + } if (!DryRun) { unsigned MaxEmptyLinesToKeep = Style.MaxEmptyLinesToKeep + 1; diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index 79537012bebdf..c2cd048ebb5f9 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -17285,6 +17285,27 @@ TEST_F(FormatTest, ConfigurableUseOfTab) { Tab); } +TEST_F(FormatTest, AlignWithSpaces) { + FormatStyle Tabbed = getLLVMStyleWithColumns(42); + Tabbed.UseTab = FormatStyle::UT_AlignWithSpaces; + + Tabbed.IndentWidth = 4; + Tabbed.TabWidth = 4; + verifyFormat("aStreamObject << aaaaaaaaaaaaa\n" + " << bbbbbbbbb;\n", + Tabbed); + verifyFormat("result = aaaaaaaaaaaaaaaaaaaaaaaa +\n" + " bbbbbbbbbbbbbbbbbbbb;", + Tabbed); + verifyFormat("class C {\n" + "\tvoid foo() {\n" + "\t\taStreamObject << aaaaaaaaaaaaa\n" + "\t\t << bbbbbbbbb;\n" + "\t}\n" + "};", + Tabbed); +} + TEST_F(FormatTest, ZeroTabWidth) { FormatStyle Tab = getLLVMStyleWithColumns(42); Tab.IndentWidth = 8; _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
