https://github.com/owenca created https://github.com/llvm/llvm-project/pull/187966
Fixes #187958 >From 1f1dd6ace6c0dd97a90d0a139319e8a2254658ec Mon Sep 17 00:00:00 2001 From: Owen Pan <[email protected]> Date: Sun, 22 Mar 2026 21:21:35 -0700 Subject: [PATCH] [clang-format] Fix regression in annotating angles in static_assert Fixes #187958 --- 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 ee14469cfc968..d2cdc28a7da7b 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 756e97708cb8c..efb361387bb1e 100644 --- a/clang/unittests/Format/TokenAnnotatorTest.cpp +++ b/clang/unittests/Format/TokenAnnotatorTest.cpp @@ -805,7 +805,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; @@ -827,6 +827,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) { _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
