aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Format/UnwrappedLineParser.cpp
diff options
context:
space:
mode:
authorOwen Pan <owenpiano@gmail.com>2025-04-22 21:07:31 -0700
committerGitHub <noreply@github.com>2025-04-22 21:07:31 -0700
commit4f71655b64a815143d2aedb22b8f423f7ce99e29 (patch)
tree123abc2be40f9092d0f30b254e5963bbd42f5c4f /clang/lib/Format/UnwrappedLineParser.cpp
parent122e5151ba84560de824d46f7b636502d41f2aa0 (diff)
downloadllvm-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.cpp24
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)) {