mirror of https://github.com/microsoft/clang.git
[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:
parent
4b752d0315
commit
d43e8cc026
|
@ -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) {
|
||||||
|
|
|
@ -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];
|
||||||
|
}
|
Loading…
Reference in New Issue