2011/7/29 Daniel Marjamäki <daniel.marjam...@gmail.com>:
> Hello!
>
> In my humble opinion the -Wreorder has noise. When the order doesn't
> matter I would prefer that warnings are not issued.
>
> In this email I include a patch that I would like to get comments
> about. The patch will suppress warnings if all members are initialized
> with constant values.
> I am not very good at GCC internals so I wonder if I made some serious
> mistake when using TREE_VALUE, TREE_CODE, etc? Perhaps I overlook
> something?
>
> Here is sample code that currently generates warnings but my patch
> suppress those warnings:
>
>    class Fred {
>    private:
>        int a;
>        int b;
>    public:
>        Fred() : b(0), a(0) { }
>    };
>
> I think the next step will be to suppress the warning if both the
> members that the message is about are initialized with constant
> values.

Why doesn't it matter in this case but it matters when the initializer
are non-constant?

Richard.

> Best regards,
> Daniel
>
>
> Index: gcc/cp/init.c
> ===================================================================
> --- gcc/cp/init.c       (revision 176862)
> +++ gcc/cp/init.c       (working copy)
> @@ -711,6 +711,7 @@
>   VEC(tree,gc) *vbases;
>   int i;
>   int uses_unions_p;
> +  int all_inits_are_const;   /* all members are initialized with a
> constant value */
>
>   /* Build up a list of initializations.  The TREE_PURPOSE of entry
>      will be the subobject (a FIELD_DECL or BINFO) to initialize.  The
> @@ -741,6 +742,25 @@
>      without issuing a warning.  */
>   next_subobject = sorted_inits;
>
> +  all_inits_are_const = 1;
> +  if (warn_reorder)
> +    {
> +      for (init = mem_inits; init; init = TREE_CHAIN (init))
> +        {
> +          tree tree_value;
> +
> +          tree_value = TREE_VALUE(init);
> +          if (TREE_CODE(tree_value) == TREE_LIST)
> +            tree_value = TREE_VALUE(tree_value);
> +
> +          if (TREE_CODE(tree_value) != INTEGER_CST)
> +            {
> +              all_inits_are_const = 0;
> +              break;
> +            }
> +        }
> +    }
> +
>   /* Go through the explicit initializers, filling in TREE_PURPOSE in
>      the SORTED_INITS.  */
>   for (init = mem_inits; init; init = TREE_CHAIN (init))
> @@ -762,7 +782,7 @@
>       /* Issue a warning if the explicit initializer order does not
>         match that which will actually occur.
>         ??? Are all these on the correct lines?  */
> -      if (warn_reorder && !subobject_init)
> +      if (warn_reorder && !all_inits_are_const && !subobject_init)
>        {
>          if (TREE_CODE (TREE_PURPOSE (next_subobject)) == FIELD_DECL)
>            warning (OPT_Wreorder, "%q+D will be initialized after",
>

Reply via email to