[Bug c/52991] attribute packed broken on mingw32?
daniel.c.klauer at web dot de
gcc-bugzilla@gcc.gnu.org
Sat Oct 6 23:02:00 GMT 2012
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52991
--- Comment #6 from daniel.c.klauer at web dot de 2012-10-06 23:02:22 UTC ---
Using the ms_struct attribute instead of compiling with -mms-bitfields
reproduces the packing issue, while using the gcc_struct attribute prevents the
issue from showing up even under -mms-bitfields.
These struct examples show the packing issue without nested structs:
struct __attribute__((ms_struct, packed)) A {
int a;
short b;
};
struct __attribute__((ms_struct, packed)) B {
short a;
int b;
};
sizeof(struct A) == 6 as expected
sizeof(struct B) == 8 unexpected, expected 6 instead
offsetof(struct B, b) == 4 unexpected, expected 2 instead
A message [1] from the mingw-w64-public mailing list indicates this behaviour:
Only the outer struct is packed, causing padding bytes at its end to be removed
as expected, but not the fields: padding bytes in front of a field according to
the field's natural alignment are not removed, despite the packed attribute,
which is unexpected.
Explicitly packing the fields does not help:
struct __attribute__((ms_struct)) C {
int a __attribute__((packed, aligned(1)));
short b __attribute__((packed, aligned(1)));
};
struct __attribute__((ms_struct)) D {
short a __attribute__((packed, aligned(1)));
int b __attribute__((packed, aligned(1)));
};
sizeof(struct C) == 6 as expected
sizeof(struct D) == 8 unexpected, expected 6 instead
offsetof(struct D, b) == 4 unexpected, expected 2 instead
[1] http://sourceforge.net/mailarchive/message.php?msg_id=29650589
More information about the Gcc-bugs
mailing list