Author: dgregor
Date: Tue Sep 28 12:48:56 2010
New Revision: 114968

URL: http://llvm.org/viewvc/llvm-project?rev=114968&view=rev
Log:
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.


Modified:
    cfe/trunk/lib/Parse/ParseExpr.cpp
    cfe/trunk/test/SemaObjCXX/message.mm

Modified: cfe/trunk/lib/Parse/ParseExpr.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseExpr.cpp?rev=114968&r1=114967&r2=114968&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/ParseExpr.cpp (original)
+++ cfe/trunk/lib/Parse/ParseExpr.cpp Tue Sep 28 12:48:56 2010
@@ -671,7 +671,7 @@
     // 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()))

Modified: cfe/trunk/test/SemaObjCXX/message.mm
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjCXX/message.mm?rev=114968&r1=114967&r2=114968&view=diff
==============================================================================
--- cfe/trunk/test/SemaObjCXX/message.mm (original)
+++ cfe/trunk/test/SemaObjCXX/message.mm Tue Sep 28 12:48:56 2010
@@ -92,3 +92,23 @@
   [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];
+}


_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to