On Thu, Feb 27, 2014 at 10:37 AM, Tobias Burnus
<tobias.bur...@physik.fu-berlin.de> wrote:
> Hi Richard, hi all,
>
> I wrote:
>> @@ -1713,21 +1733,24 @@ dump_generic_node (pretty_printer *buffer, tree 
>> node, int spc, int flags,
>>     case BIND_EXPR:
> ...
>>             for (op0 = BIND_EXPR_VARS (node); op0; op0 = DECL_CHAIN (op0))
>>               {
>>-                print_declaration (buffer, op0, spc+2, flags);
>>+                if (TREE_CODE(op0) == NAMELIST_DECL)
> ...
>
> Richard Biener wrote:
>> Works for me, but doesn't the simpler
>
>> --- tree-pretty-print.c (revision 208066)
>> +++ tree-pretty-print.c (working copy)
>> @@ -1390,6 +1390,7 @@
>>     case FIELD_DECL:
>>     case DEBUG_EXPR_DECL:
>>     case NAMESPACE_DECL:
>>+    case NAMELIST_DECL:
>>       dump_decl_name (buffer, node, flags);
>>       break;
>>
>> also work?  It's odd that we need to do sth special just for namelist-decls.
>
> It won't do - at least not like that. NAMELIST_DECL are stored in BIND_EXPR,
> hence, one ends up in the code I quote above. That code calls
>   print_declaration()
>
> NAMELIST_DECL are created as
>   decl = make_node (NAMELIST_DECL);
>   TREE_TYPE (decl) = void_type_node;
>   NAMELIST_DECL_ASSOCIATED_DECL (decl) = build_constructor (NULL_TREE, 
> nml_decls);
> Hence, TREE_TYPE() is void_type_node and dereferencing that one leads to an 
> ICE.

Where is it "dereferenced"?  void_type_node is a valid type.

>
> However, the following should work - do you like it more?
>
> Tobias
>
>
> --- a/gcc/tree-pretty-print.c
> +++ b/gcc/tree-pretty-print.c
> @@ -2686,6 +2686,13 @@ print_declaration (pretty_printer *buffer, tree t, int 
> spc, int flags)
>  {
>    INDENT (spc);
>
> +  if (TREE_CODE(t) == NAMELIST_DECL)
> +    {
> +       pp_string(buffer, "namelist ");
> +       dump_decl_name (buffer, t, flags);
> +       goto done;
> +    }
> +
>    if (TREE_CODE (t) == TYPE_DECL)
>      pp_string (buffer, "typedef ");
>
> @@ -2767,6 +2774,7 @@ print_declaration (pretty_printer *buffer, tree t, int 
> spc, int flags)
>        pp_right_bracket (buffer);
>      }
>
> +done:
>    pp_semicolon (buffer);

Instead of the goto please duplicate the pp_semicolon and return.

Ok with that change.  You probably still want to add the NAMELIST_DECL
case to dump_generic_node (to avoid the << Unknown tree: ...).

Thanks,
Richard.

>  }

Reply via email to