[llvm-branch-commits] [clang] release/22.x: [clang-format] Correctly annotate binary stars in braced init lists (#186732) (PR #188330)

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Tue Mar 24 12:53:49 PDT 2026


https://github.com/llvmbot created https://github.com/llvm/llvm-project/pull/188330

Backport 9d1d7a5645783b283f3289832a5d31feefd7a468

Requested by: @carlosgalvezp

>From 02a15a9718545c47b1919d30403759061da950d6 Mon Sep 17 00:00:00 2001
From: owenca <owenpiano at gmail.com>
Date: Mon, 16 Mar 2026 12:29:06 -0700
Subject: [PATCH] [clang-format] Correctly annotate binary stars in braced init
 lists (#186732)

Fixes #175241

(cherry picked from commit 9d1d7a5645783b283f3289832a5d31feefd7a468)
---
 clang/lib/Format/TokenAnnotator.cpp           | 9 ++++++---
 clang/unittests/Format/TokenAnnotatorTest.cpp | 6 ++++++
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index c0d31a1c9e2f4..fe1361bb25693 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -1251,13 +1251,18 @@ class AnnotatingParser {
           OpeningBrace.overwriteFixedType(TT_DictLiteral);
         }
       }
+      bool IsBracedListComma = false;
       if (CurrentToken->is(tok::comma)) {
         if (Style.isJavaScript())
           OpeningBrace.overwriteFixedType(TT_DictLiteral);
+        else
+          IsBracedListComma = OpeningBrace.is(BK_BracedInit);
         ++CommaCount;
       }
       if (!consumeToken())
         return false;
+      if (IsBracedListComma)
+        Contexts.back().IsExpression = true;
     }
     return true;
   }
@@ -3051,7 +3056,7 @@ class AnnotatingParser {
       return TT_BinaryOperator;
 
     if (NextToken->isOneOf(tok::arrow, tok::equal, tok::comma, tok::r_paren,
-                           TT_RequiresClause) ||
+                           tok::semi, TT_RequiresClause) ||
         (NextToken->is(tok::kw_noexcept) && !IsExpression) ||
         NextToken->canBePointerOrReferenceQualifier() ||
         (NextToken->is(tok::l_brace) && !NextToken->getNextNonComment())) {
@@ -3071,8 +3076,6 @@ class AnnotatingParser {
       return TT_PointerOrReference;
     if (NextToken->is(tok::kw_operator) && !IsExpression)
       return TT_PointerOrReference;
-    if (NextToken->isOneOf(tok::comma, tok::semi))
-      return TT_PointerOrReference;
 
     // After right braces, star tokens are likely to be pointers to struct,
     // union, or class.
diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp
index e449922710029..82b6c7451d622 100644
--- a/clang/unittests/Format/TokenAnnotatorTest.cpp
+++ b/clang/unittests/Format/TokenAnnotatorTest.cpp
@@ -416,6 +416,12 @@ TEST_F(TokenAnnotatorTest, UnderstandsUsesOfStarAndAmp) {
   EXPECT_TOKEN(Tokens[16], tok::star, TT_BinaryOperator);
   EXPECT_TOKEN(Tokens[22], tok::star, TT_BinaryOperator);
 
+  Tokens = annotate("Foo foo{bar, bar * bar};");
+  ASSERT_EQ(Tokens.size(), 11u) << Tokens;
+  EXPECT_TOKEN(Tokens[6], tok::star, TT_BinaryOperator);
+  // Not TT_StartOfName.
+  EXPECT_TOKEN(Tokens[7], tok::identifier, TT_Unknown);
+
   Tokens = annotate("NSError *__autoreleasing *foo;",
                     getLLVMStyle(FormatStyle::LK_ObjC));
   ASSERT_EQ(Tokens.size(), 7u) << Tokens;



More information about the llvm-branch-commits mailing list