[PATCH] D50527: [Parser] Support alternative operator token keyword args in Objective-C++
Erik Pilkington via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 9 12:35:26 PDT 2018
erik.pilkington created this revision.
erik.pilkington added reviewers: rjmccall, arphaman.
Herald added a subscriber: dexonsmith.
This fixes rdar://30741878
Thanks!
Erik
Repository:
rC Clang
https://reviews.llvm.org/D50527
Files:
clang/lib/Parse/ParseExpr.cpp
clang/test/Parser/message-expr-alt-op.mm
Index: clang/test/Parser/message-expr-alt-op.mm
===================================================================
--- /dev/null
+++ clang/test/Parser/message-expr-alt-op.mm
@@ -0,0 +1,41 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+ at interface WeirdInterface
+-(void)allOfThem:(int)a
+ and:(int)b
+ and_eq:(int)c
+ bitand:(int)d
+ bitor:(int)e
+ compl:(int)f
+ not:(int)g
+ not_eq:(int)h
+ or:(int)i
+ or_eq:(int)j
+ xor:(int)k
+ xor_eq:(int)l;
+
+-(void)justAnd:(int)x and:(int)y;
+-(void)and;
+-(void)and:(int)x;
+ at end
+
+void call_it(WeirdInterface *x) {
+ [x allOfThem:0
+ and:0
+ and_eq:0
+ bitand:0
+ bitor:0
+ compl:0
+ not:0
+ not_eq:0
+ or:0
+ or_eq:0
+ xor:0
+ xor_eq:0];
+
+ [x and];
+ [x and:0];
+ [x &&:0]; // expected-error{{expected expression}};
+ [x justAnd:0 and:1];
+ [x and: 0 ? : 1];
+}
Index: clang/lib/Parse/ParseExpr.cpp
===================================================================
--- clang/lib/Parse/ParseExpr.cpp
+++ clang/lib/Parse/ParseExpr.cpp
@@ -263,6 +263,24 @@
return isFoldOperator(getBinOpPrecedence(Kind, GreaterThanIsOperator, true));
}
+static bool isBinaryCXXAlternativeOperatorToken(Preprocessor &PP,
+ const Token &Tok) {
+ switch (Tok.getKind()) {
+ case tok::ampamp:
+ case tok::ampequal:
+ case tok::amp:
+ case tok::pipe:
+ case tok::exclaimequal:
+ case tok::pipepipe:
+ case tok::pipeequal:
+ case tok::caret:
+ case tok::caretequal:
+ return isLetter(PP.getSpelling(Tok).front());
+ default:
+ return false;
+ }
+}
+
/// Parse a binary expression that starts with \p LHS and has a
/// precedence of at least \p MinPrec.
ExprResult
@@ -315,6 +333,19 @@
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) &&
+ isBinaryCXXAlternativeOperatorToken(PP, OpToken)) {
+ PP.EnterToken(Tok);
+ Tok = OpToken;
+ return LHS;
+ }
+
// Special case handling for the ternary operator.
ExprResult TernaryMiddle(true);
if (NextTokPrec == prec::Conditional) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D50527.159964.patch
Type: text/x-patch
Size: 2612 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180809/ffa05bad/attachment.bin>
More information about the cfe-commits
mailing list