[llvm-branch-commits] [clang] release/22.x: [clang-format] Fix regression in annotating angles in static_assert (#187966) (PR #187991)

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Mon Mar 23 01:17:45 PDT 2026


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

Backport 4b084f23bac39343d93ec91369efb2027d9fa153

Requested by: @owenca

>From f05e21077d86aa81832a72f541ff3f2212d5de8b Mon Sep 17 00:00:00 2001
From: owenca <owenpiano at gmail.com>
Date: Mon, 23 Mar 2026 01:06:30 -0700
Subject: [PATCH] [clang-format] Fix regression in annotating angles in
 static_assert (#187966)

Fixes #187936

(cherry picked from commit 4b084f23bac39343d93ec91369efb2027d9fa153)
---
 clang/lib/Format/TokenAnnotator.cpp           |  7 ++++++-
 clang/unittests/Format/TokenAnnotatorTest.cpp | 15 ++++++++++++++-
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index 17f5babf90f30..c0d31a1c9e2f4 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -186,7 +186,8 @@ class AnnotatingParser {
       next();
 
     for (bool SeenTernaryOperator = false, MaybeAngles = true; CurrentToken;) {
-      const bool InExpr = Contexts[Contexts.size() - 2].IsExpression;
+      const auto &ParentContext = Contexts[Contexts.size() - 2];
+      const bool InExpr = ParentContext.IsExpression;
       if (CurrentToken->is(tok::greater)) {
         const auto *Next = CurrentToken->Next;
         if (CurrentToken->isNot(TT_TemplateCloser)) {
@@ -208,6 +209,10 @@ class AnnotatingParser {
           }
           if (!MaybeAngles)
             return false;
+          if (ParentContext.InStaticAssertFirstArgument && Next &&
+              Next->isOneOf(tok::minus, tok::identifier)) {
+            return false;
+          }
         }
         Left->MatchingParen = CurrentToken;
         CurrentToken->MatchingParen = Left;
diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp
index 8594f60453982..e449922710029 100644
--- a/clang/unittests/Format/TokenAnnotatorTest.cpp
+++ b/clang/unittests/Format/TokenAnnotatorTest.cpp
@@ -799,7 +799,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsTemplateTemplateParameters) {
   EXPECT_TOKEN(Tokens[23], tok::identifier, TT_ClassHeadName);
 }
 
-TEST_F(TokenAnnotatorTest, UnderstandsCommonCppTemplates) {
+TEST_F(TokenAnnotatorTest, UnderstandsAnglesInStaticAssert) {
   auto Tokens =
       annotate("static_assert(std::conditional_t<A || B, C, D>::value);");
   ASSERT_EQ(Tokens.size(), 19u) << Tokens;
@@ -821,6 +821,19 @@ TEST_F(TokenAnnotatorTest, UnderstandsCommonCppTemplates) {
   ASSERT_EQ(Tokens.size(), 13u) << Tokens;
   EXPECT_TOKEN(Tokens[3], tok::less, TT_TemplateOpener);
   EXPECT_TOKEN(Tokens[7], tok::greater, TT_TemplateCloser);
+
+  Tokens = annotate("static_assert(foo < -bar && foo > -baz);");
+  ASSERT_EQ(Tokens.size(), 14u) << Tokens;
+  EXPECT_TOKEN(Tokens[3], tok::less, TT_BinaryOperator);
+  EXPECT_TOKEN(Tokens[8], tok::greater, TT_BinaryOperator);
+  EXPECT_TOKEN(Tokens[9], tok::minus, TT_UnaryOperator);
+
+  Tokens = annotate("static_assert(foo < bar && foo > baz);");
+  ASSERT_EQ(Tokens.size(), 12u) << Tokens;
+  EXPECT_TOKEN(Tokens[3], tok::less, TT_BinaryOperator);
+  EXPECT_TOKEN(Tokens[7], tok::greater, TT_BinaryOperator);
+  // Not TT_StartOfName.
+  EXPECT_TOKEN(Tokens[8], tok::identifier, TT_Unknown);
 }
 
 TEST_F(TokenAnnotatorTest, UnderstandsWhitespaceSensitiveMacros) {



More information about the llvm-branch-commits mailing list