Skip to content

Commit 0dc7b74

Browse files
committed
release/21.x: [clang-format] Fix a regression in annotating star before lambda (llvm#170969)
Backport 4930e94
1 parent f68f64e commit 0dc7b74

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
@@ -2385,17 +2385,17 @@ bool UnwrappedLineParser::tryToParseLambdaIntroducer() {
23852385
const FormatToken *LeftSquare = FormatTok;
23862386
nextToken();
23872387
if (Previous) {
2388+
const auto *PrevPrev = Previous->getPreviousNonComment();
2389+
if (Previous->is(tok::star) && PrevPrev && PrevPrev->isTypeName(LangOpts))
2390+
return false;
23882391
if (Previous->closesScope()) {
23892392
// Not a potential C-style cast.
23902393
if (Previous->isNot(tok::r_paren))
23912394
return false;
2392-
const auto *BeforeRParen = Previous->getPreviousNonComment();
23932395
// Lambdas can be cast to function types only, e.g. `std::function<int()>`
23942396
// and `int (*)()`.
2395-
if (!BeforeRParen || !BeforeRParen->isOneOf(tok::greater, tok::r_paren))
2397+
if (!PrevPrev || !PrevPrev->isOneOf(tok::greater, tok::r_paren))
23962398
return false;
2397-
} else if (Previous->is(tok::star)) {
2398-
Previous = Previous->getPreviousNonComment();
23992399
}
24002400
if (Previous && Previous->Tok.getIdentifierInfo() &&
24012401
!Previous->isOneOf(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
@@ -2248,6 +2248,12 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
22482248
EXPECT_TOKEN(Tokens[3], tok::l_square, TT_LambdaLSquare);
22492249
EXPECT_TOKEN(Tokens[5], tok::l_paren, TT_LambdaDefinitionLParen);
22502250
EXPECT_TOKEN(Tokens[10], tok::l_square, TT_ArraySubscriptLSquare);
2251+
2252+
Tokens = annotate("foo = bar * [] { return 2; }();");
2253+
ASSERT_EQ(Tokens.size(), 15u) << Tokens;
2254+
EXPECT_TOKEN(Tokens[3], tok::star, TT_BinaryOperator);
2255+
EXPECT_TOKEN(Tokens[4], tok::l_square, TT_LambdaLSquare);
2256+
EXPECT_TOKEN(Tokens[6], tok::l_brace, TT_LambdaLBrace);
22512257
}
22522258

22532259
TEST_F(TokenAnnotatorTest, UnderstandsFunctionAnnotations) {

0 commit comments

Comments
 (0)