When we have two identifiers in a row in Objective-C, make sure to
verify that we aren't in a message-send expression before digging into the identifier or looking ahead more tokens. Fixes a regression (<rdar://problem/8483253>) I introduced with bracket insertion. llvm-svn: 114968
This commit is contained in:
parent
eb9e9a3710
commit
1ba435f0f9
|
@ -671,7 +671,7 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression,
|
|||
// If we have an Objective-C class name followed by an identifier and
|
||||
// either ':' or ']', this is an Objective-C class message send that's
|
||||
// missing the opening '['. Recovery appropriately.
|
||||
if (getLang().ObjC1 && Tok.is(tok::identifier)) {
|
||||
if (getLang().ObjC1 && Tok.is(tok::identifier) && !InMessageExpression) {
|
||||
const Token& Next = NextToken();
|
||||
if (Next.is(tok::colon) || Next.is(tok::r_square))
|
||||
if (ParsedType Typ = Actions.getTypeName(II, ILoc, getCurScope()))
|
||||
|
|
|
@ -92,3 +92,23 @@ void test_I5(I5 *i5, String s) {
|
|||
[i5 method:"hello" other:s];
|
||||
[i5 method:s other:"world"]; // expected-error{{non-const lvalue reference to type 'String' cannot bind to a value of unrelated type 'const char [6]'}}
|
||||
}
|
||||
|
||||
// <rdar://problem/8483253>
|
||||
@interface A
|
||||
|
||||
struct X { };
|
||||
|
||||
+ (A *)create:(void (*)(void *x, X r, void *data))callback
|
||||
callbackData:(void *)callback_data;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
void foo(void)
|
||||
{
|
||||
void *fun;
|
||||
void *ptr;
|
||||
X r;
|
||||
A *im = [A create:(void (*)(void *cgl_ctx, X r, void *data)) fun
|
||||
callbackData:ptr];
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue