]> granicus.if.org Git - clang/commitdiff
Minor tweaks on doug's objc recovery patch: the caller
authorChris Lattner <sabre@nondot.org>
Mon, 31 May 2010 18:18:22 +0000 (18:18 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 31 May 2010 18:18:22 +0000 (18:18 +0000)
of isSimpleObjCMessageExpression checks the language,
so change a dynamic check into an assert.

isSimpleObjCMessageExpression is expensive, so only do it
in the common case when it is likely to matter: when the [
of the postfix expr starts on a new line.  This should avoid
doing lookahead for every array expression.

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

lib/Parse/ParseExpr.cpp
lib/Parse/ParseObjc.cpp

index 093f9738ca9ba9d1b2aa0a8fc72ef5b1dceb7171..cc69bdc0658600fb607f2ef611d74a302d446170 100644 (file)
@@ -961,7 +961,14 @@ Parser::ParsePostfixExpressionSuffix(OwningExprResult LHS) {
     default:  // Not a postfix-expression suffix.
       return move(LHS);
     case tok::l_square: {  // postfix-expression: p-e '[' expression ']'
-      if (getLang().ObjC1 && isSimpleObjCMessageExpression())
+      // If we have a array postfix expression that starts on a new line and
+      // Objective-C is enabled, it is highly likely that the user forgot a
+      // semicolon after the base expression and that the array postfix-expr is
+      // actually another message send.  In this case, do some look-ahead to see
+      // if the contents of the square brackets are obviously not a valid
+      // expression and recover by pretending there is no suffix.
+      if (getLang().ObjC1 && Tok.isAtStartOfLine() &&
+          isSimpleObjCMessageExpression())
         return move(LHS);
           
       Loc = ConsumeBracket();
index 34b8187be5121e474733f04da7a9626d67624a30..365733d8c4cb4c46f57216edca3d23f1d7f9b6db 100644 (file)
@@ -1730,7 +1730,6 @@ Parser::OwningExprResult Parser::ParseObjCAtExpression(SourceLocation AtLoc) {
 ///     expression
 ///     simple-type-specifier
 ///     typename-specifier
-
 bool Parser::ParseObjCXXMessageReceiver(bool &IsExpr, void *&TypeOrExpr) {
   if (Tok.is(tok::identifier) || Tok.is(tok::coloncolon) || 
       Tok.is(tok::kw_typename) || Tok.is(tok::annot_cxxscope))
@@ -1800,11 +1799,8 @@ bool Parser::ParseObjCXXMessageReceiver(bool &IsExpr, void *&TypeOrExpr) {
 /// This routine will only return true for a subset of valid message-send
 /// expressions.
 bool Parser::isSimpleObjCMessageExpression() {
-  assert(Tok.is(tok::l_square) && 
+  assert(Tok.is(tok::l_square) && getLang().ObjC1 &&
          "Incorrect start for isSimpleObjCMessageExpression");
-  if (!getLang().ObjC1)
-    return false;
-  
   return GetLookAheadToken(1).is(tok::identifier) &&
          GetLookAheadToken(2).is(tok::identifier);
 }
@@ -1855,7 +1851,9 @@ Parser::OwningExprResult Parser::ParseObjCMessageExpression() {
 
     return ParseObjCMessageExpressionBody(LBracLoc, SourceLocation(), 
                                           TypeOrExpr, ExprArg(Actions));
-  } else if (Tok.is(tok::identifier)) {
+  }
+  
+  if (Tok.is(tok::identifier)) {
     IdentifierInfo *Name = Tok.getIdentifierInfo();
     SourceLocation NameLoc = Tok.getLocation();
     TypeTy *ReceiverType;