[clang] [clang-format] fix aligning inheritance lists and binary operator operands with UT_AlignWithSpaces (PR #189218)
Eugene Shalygin via cfe-commits
cfe-commits at lists.llvm.org
Tue Mar 31 23:19:07 PDT 2026
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 <e.shalygin at abberior-instruments.com>
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 <eugene.shalygin at gmail.com>
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;
More information about the cfe-commits
mailing list