2011/7/29 Daniel Marjamäki <[email protected]>:
> 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",
>