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 <[email protected]>
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;

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to