Extend bracket insertion to message sends to "super", e.g.,

super method:arg]

will now recover nicely and insert the '[' before 'super'.

llvm-svn: 113971
This commit is contained in:
Douglas Gregor 2010-09-15 15:09:43 +00:00
parent 851b323866
commit 7617c7d295
2 changed files with 26 additions and 0 deletions

View File

@ -663,6 +663,18 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression,
break; break;
} }
// In an Objective-C method, if we have "super" followed by an identifier,
// the token sequence is ill-fomed. However, if there's a ':' or ']' after
// that identifier, this is probably a message send with a missing open
// bracket. Treat it as such.
if (getLang().ObjC1 && &II == Ident_super && Tok.is(tok::identifier) &&
getCurScope()->isInObjcMethodScope() &&
(NextToken().is(tok::colon) || NextToken().is(tok::r_square))) {
Res = ParseObjCMessageExpressionBody(SourceLocation(), ILoc, ParsedType(),
0);
break;
}
// Make sure to pass down the right value for isAddressOfOperand. // Make sure to pass down the right value for isAddressOfOperand.
if (isAddressOfOperand && isPostfixExpressionSuffixStart()) if (isAddressOfOperand && isPostfixExpressionSuffixStart())
isAddressOfOperand = false; isAddressOfOperand = false;

View File

@ -18,4 +18,18 @@ void f(A *a, int i, int j) {
a method1:5+2 second:+(3.14159)]; a method1:5+2 second:+(3.14159)];
a method1:[a method1:3 second:j] second:i++] a method1:[a method1:3 second:j] second:i++]
a getBlah]; a getBlah];
int array[17];
(void)array[a method1:5+2 second:+(3.14159)]];
} }
@interface B : A
- (int)method1:(int)x second:(float)y;
@end
@implementation B
- (int)method1:(int)x second:(float)y {
super method1:x second:y];
return super getBlah];
}
@end