Author: epilk Date: Tue Aug 21 09:47:04 2018 New Revision: 340301 URL: http://llvm.org/viewvc/llvm-project?rev=340301&view=rev Log: [Parser] Support alternative operator token keyword args in Objective-C++
rdar://30741878 Differential revision: https://reviews.llvm.org/D50527 Added: cfe/trunk/test/Parser/message-expr-alt-op.mm Modified: cfe/trunk/lib/Parse/ParseExpr.cpp Modified: cfe/trunk/lib/Parse/ParseExpr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseExpr.cpp?rev=340301&r1=340300&r2=340301&view=diff ============================================================================== --- cfe/trunk/lib/Parse/ParseExpr.cpp (original) +++ cfe/trunk/lib/Parse/ParseExpr.cpp Tue Aug 21 09:47:04 2018 @@ -315,6 +315,19 @@ Parser::ParseRHSOfBinaryExpression(ExprR 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) { Added: cfe/trunk/test/Parser/message-expr-alt-op.mm URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/message-expr-alt-op.mm?rev=340301&view=auto ============================================================================== --- cfe/trunk/test/Parser/message-expr-alt-op.mm (added) +++ cfe/trunk/test/Parser/message-expr-alt-op.mm Tue Aug 21 09:47:04 2018 @@ -0,0 +1,41 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +@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; +@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]; +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits