diff options
author | Owen Pan <owenpiano@gmail.com> | 2025-04-22 21:07:31 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-22 21:07:31 -0700 |
commit | 4f71655b64a815143d2aedb22b8f423f7ce99e29 (patch) | |
tree | 123abc2be40f9092d0f30b254e5963bbd42f5c4f /clang/lib/Format/UnwrappedLineParser.cpp | |
parent | 122e5151ba84560de824d46f7b636502d41f2aa0 (diff) | |
download | llvm-4f71655b64a815143d2aedb22b8f423f7ce99e29.zip llvm-4f71655b64a815143d2aedb22b8f423f7ce99e29.tar.gz llvm-4f71655b64a815143d2aedb22b8f423f7ce99e29.tar.bz2 |
[clang-format] Fix a bug in parsing C-style cast of lambdas (#136099)
Fix #135959
Diffstat (limited to 'clang/lib/Format/UnwrappedLineParser.cpp')
-rw-r--r-- | clang/lib/Format/UnwrappedLineParser.cpp | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp index b9430d4..df58e5e 100644 --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -2368,13 +2368,25 @@ bool UnwrappedLineParser::tryToParseLambdaIntroducer() { const FormatToken *Previous = FormatTok->Previous; const FormatToken *LeftSquare = FormatTok; nextToken(); - if ((Previous && ((Previous->Tok.getIdentifierInfo() && - !Previous->isOneOf(tok::kw_return, tok::kw_co_await, - tok::kw_co_yield, tok::kw_co_return)) || - Previous->closesScope())) || - LeftSquare->isCppStructuredBinding(IsCpp)) { - return false; + if (Previous) { + if (Previous->Tok.getIdentifierInfo() && + !Previous->isOneOf(tok::kw_return, tok::kw_co_await, tok::kw_co_yield, + tok::kw_co_return)) { + 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->isOneOf(tok::greater, tok::r_paren)) + return false; + } } + if (LeftSquare->isCppStructuredBinding(IsCpp)) + return false; if (FormatTok->is(tok::l_square) || tok::isLiteral(FormatTok->Tok.getKind())) return false; if (FormatTok->is(tok::r_square)) { |