[clang] [clang-format] Add `BILS_No` value to BreakInheritanceList option. (PR #196832)
via cfe-commits
cfe-commits at lists.llvm.org
Sun May 10 12:25:38 PDT 2026
https://github.com/stativ updated https://github.com/llvm/llvm-project/pull/196832
>From 387b526e08ac0fd0c1351f51e02823ccb5e110a9 Mon Sep 17 00:00:00 2001
From: Lukas Jirkovsky <l.jirkovsky at gmail.com>
Date: Sun, 10 May 2026 21:25:20 +0200
Subject: [PATCH] [clang-format] Add `BILS_No` value to BreakInheritanceList
option.
When `BILS_No` is used, the inheritance list is handled like any other line.
If the inheritance list needs to be broken down, the continuation indent width
is used to indent the new lines.
---
clang/docs/ClangFormatStyleOptions.rst | 9 +++++++++
clang/docs/ReleaseNotes.rst | 2 ++
clang/include/clang/Format/Format.h | 7 +++++++
clang/lib/Format/ContinuationIndenter.cpp | 16 +++++++++++-----
clang/lib/Format/Format.cpp | 1 +
clang/unittests/Format/ConfigParseTest.cpp | 2 ++
clang/unittests/Format/FormatTest.cpp | 15 +++++++++++++++
7 files changed, 47 insertions(+), 5 deletions(-)
diff --git a/clang/docs/ClangFormatStyleOptions.rst b/clang/docs/ClangFormatStyleOptions.rst
index 61f27bcf9dbbc..b96a5dc907bbb 100644
--- a/clang/docs/ClangFormatStyleOptions.rst
+++ b/clang/docs/ClangFormatStyleOptions.rst
@@ -3895,6 +3895,15 @@ the configuration (without a prefix: ``Auto``).
Possible values:
+ * ``BILS_No`` (in configuration: ``No``)
+ Do not break inheritance list. If the line is too long, the wrapped
+ lines are indented ContinuationIndentWidth spaces.
+
+ .. code-block:: c++
+
+ class Foo : Base1, Base2
+ {};
+
* ``BILS_BeforeColon`` (in configuration: ``BeforeColon``)
Break inheritance list before the colon and after the commas.
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index c17143e3c0398..d1b355d6d0aa4 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -744,6 +744,8 @@ clang-format
line if they exceed the specified count.
- Add ``AfterComma`` value to ``BreakConstructorInitializers`` to allow breaking
constructor initializers after commas, keeping the colon on the same line.
+- Add ``No`` value to ``BreakInheritanceList`` to disable breaking of the inheritance
+ list. If the list is too long, standard line breaking rules apply.
- Extend ``BreakBinaryOperations`` to accept a structured configuration with
per-operator break rules and minimum chain length gating via ``PerOperator``.
- Add ``AllowShortRecordOnASingleLine`` option and set it to ``EmptyAndAttached`` for LLVM style.
diff --git a/clang/include/clang/Format/Format.h b/clang/include/clang/Format/Format.h
index 0e883837ac0e9..88895a24d6391 100644
--- a/clang/include/clang/Format/Format.h
+++ b/clang/include/clang/Format/Format.h
@@ -2745,6 +2745,13 @@ struct FormatStyle {
/// Different ways to break inheritance list.
enum BreakInheritanceListStyle : int8_t {
+ /// Do not break inheritance list. If the line is too long, the wrapped
+ /// lines are indented ContinuationIndentWidth spaces.
+ /// \code
+ /// class Foo : Base1, Base2
+ /// {};
+ /// \endcode
+ BILS_No,
/// Break inheritance list before the colon and after the commas.
/// \code
/// class Foo
diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp
index 485fe382bda3a..b50e4fa445f83 100644
--- a/clang/lib/Format/ContinuationIndenter.cpp
+++ b/clang/lib/Format/ContinuationIndenter.cpp
@@ -1109,8 +1109,12 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
if (Style.BreakBeforeBinaryOperators == FormatStyle::BOS_None)
CurrentState.LastSpace = State.Column;
} else if (Previous.is(TT_InheritanceColon)) {
- CurrentState.Indent = State.Column;
- CurrentState.LastSpace = State.Column;
+ // Indent relative to the inheritance colon if the inheritance list
+ // is being broken into separate lines.
+ if(Style.BreakInheritanceList != FormatStyle::BILS_No) {
+ CurrentState.Indent = State.Column;
+ CurrentState.LastSpace = State.Column;
+ }
} else if (Current.is(TT_CSharpGenericTypeConstraintColon)) {
CurrentState.ColonPos = State.Column;
} else if (Previous.opensScope()) {
@@ -1237,6 +1241,8 @@ unsigned ContinuationIndenter::addTokenOnNewLine(LineState &State,
}
switch (Style.BreakInheritanceList) {
+ case FormatStyle::BILS_No:
+ break;
case FormatStyle::BILS_BeforeColon:
case FormatStyle::BILS_AfterComma:
if (Current.is(TT_InheritanceColon) || Previous.is(TT_InheritanceComma)) {
@@ -1859,9 +1865,9 @@ unsigned ContinuationIndenter::moveStateToNextToken(LineState &State,
else
CurrentState.BreakBeforeParameter = false;
}
- if (Current.is(TT_InheritanceColon)) {
- CurrentState.Indent =
- State.FirstIndent + Style.ConstructorInitializerIndentWidth;
+ if (Current.is(TT_InheritanceColon) && Style.BreakInheritanceList != FormatStyle::BILS_No) {
+ CurrentState.Indent =
+ State.FirstIndent + Style.ConstructorInitializerIndentWidth;
}
if (Current.isOneOf(TT_BinaryOperator, TT_ConditionalExpr) && Newline)
CurrentState.NestedBlockIndent = State.Column + Current.ColumnWidth + 1;
diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp
index 74b31810843fc..2919aaf3ae12e 100644
--- a/clang/lib/Format/Format.cpp
+++ b/clang/lib/Format/Format.cpp
@@ -364,6 +364,7 @@ template <>
struct ScalarEnumerationTraits<FormatStyle::BreakInheritanceListStyle> {
static void enumeration(IO &IO,
FormatStyle::BreakInheritanceListStyle &Value) {
+ IO.enumCase(Value, "No", FormatStyle::BILS_No);
IO.enumCase(Value, "BeforeColon", FormatStyle::BILS_BeforeColon);
IO.enumCase(Value, "BeforeComma", FormatStyle::BILS_BeforeComma);
IO.enumCase(Value, "AfterColon", FormatStyle::BILS_AfterColon);
diff --git a/clang/unittests/Format/ConfigParseTest.cpp b/clang/unittests/Format/ConfigParseTest.cpp
index ccb9c837d8362..a734b914ccf5f 100644
--- a/clang/unittests/Format/ConfigParseTest.cpp
+++ b/clang/unittests/Format/ConfigParseTest.cpp
@@ -524,6 +524,8 @@ TEST(ConfigParseTest, ParsesConfiguration) {
BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
+ CHECK_PARSE("BreakInheritanceList: No", BreakInheritanceList,
+ FormatStyle::BILS_No);
CHECK_PARSE("BreakInheritanceList: AfterComma", BreakInheritanceList,
FormatStyle::BILS_AfterComma);
CHECK_PARSE("BreakInheritanceList: BeforeComma", BreakInheritanceList,
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index 4245bd1c58153..ba7c0e3dbd2b8 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -3815,6 +3815,21 @@ TEST_F(FormatTest, FormatsClasses) {
}
TEST_F(FormatTest, BreakInheritanceStyle) {
+ FormatStyle StyleWithInheritanceBreakNo = getLLVMStyle();
+ StyleWithInheritanceBreakNo.BreakInheritanceList =
+ FormatStyle::BILS_No;
+ verifyFormat("class MyClass : public X {};",
+ StyleWithInheritanceBreakNo);
+ verifyFormat("class MyClass : public X, public Y {};",
+ StyleWithInheritanceBreakNo);
+ verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
+ " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};",
+ StyleWithInheritanceBreakNo);
+ verifyFormat("class MyOuterClass {\n"
+ " class MyClass : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
+ " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};",
+ StyleWithInheritanceBreakNo);
+
FormatStyle StyleWithInheritanceBreakBeforeComma = getLLVMStyle();
StyleWithInheritanceBreakBeforeComma.BreakInheritanceList =
FormatStyle::BILS_BeforeComma;
More information about the cfe-commits
mailing list