[clang] [clang-format] Fix a regression in annotating star before lambda (PR #170969)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Dec 5 22:50:08 PST 2025
https://github.com/owenca created https://github.com/llvm/llvm-project/pull/170969
Fixes #170573
>From d0e38b2c3201dab9c66c8df2527d5872347a9ed7 Mon Sep 17 00:00:00 2001
From: Owen Pan <owenpiano at gmail.com>
Date: Fri, 5 Dec 2025 22:46:50 -0800
Subject: [PATCH] [clang-format] Fix a regression in annotating star before
lambda
Fixes #170573
---
clang/lib/Format/UnwrappedLineParser.cpp | 8 ++++----
clang/unittests/Format/TokenAnnotatorTest.cpp | 6 ++++++
2 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp
index 19c83d3910902..c1a9161b10720 100644
--- a/clang/lib/Format/UnwrappedLineParser.cpp
+++ b/clang/lib/Format/UnwrappedLineParser.cpp
@@ -2395,17 +2395,17 @@ bool UnwrappedLineParser::tryToParseLambdaIntroducer() {
const FormatToken *LeftSquare = FormatTok;
nextToken();
if (Previous) {
+ const auto *PrevPrev = Previous->getPreviousNonComment();
+ if (Previous->is(tok::star) && PrevPrev && PrevPrev->isTypeName(LangOpts))
+ return false;
if (Previous->closesScope()) {
// Not a potential C-style cast.
if (Previous->isNot(tok::r_paren))
return false;
- const auto *BeforeRParen = Previous->getPreviousNonComment();
// Lambdas can be cast to function types only, e.g. `std::function<int()>`
// and `int (*)()`.
- if (!BeforeRParen || BeforeRParen->isNoneOf(tok::greater, tok::r_paren))
+ if (!PrevPrev || PrevPrev->isNoneOf(tok::greater, tok::r_paren))
return false;
- } else if (Previous->is(tok::star)) {
- Previous = Previous->getPreviousNonComment();
}
if (Previous && Previous->Tok.getIdentifierInfo() &&
Previous->isNoneOf(tok::kw_return, tok::kw_co_await, tok::kw_co_yield,
diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp
index 008adff1cee2d..1bf243a30bb74 100644
--- a/clang/unittests/Format/TokenAnnotatorTest.cpp
+++ b/clang/unittests/Format/TokenAnnotatorTest.cpp
@@ -2322,6 +2322,12 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
EXPECT_TOKEN(Tokens[3], tok::l_square, TT_LambdaLSquare);
EXPECT_TOKEN(Tokens[5], tok::l_paren, TT_LambdaDefinitionLParen);
EXPECT_TOKEN(Tokens[10], tok::l_square, TT_ArraySubscriptLSquare);
+
+ Tokens = annotate("foo = bar * [] { return 2; }();");
+ ASSERT_EQ(Tokens.size(), 15u) << Tokens;
+ EXPECT_TOKEN(Tokens[3], tok::star, TT_BinaryOperator);
+ EXPECT_TOKEN(Tokens[4], tok::l_square, TT_LambdaLSquare);
+ EXPECT_TOKEN(Tokens[6], tok::l_brace, TT_LambdaLBrace);
}
TEST_F(TokenAnnotatorTest, UnderstandsFunctionAnnotations) {
More information about the cfe-commits
mailing list