[Parser] Support alternative operator token keyword args in Objective-C++

rdar://30741878

Differential revision: https://reviews.llvm.org/D50527

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@340301 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Erik Pilkington 2018-08-21 16:47:04 +00:00
parent 4b752d0315
commit d43e8cc026
2 changed files with 54 additions and 0 deletions

View File

@ -315,6 +315,19 @@ Parser::ParseRHSOfBinaryExpression(ExprResult LHS, prec::Level MinPrec) {
return LHS; 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. // Special case handling for the ternary operator.
ExprResult TernaryMiddle(true); ExprResult TernaryMiddle(true);
if (NextTokPrec == prec::Conditional) { if (NextTokPrec == prec::Conditional) {

View File

@ -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];
}