From da46f3b5dacd300ec95a7baa3fb24d5ca2cdf920 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 25 Jan 2008 19:37:24 +0000 Subject: [PATCH] First half of a fix for the "objc message send in initializer" bug. This only 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 | 17 ++++++++++++++++- test/Parser/objc-init.m | 13 +++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 test/Parser/objc-init.m diff --git a/Parse/ParseInit.cpp b/Parse/ParseInit.cpp index cf8293e009..9c5b6d8921 100644 --- a/Parse/ParseInit.cpp +++ b/Parse/ParseInit.cpp @@ -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 index 0000000000..43e6c2e26e --- /dev/null +++ b/test/Parser/objc-init.m @@ -0,0 +1,13 @@ +// RUN: clang -fsyntax-only -verify %s +// rdar://5707001 + +@interface NSNumber; +- () METH; + +@end + +int main() { + id objects[] = {[NSNumber METH]}; + return 0; +} + -- 2.40.0