[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 13:48:34 PDT 2018


erik.pilkington updated this revision to Diff 159995.
erik.pilkington added a comment.

Remove `isBinaryCXXAlternativeOperatorToken`, this check can be done using `OpToken.getAsIdentifierInfo()`. Thanks!

FWIW, I can't imagine this being anything but an oversight, we go out of our way to support these tokens in `ParseObjCSelectorPiece`, and we already happen to support unary alternative operators, such as `[foo not]`.


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
@@ -315,6 +315,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) &&
+        OpToken.getIdentifierInfo() != nullptr) {
+      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.159995.patch
Type: text/x-patch
Size: 1922 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180809/60771f86/attachment.bin>


More information about the cfe-commits mailing list