[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