From: Douglas Gregor Date: Tue, 28 Sep 2010 17:48:56 +0000 (+0000) Subject: When we have two identifiers in a row in Objective-C, make sure to X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=857736454fabeb828e399dce094bbb3aad64fba2;p=clang 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 () I introduced with bracket insertion. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@114968 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Parse/ParseExpr.cpp b/lib/Parse/ParseExpr.cpp index e04e62bcb2..2785f1b14d 100644 --- a/lib/Parse/ParseExpr.cpp +++ b/lib/Parse/ParseExpr.cpp @@ -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())) diff --git a/test/SemaObjCXX/message.mm b/test/SemaObjCXX/message.mm index ab86d9437f..fce546304f 100644 --- a/test/SemaObjCXX/message.mm +++ b/test/SemaObjCXX/message.mm @@ -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]'}} } + +// +@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]; +}