Skip to content

Commit 4930e94

Browse files
authored
[clang-format] Fix a regression in annotating star before lambda (#170969)
Fixes #170573
1 parent 8dee997 commit 4930e94

File tree

2 files changed

+10
-4
lines changed

2 files changed

+10
-4
lines changed

clang/lib/Format/UnwrappedLineParser.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2395,17 +2395,17 @@ bool UnwrappedLineParser::tryToParseLambdaIntroducer() {
23952395
const FormatToken *LeftSquare = FormatTok;
23962396
nextToken();
23972397
if (Previous) {
2398+
const auto *PrevPrev = Previous->getPreviousNonComment();
2399+
if (Previous->is(tok::star) && PrevPrev && PrevPrev->isTypeName(LangOpts))
2400+
return false;
23982401
if (Previous->closesScope()) {
23992402
// Not a potential C-style cast.
24002403
if (Previous->isNot(tok::r_paren))
24012404
return false;
2402-
const auto *BeforeRParen = Previous->getPreviousNonComment();
24032405
// Lambdas can be cast to function types only, e.g. `std::function<int()>`
24042406
// and `int (*)()`.
2405-
if (!BeforeRParen || BeforeRParen->isNoneOf(tok::greater, tok::r_paren))
2407+
if (!PrevPrev || PrevPrev->isNoneOf(tok::greater, tok::r_paren))
24062408
return false;
2407-
} else if (Previous->is(tok::star)) {
2408-
Previous = Previous->getPreviousNonComment();
24092409
}
24102410
if (Previous && Previous->Tok.getIdentifierInfo() &&
24112411
Previous->isNoneOf(tok::kw_return, tok::kw_co_await, tok::kw_co_yield,

clang/unittests/Format/TokenAnnotatorTest.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2322,6 +2322,12 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
23222322
EXPECT_TOKEN(Tokens[3], tok::l_square, TT_LambdaLSquare);
23232323
EXPECT_TOKEN(Tokens[5], tok::l_paren, TT_LambdaDefinitionLParen);
23242324
EXPECT_TOKEN(Tokens[10], tok::l_square, TT_ArraySubscriptLSquare);
2325+
2326+
Tokens = annotate("foo = bar * [] { return 2; }();");
2327+
ASSERT_EQ(Tokens.size(), 15u) << Tokens;
2328+
EXPECT_TOKEN(Tokens[3], tok::star, TT_BinaryOperator);
2329+
EXPECT_TOKEN(Tokens[4], tok::l_square, TT_LambdaLSquare);
2330+
EXPECT_TOKEN(Tokens[6], tok::l_brace, TT_LambdaLBrace);
23252331
}
23262332

23272333
TEST_F(TokenAnnotatorTest, UnderstandsFunctionAnnotations) {

0 commit comments

Comments
 (0)