summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorKrasimir Georgiev <krasimir@google.com>2019-03-11 16:02:52 +0000
committerKrasimir Georgiev <krasimir@google.com>2019-03-11 16:02:52 +0000
commitc416c52b07f5c14c4548c904bd1426c1208949bc (patch)
tree1a7c8feeabe583a74e47602326bb12ee5ac1ffc5 /clang/lib
parent3aa36c9a47f0339e9880049bb40c8c6ca0d63d00 (diff)
downloadbcm5719-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')
-rw-r--r--clang/lib/Format/UnwrappedLineParser.cpp21
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:
OpenPOWER on IntegriCloud