https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71250
--- Comment #3 from Vincent Lefèvre <vincent-gcc at vinc17 dot net> ---
However, it seems that GCC doesn't support the { 0 } idiom in all cases. For
instance:
#include <pthread.h>
struct { struct { int a; long b; } x; int y; } s = { { 1 }, 1 };
struct { struct { int a; long b; } x; int y; } t = { { 0 }, 1 };
struct { struct { pthread_rwlock_t a; long b; } x; int y; } u = { { 0 }, 1 };
The first structure initialization triggers the warning as expected:
tst.c:3:17: warning: missing initializer for field ‘b’ of ‘struct <anonymous>’
-Wmissing-field-initializers]
struct { struct { int a; long b; } x; int y; } s = { { 1 }, 1 };
^
tst.c:3:31: note: ‘b’ declared here
struct { struct { int a; long b; } x; int y; } s = { { 1 }, 1 };
^
The second one doesn't trigger any warning due to the use of the idiom.
But the third one triggers the following warning, though the same idiom is
used:
tst.c:7:65: warning: missing braces around initializer [-Wmissing-braces]
struct { struct { pthread_rwlock_t a; long b; } x; int y; } u = { { 0 }, 1 };
^
tst.c:7:65: note: (near initialization for ‘u’)