summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorErik Pilkington <erik.pilkington@gmail.com>2018-08-21 16:47:04 +0000
committerErik Pilkington <erik.pilkington@gmail.com>2018-08-21 16:47:04 +0000
commitc6781383495b622f1ad6d3d5346663b265a803be (patch)
tree5592e02a87e4fcf779fd9e932aeb765042bf13de /clang/lib
parentdbe4e9e3ff4395366da0c998650bf824b11a3a47 (diff)
downloadbcm5719-llvm-c6781383495b622f1ad6d3d5346663b265a803be.tar.gz
bcm5719-llvm-c6781383495b622f1ad6d3d5346663b265a803be.zip
[Parser] Support alternative operator token keyword args in Objective-C++
rdar://30741878 Differential revision: https://reviews.llvm.org/D50527 llvm-svn: 340301
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Parse/ParseExpr.cpp13
1 files changed, 13 insertions, 0 deletions
diff --git a/clang/lib/Parse/ParseExpr.cpp b/clang/lib/Parse/ParseExpr.cpp
index 79f826653eb..d1d8507af8c 100644
--- a/clang/lib/Parse/ParseExpr.cpp
+++ b/clang/lib/Parse/ParseExpr.cpp
@@ -315,6 +315,19 @@ Parser::ParseRHSOfBinaryExpression(ExprResult LHS, prec::Level MinPrec) {
return LHS;
}
+ // In Objective-C++, alternative operator tokens can be used as keyword args
+ // in message expressions. Unconsume the token so that it can reinterpreted
+ // as an identifier in ParseObjCMessageExpressionBody. i.e., we support:
+ // [foo meth:0 and:0];
+ // [foo not_eq];
+ if (getLangOpts().ObjC1 && getLangOpts().CPlusPlus &&
+ Tok.isOneOf(tok::colon, tok::r_square) &&
+ OpToken.getIdentifierInfo() != nullptr) {
+ PP.EnterToken(Tok);
+ Tok = OpToken;
+ return LHS;
+ }
+
// Special case handling for the ternary operator.
ExprResult TernaryMiddle(true);
if (NextTokPrec == prec::Conditional) {
OpenPOWER on IntegriCloud