On Thu, Feb 18, 2016 at 10:39:02PM +0100, Jakub Jelinek wrote:
> Hi!
> 
> Here is an attempt to fix up the token reclassification after for statement,
> where we lexed the next token with the declaration from for in scope and
> need to undo that if it wasn't else.
> 
> If token->id_kind is C_ID_CLASSNAME (ObjC only), then token->value has
> changed already, but in that case I think it means we can just keep it as
> is, it can't be shadowed by the for init declaration (because it would be
> C_ID_ID or C_ID_TYPENAME? otherwise).
> Otherwise, this patch tries to model the handling closer to what
> c_lex_one_token does, i.e. set it to C_ID_ID, except when decl is non-NULL
> and TYPE_DECL, or for the ObjC case where for init declaration shadowed
> a class declaration.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
> 
> 2016-02-18  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR objc/69844
>       * c-parser.c (c_parser_for_statement): Properly handle ObjC classes
>       in id_kind reclassification.
> 
>       * objc.dg/pr69844.m: New test.
> 
> --- gcc/c/c-parser.c.jj       2016-02-16 16:29:54.000000000 +0100
> +++ gcc/c/c-parser.c  2016-02-18 17:36:55.025067859 +0100
> @@ -5887,12 +5887,27 @@ c_parser_for_statement (c_parser *parser
>      {
>        c_token *token = c_parser_peek_token (parser);
>        tree decl = lookup_name (token->value);
> -      if (decl == NULL_TREE || VAR_P (decl))
> -     /* If DECL is null, we don't know what this token might be.  Treat
> -        it as an ID for better diagnostics; we'll error later on.  */
> -     token->id_kind = C_ID_ID;
> -      else if (TREE_CODE (decl) == TYPE_DECL)
> -     token->id_kind = C_ID_TYPENAME;
> +      if (token->id_kind != C_ID_CLASSNAME)
> +     {
> +       token->id_kind = C_ID_ID;

I think let's sink the lookup_name call here.  If id_kind is C_ID_CLASSNAME
we're not looking at decl at all.

> +       if (decl)
> +         {
> +           if (TREE_CODE (decl) == TYPE_DECL)
> +             token->id_kind = C_ID_TYPENAME;
> +         }
> +       else if (c_dialect_objc ())
> +         {
> +           tree objc_interface_decl = objc_is_class_name (token->value);

This objc_is_class_name is a weird stub that always returns NULL_TREE but
I know that the same code is in c_lex_one_token so let's keep it this way.

I've tried a bunch of invalid ObjC testcases and saw no ICEs and from the
C point of view this patch is safe.

Ok with that lookup_name change, thanks.

        Marek

Reply via email to