https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61489
Bug ID: 61489
Summary: Wrong warning with -Wmissing-field-initializers.
Product: gcc
Version: 4.9.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: D.Bahadir at GMX dot de
Created attachment 32928
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=32928&action=edit
test-case
This bug is related to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=36750 but
addresses C++ instead of C.
When compiling the following code (in C++11 mode) with
-Wmissing-field-initializers then almost all attempts to initialize
"sockaddr_in" result in compiler-warnings about uninitialized field-members.
However, as far as I understand, almost all initializations should be fine and
zero-initialize (?) all struct-members and the compiler-warnings should
therefore not occur.
<code>
// Compile this code with: g++ -std=c++11 -Wmissing-field-initializers bug.cpp
#include <netinet/in.h>
int main()
{
struct sockaddr_in addr0; // No warning. But really zero-initialized?
//struct sockaddr_in addr1(); // No warning, but a function-declaration.
struct sockaddr_in addr2 = {}; // In C++: Warning about all members.
// In C: Warning about first member.
struct sockaddr_in addr3 = {0}; // In C++: Warning about all members
// except the first one.
struct sockaddr_in addr4 = {0,}; // Same here.
#ifdef __cplusplus
struct sockaddr_in addr5 = sockaddr_in(); // No warning and (probably)
// zero-initialized.
#endif
#if __cplusplus >= 201103L
struct sockaddr_in addr6{}; // Warning about all members.
struct sockaddr_in addr7{0}; // Warning about all members except the
// first one.
struct sockaddr_in addr8{0,}; // Same here.
struct sockaddr_in addr9 = sockaddr_in{}; // Warning about all members.
struct sockaddr_in addr10 = sockaddr_in{0}; // Warning about all members
// except the first one.
struct sockaddr_in addr11 = sockaddr_in{0,}; // Same here.
#endif
return 0;
}
</code>
When compiling this code the following warnings will be issued:
bug.cpp: In function ‘int main()’:
bug.cpp:9:33: warning: missing initializer for member ‘sockaddr_in::sin_family’
[-Wmissing-field-initializers]
struct sockaddr_in addr2 = {}; // In C++: Warning about all members.
^
bug.cpp:9:33: warning: missing initializer for member ‘sockaddr_in::sin_port’
[-Wmissing-field-initializers]
bug.cpp:9:33: warning: missing initializer for member ‘sockaddr_in::sin_addr’
[-Wmissing-field-initializers]
bug.cpp:9:33: warning: missing initializer for member ‘sockaddr_in::sin_zero’
[-Wmissing-field-initializers]
bug.cpp:11:34: warning: missing initializer for member ‘sockaddr_in::sin_port’
[-Wmissing-field-initializers]
struct sockaddr_in addr3 = {0}; // In C++: Warning about all members
^
bug.cpp:11:34: warning: missing initializer for member ‘sockaddr_in::sin_addr’
[-Wmissing-field-initializers]
bug.cpp:11:34: warning: missing initializer for member ‘sockaddr_in::sin_zero’
[-Wmissing-field-initializers]
bug.cpp:13:35: warning: missing initializer for member ‘sockaddr_in::sin_port’
[-Wmissing-field-initializers]
struct sockaddr_in addr4 = {0,}; // Same here.
^
bug.cpp:13:35: warning: missing initializer for member ‘sockaddr_in::sin_addr’
[-Wmissing-field-initializers]
bug.cpp:13:35: warning: missing initializer for member ‘sockaddr_in::sin_zero’
[-Wmissing-field-initializers]
bug.cpp:19:30: warning: missing initializer for member
‘sockaddr_in::sin_family’ [-Wmissing-field-initializers]
struct sockaddr_in addr6{}; // Warning about all members.
^
bug.cpp:19:30: warning: missing initializer for member ‘sockaddr_in::sin_port’
[-Wmissing-field-initializers]
bug.cpp:19:30: warning: missing initializer for member ‘sockaddr_in::sin_addr’
[-Wmissing-field-initializers]
bug.cpp:19:30: warning: missing initializer for member ‘sockaddr_in::sin_zero’
[-Wmissing-field-initializers]
bug.cpp:20:31: warning: missing initializer for member ‘sockaddr_in::sin_port’
[-Wmissing-field-initializers]
struct sockaddr_in addr7{0}; // Warning about all members except the
^
bug.cpp:20:31: warning: missing initializer for member ‘sockaddr_in::sin_addr’
[-Wmissing-field-initializers]
bug.cpp:20:31: warning: missing initializer for member ‘sockaddr_in::sin_zero’
[-Wmissing-field-initializers]
bug.cpp:22:32: warning: missing initializer for member ‘sockaddr_in::sin_port’
[-Wmissing-field-initializers]
struct sockaddr_in addr8{0,}; // Same here.
^
bug.cpp:22:32: warning: missing initializer for member ‘sockaddr_in::sin_addr’
[-Wmissing-field-initializers]
bug.cpp:22:32: warning: missing initializer for member ‘sockaddr_in::sin_zero’
[-Wmissing-field-initializers]
bug.cpp:23:45: warning: missing initializer for member
‘sockaddr_in::sin_family’ [-Wmissing-field-initializers]
struct sockaddr_in addr9 = sockaddr_in{}; // Warning about all
members.
^
bug.cpp:23:45: warning: missing initializer for member ‘sockaddr_in::sin_port’
[-Wmissing-field-initializers]
bug.cpp:23:45: warning: missing initializer for member ‘sockaddr_in::sin_addr’
[-Wmissing-field-initializers]
bug.cpp:23:45: warning: missing initializer for member ‘sockaddr_in::sin_zero’
[-Wmissing-field-initializers]
bug.cpp:24:46: warning: missing initializer for member ‘sockaddr_in::sin_port’
[-Wmissing-field-initializers]
struct sockaddr_in addr10 = sockaddr_in{0}; // Warning about all members
^
bug.cpp:24:46: warning: missing initializer for member ‘sockaddr_in::sin_addr’
[-Wmissing-field-initializers]
bug.cpp:24:46: warning: missing initializer for member ‘sockaddr_in::sin_zero’
[-Wmissing-field-initializers]
bug.cpp:26:47: warning: missing initializer for member ‘sockaddr_in::sin_port’
[-Wmissing-field-initializers]
struct sockaddr_in addr11 = sockaddr_in{0,}; // Same here.
^
bug.cpp:26:47: warning: missing initializer for member ‘sockaddr_in::sin_addr’
[-Wmissing-field-initializers]
bug.cpp:26:47: warning: missing initializer for member ‘sockaddr_in::sin_zero’
[-Wmissing-field-initializers]