]> granicus.if.org Git - clang/commitdiff
First half of a fix for the "objc message send in initializer" bug. This only
authorChris Lattner <sabre@nondot.org>
Fri, 25 Jan 2008 19:37:24 +0000 (19:37 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 25 Jan 2008 19:37:24 +0000 (19:37 +0000)
handles message sends with typenames to start with.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46366 91177308-0d34-0410-b5e6-96231b3b80d8

Parse/ParseInit.cpp
test/Parser/objc-init.m [new file with mode: 0644]

index cf8293e009661ad3b8f5517222ce50c630e11023..9c5b6d8921b429c0c61415e96d7cfebcc84a1b16 100644 (file)
@@ -86,9 +86,24 @@ Parser::ExprResult Parser::ParseInitializerWithPotentialDesignator() {
     case tok::l_square: {
       // array-designator: '[' constant-expression ']'
       // array-designator: '[' constant-expression '...' constant-expression ']'
+      // When designation is empty, this can be '[' objc-message-expr ']'.  Note
+      // that we also have the case of [4][foo bar], which is the gnu designator
+      // extension + objc message send.
       SourceLocation StartLoc = ConsumeBracket();
       
-      ExprResult Idx = ParseConstantExpression();
+      // If Objective-C is enabled and this is a typename or other identifier
+      // receiver, parse this as a message send expression.
+      if (getLang().ObjC1 && isTokObjCMessageIdentifierReceiver()) {
+        IdentifierInfo *Name = Tok.getIdentifierInfo();
+        ConsumeToken();
+        ExprResult R = ParseObjCMessageExpressionBody(StartLoc, Name, 0);
+        return ParsePostfixExpressionSuffix(R);
+      }
+      
+      // Note that we parse this as an assignment expression, not a constant
+      // expression (allowing *=, =, etc).  Sema needs to validate that the
+      // expression is a constant.
+      ExprResult Idx = ParseAssignmentExpression();
       if (Idx.isInvalid) {
         SkipUntil(tok::r_square);
         return Idx;
diff --git a/test/Parser/objc-init.m b/test/Parser/objc-init.m
new file mode 100644 (file)
index 0000000..43e6c2e
--- /dev/null
@@ -0,0 +1,13 @@
+// RUN: clang -fsyntax-only -verify %s
+// rdar://5707001
+
+@interface NSNumber;
+- () METH;
+
+@end
+
+int main() {
+       id objects[] = {[NSNumber METH]};
+       return 0;
+}
+