On 09/26/22 10:50, Daniel P. Berrangé wrote:
> On Mon, Sep 26, 2022 at 10:18:06AM +0200, Laszlo Ersek wrote:
>> gcc reports:
>>
>>> gui.c:1795:3: error: missing initializer for field ‘padding’ of
>>> ‘GActionEntry’ {aka ‘const struct _GActionEntry’}
>>> [-Werror=missing-field-initializers]
>>> 1795 | { "shutdown", activate_action, NULL, NULL, NULL },
>>>
>>> gui.c:1796:3: error: missing initializer for field ‘padding’ of
>>> ‘GActionEntry’ {aka ‘const struct _GActionEntry’}
>>> [-Werror=missing-field-initializers]
>>> 1796 | { "reboot", activate_action, NULL, NULL, NULL },
>>
>> I've found this only now because:
>>
>> - this is the first time I'm building virt-p2v with GTK3,
>>
>> - the "shutdown_actions" array depends on USE_POPOVERS which depends
on
>> GTK3 being selected,
>>
>> - the "missing-field-initializers" warning (treated as an error) has
>> recently been enabled via "-Wextra" in commit 391f9833d398
("p2v-c.m4:
>> elicit a stricter set of warnings from gcc", 2022-09-23).
>>
>> The C-language documentation for GActionEntry is silent on the
"padding"
>> array:
>>
>>
https://docs.gtk.org/gio/struct.ActionEntry.html
>>
>> However, the D-language docs expose it:
>>
>>
https://api.gtkd.org/gio.c.types.GActionEntry.html
>>
>> Provide the missing field initializer.
>>
>> Signed-off-by: Laszlo Ersek <lersek(a)redhat.com>
>> ---
>> gui.c | 4 ++--
>> 1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/gui.c b/gui.c
>> index 49301d9a985b..4faaa710ed90 100644
>> --- a/gui.c
>> +++ b/gui.c
>> @@ -1792,8 +1792,8 @@ static gboolean close_running_dialog (GtkWidget *w,
GdkEvent *event, gpointer da
>>
>> #ifdef USE_POPOVERS
>> static const GActionEntry shutdown_actions[] = {
>> - { "shutdown", activate_action, NULL, NULL, NULL },
>> - { "reboot", activate_action, NULL, NULL, NULL },
>> + { "shutdown", activate_action, NULL, NULL, NULL, { 0 } },
>> + { "reboot", activate_action, NULL, NULL, NULL, { 0 } },
>> };
>
> Notice the header decl says 'padding' is private hence why it is
> not documented.
>
> struct _GActionEntry
> {
> const gchar *name;
>
> void (* activate) (GSimpleAction *action,
> GVariant *parameter,
> gpointer user_data);
>
> const gchar *parameter_type;
>
> const gchar *state;
>
> void (* change_state) (GSimpleAction *action,
> GVariant *value,
> gpointer user_data);
>
> /*< private >*/
> gsize padding[3];
> };
>
>
> The purpose of this 'padding' entry is to reserve space in the struct
> for future usage. Apps should never touch the padding field, since it
> can change in future. ie that 3 element array can turn into three
> separate public fields later, and then the compound initializer above
> would be invalid.
Right; I thought we'd just fix it again at that point :)
>
> The right way to declare this is using named initializers:
>
> { .name = "shutdown", .activate = activate_action },
> { .name = "reboot", .activate = activate_action },
I wasn't sure if the p2v coding style permitted designated
initializers... Now that I'm looking closer, yes, there is "prior art";
in compound literals in "ssh.c".
As the most prolific recent contributor the coding style is roughly
whatever you say at this point :-)
Rich.
--
Richard Jones, Virtualization Group, Red Hat