[Bug c++/41788] New: -Wpacked option changes the layout of packed non-POD structs
nenad at tensilica dot com
gcc-bugzilla@gcc.gnu.org
Thu Oct 22 00:05:00 GMT 2009
When a packed non-POD struct is included in another packed struct,
the outer struct layout changes depending on whether -Wpacked is used or not.
It seems wrong that a warning option affects data layout and code generation.
The same behavior is observed with 4.4.2, 4.3.4, 4.2.1, 4.1.2.
It could be related to bug 26670.
% cat packed_nonpod.cpp
extern "C" int printf (__const char *__restrict __format, ...);
struct INNER {
virtual int foo() const { return 1; }
} __attribute__ ((packed));
struct OUTER {
char c;
INNER inner;
} __attribute__ ((packed));
int main()
{
OUTER outer;
printf("sizeof(outer) = %u\n", sizeof(outer));
printf("offset(inner) = %u\n", (char *)&outer.inner - (char *)&outer);
return 0;
}
% g++ packed_nonpod.cpp
% a.out
sizeof(outer) = 5
offset(inner) = 1
% g++ packed_nonpod.cpp -Wpacked
packed_nonpod.cpp:3: warning: packed attribute is unnecessary for 'INNER'
packed_nonpod.cpp:9: warning: ignoring packed attribute because of unpacked
non-POD field 'INNER OUTER::inner'
% a.out
sizeof(outer) = 8
offset(inner) = 4
--
Summary: -Wpacked option changes the layout of packed non-POD
structs
Product: gcc
Version: 4.4.2
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: nenad at tensilica dot com
GCC build triplet: i686-pc-linux-gnu
GCC host triplet: i686-pc-linux-gnu
GCC target triplet: i686-pc-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41788
More information about the Gcc-bugs
mailing list