Advertencia de inicializador designado y literal compuesto de GCC pero no de Clang

 C Programming >> Programación C >  >> Tags >> Clang
Advertencia de inicializador designado y literal compuesto de GCC pero no de Clang

Parece un "error de consistencia" de gcc, aquí está el fragmento de código relevante en gcc/c/c-typeck.c

 7436   /* Warn when some struct elements are implicitly initialized to zero.  */
 7437   if (warn_missing_field_initializers
 7438       && constructor_type
 7439       && TREE_CODE (constructor_type) == RECORD_TYPE
 7440       && constructor_unfilled_fields)
 7441     {
 7442         bool constructor_zeroinit =
 7443          (vec_safe_length (constructor_elements) == 1
 7444           && integer_zerop ((*constructor_elements)[0].value));
 7445
 7446         /* Do not warn for flexible array members or zero-length arrays.  */
 7447         while (constructor_unfilled_fields
 7448                && (!DECL_SIZE (constructor_unfilled_fields)
 7449                    || integer_zerop (DECL_SIZE (constructor_unfilled_fields))))
 7450           constructor_unfilled_fields = DECL_CHAIN (constructor_unfilled_fields);
 7451
 7452         if (constructor_unfilled_fields
 7453             /* Do not warn if this level of the initializer uses member
 7454                designators; it is likely to be deliberate.  */
 7455             && !constructor_designated
 7456             /* Do not warn about initializing with ` = {0}'.  */
 7457             && !constructor_zeroinit)
 7458           {
 7459             if (warning_at (input_location, OPT_Wmissing_field_initializers,
 7460                             "missing initializer for field %qD of %qT",
 7461                             constructor_unfilled_fields,
 7462                             constructor_type))
 7463               inform (DECL_SOURCE_LOCATION (constructor_unfilled_fields),
 7464                       "%qD declared here", constructor_unfilled_fields);
 7465           }
 7466     }

La intención del código parece ser advertir si algún constructor de atributo tiene un campo vacío. El hecho de que no esté recibiendo una advertencia sobre el elemento 'a' es probablemente el "error de consistencia" aquí.

Si -Wextra tiene la intención de activar la advertencia de inicializadores faltantes, entonces lo ha hecho. La pregunta es, ¿debería la "advertencia de inicializadores faltantes" excluir los atributos omitidos? Parece que gcc y clang no están de acuerdo con esto, ¿y estaría bien que lo hicieran?

Puede que esta no sea la respuesta que está buscando... pero espero que le ayude a comprender la situación. :). El equipo de GCC tiene un error de consistencia, pero la intención de su código parece advertir en estos casos, mientras que clang, empíricamente, no lo hará.