diff options
author | Krasimir Georgiev <krasimir@google.com> | 2019-03-11 16:02:52 +0000 |
---|---|---|
committer | Krasimir Georgiev <krasimir@google.com> | 2019-03-11 16:02:52 +0000 |
commit | c416c52b07f5c14c4548c904bd1426c1208949bc (patch) | |
tree | 1a7c8feeabe583a74e47602326bb12ee5ac1ffc5 /clang/lib/Format | |
parent | 3aa36c9a47f0339e9880049bb40c8c6ca0d63d00 (diff) | |
download | bcm5719-llvm-c416c52b07f5c14c4548c904bd1426c1208949bc.tar.gz bcm5719-llvm-c416c52b07f5c14c4548c904bd1426c1208949bc.zip |
clang-format: distinguish ObjC call subexpressions after r355434
Summary:
The revision r355434 had the unfortunate side-effect that it started to
recognize certain ObjC expressions with a call subexpression followed by a
`a->b` subexpression as C++ lambda expressions.
This patch adds a bit of logic to handle these cases and documents them in
tests.
The commented-out test cases in the new test suite are ones that were
problematic before r355434.
Reviewers: MyDeveloperDay, gribozavr
Reviewed By: MyDeveloperDay, gribozavr
Subscribers: MyDeveloperDay, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D59210
llvm-svn: 355831
Diffstat (limited to 'clang/lib/Format')
-rw-r--r-- | clang/lib/Format/UnwrappedLineParser.cpp | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp index de7e646b17c..3abb6f40d74 100644 --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -1401,6 +1401,8 @@ bool UnwrappedLineParser::tryToParseLambda() { if (!tryToParseLambdaIntroducer()) return false; + bool SeenArrow = false; + while (FormatTok->isNot(tok::l_brace)) { if (FormatTok->isSimpleTypeSpecifier()) { nextToken(); @@ -1423,8 +1425,19 @@ bool UnwrappedLineParser::tryToParseLambda() { case tok::coloncolon: case tok::kw_mutable: case tok::kw_noexcept: + nextToken(); + break; // Specialization of a template with an integer parameter can contain // arithmetic, logical, comparison and ternary operators. + // + // FIXME: This also accepts sequences of operators that are not in the scope + // of a template argument list. + // + // In a C++ lambda a template type can only occur after an arrow. We use + // this as an heuristic to distinguish between Objective-C expressions + // followed by an `a->b` expression, such as: + // ([obj func:arg] + a->b) + // Otherwise the code below would parse as a lambda. case tok::plus: case tok::minus: case tok::exclaim: @@ -1444,13 +1457,17 @@ bool UnwrappedLineParser::tryToParseLambda() { case tok::colon: case tok::kw_true: case tok::kw_false: - nextToken(); - break; + if (SeenArrow) { + nextToken(); + break; + } + return true; case tok::arrow: // This might or might not actually be a lambda arrow (this could be an // ObjC method invocation followed by a dereferencing arrow). We might // reset this back to TT_Unknown in TokenAnnotator. FormatTok->Type = TT_LambdaArrow; + SeenArrow = true; nextToken(); break; default: |