[cfe-commits] r105229 - in /cfe/trunk/lib/Parse: ParseExpr.cpp ParseObjc.cpp

Douglas Gregor dgregor at apple.com
Mon May 31 12:30:05 PDT 2010



Sent from my iPhone

On May 31, 2010, at 11:18 AM, Chris Lattner <sabre at nondot.org> wrote:

> Author: lattner
> Date: Mon May 31 13:18:22 2010
> New Revision: 105229
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=105229&view=rev
> Log:
> Minor tweaks on doug's objc recovery patch: the caller
> 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.

Ah, good trick. Thanks!

> 
> Modified:
>    cfe/trunk/lib/Parse/ParseExpr.cpp
>    cfe/trunk/lib/Parse/ParseObjc.cpp
> 
> Modified: cfe/trunk/lib/Parse/ParseExpr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseExpr.cpp?rev=105229&r1=105228&r2=105229&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParseExpr.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseExpr.cpp Mon May 31 13:18:22 2010
> @@ -961,7 +961,14 @@
>     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();
> 
> Modified: cfe/trunk/lib/Parse/ParseObjc.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseObjc.cpp?rev=105229&r1=105228&r2=105229&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParseObjc.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseObjc.cpp Mon May 31 13:18:22 2010
> @@ -1730,7 +1730,6 @@
> ///     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 @@
> /// 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 @@
> 
>     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;
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list