Author: Andy Lim
Date: 2026-10-23T20:53:42+02:00
New Revision: e958fafc2ee3d4e0738d3449e6e43ca353b87cf0

URL: 
https://github.com/llvm/llvm-project/commit/e958fafc2ee3d4e0738d3449e6e43ca353b87cf0
DIFF: 
https://github.com/llvm/llvm-project/commit/e958fafc2ee3d4e0738d3449e6e43ca353b87cf0.diff

LOG: [clang-format] Handle TT_EnumEqual in expression precedence and RHS 
indentation (#232918)

Follow-up to #223011 and #223435; Fixes #231986

When #194154 changed enum assignment `=` from `TT_BinaryOperator` to
`TT_EnumEqual`, `ExpressionParser::getCurrentPrecedence()` and
`ContinuationIndenter::addTokenOnCurrentLine()` were not updated to
check `TT_EnumEqual`:

1. Because `ExpressionParser::getCurrentPrecedence()` ignored
`TT_EnumEqual`, an enum initializer with a binary expression (such as
`FLAG = 1 << 21`) was not split at `=`. Instead, `FakeLParens` for the
RHS operator was attached to the enum identifier itself, causing
`moveStatePastFakeLParens()` and `getNewLineColumn()` to apply
`ContinuationIndentWidth` twice (+8 spaces instead of +4) when breaking
after `=`.
2. When `<EnumIdentifier> = <FirstOperand>` fit within the column limit,
both the double indentation penalty after `=` and the missing
`TT_EnumEqual` check in `ContinuationIndenter::addTokenOnCurrentLine()`
caused `clang-format` to break before the binary operator (`FLAG = 1\n
<< 21`) instead of after `=`.

Include `TT_EnumEqual` in `ExpressionParser::getCurrentPrecedence()` and
`ContinuationIndenter::addTokenOnCurrentLine()` so enum initializers
with binary expressions break after `=` and indent by a single
`ContinuationIndentWidth`.

More detailed reproducer is at #231986

Added: 
    

Modified: 
    clang/lib/Format/ContinuationIndenter.cpp
    clang/lib/Format/TokenAnnotator.cpp
    clang/unittests/Format/FormatTest.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Format/ContinuationIndenter.cpp 
b/clang/lib/Format/ContinuationIndenter.cpp
index 98232bb16cc04..384bad6492315 100644
--- a/clang/lib/Format/ContinuationIndenter.cpp
+++ b/clang/lib/Format/ContinuationIndenter.cpp
@@ -1115,7 +1115,7 @@ void 
ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
     CurrentState.LastSpace = State.Column;
   } else if (Previous.isOneOf(TT_ConditionalExpr, TT_CtorInitializerColon)) {
     CurrentState.LastSpace = State.Column;
-  } else if (Previous.is(TT_BinaryOperator) &&
+  } else if (Previous.isOneOf(TT_BinaryOperator, TT_EnumEqual) &&
              ((Previous.getPrecedence() != prec::Assignment &&
                (Previous.isNot(tok::lessless) || Previous.OperatorIndex != 0 ||
                 Previous.NextOperator)) ||

diff  --git a/clang/lib/Format/TokenAnnotator.cpp 
b/clang/lib/Format/TokenAnnotator.cpp
index c6a87980264a4..9bbce9552bb9d 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -3424,7 +3424,7 @@ class ExpressionParser {
           Current->isOneOf(Keywords.kw_in, Keywords.kw_as)) {
         return prec::Relational;
       }
-      if (Current->isOneOf(TT_BinaryOperator, tok::comma))
+      if (Current->isOneOf(TT_BinaryOperator, TT_EnumEqual, tok::comma))
         return Current->getPrecedence();
       if (Current->isOneOf(tok::period, tok::arrow) &&
           Current->isNot(TT_TrailingReturnArrow)) {

diff  --git a/clang/unittests/Format/FormatTest.cpp 
b/clang/unittests/Format/FormatTest.cpp
index 156a2eff27a71..f38287757ffba 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -7808,7 +7808,21 @@ TEST_F(FormatTest, 
EnumAssignmentContinuationIndentation) {
   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
   verifyFormat("enum Flag {\n"
                "  VeryLongFlagNameThatForcesBreak =\n"
-               "          1 << 2 << 3,\n"
+               "      1 << 2 << 3,\n"
+               "};",
+               Style);
+
+  Style.ColumnLimit = 42;
+  verifyFormat("enum Flag {\n"
+               "  VeryLongFlagNameThatForcesBreak =\n"
+               "      1 << 2 << 3,\n"
+               "};",
+               Style);
+
+  Style = getLLVMStyleWithColumns(42);
+  verifyFormat("enum Flag {\n"
+               "  VeryLongFlagNameThatForcesBreak =\n"
+               "      1 << 2 << 3,\n"
                "};",
                Style);
 }


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

Reply via email to