http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51568
Bug #: 51568 Summary: Enum value is not extracted properly via a union Classification: Unclassified Product: gcc Version: 4.3.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassig...@gcc.gnu.org ReportedBy: eug...@hutorny.in.ua Target: ARM Created attachment 26103 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=26103 Test example A wrong value is received when a value is assigned via union and read its member. Consider the following data structures: enum en { v0, v1, v2, v3, v4, v5, v6, v7 }; struct rec { unsigned short w; unsigned char c; enum en e; } __attribute__((__packed__)); union un { struct rec r; unsigned v; } __attribute__((__packed__)); void pass(unsigned v) { union un u; u.v = v; printf("r.w=%X r.c=%d r.e=%d\n", u.r.w, u.r.c, u.r.e ); } int main(int argc, char** argv) { union un u; u.r.c = '8'; u.r.e = v2; u.r.w = 0xC5FF; printf("r.w=%X r.c=%d r.e=%d\n", u.r.w, u.r.c, u.r.e ); pass(u.v); return 0; } Sample above compiled with gcc (Debian 4.3.2-1.1) 4.3.2 prints the following: r.w=C5FF r.c=56 r.e=2 r.w=C5FF r.c=56 r.e=34050 When compiled with arm-linux-gnueabi-gcc (Debian 4.3.2-1.1) 4.3.2 prints: r.w=C5FF r.c=56 r.e=2 r.w=C5FF r.c=56 r.e=50434