https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65892
Bug ID: 65892 Summary: gcc fails to implement N685 aliasing of union members Product: gcc Version: 5.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: msebor at gcc dot gnu.org Target Milestone: --- As the following program derived from the snippet in WG14 paper N685 (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n685.htm) shows, GCC fails to take into account the C99 and C11 permission for struct members of unions that declare initial members of compatible types to alias one another. $ cat n685.c && /build/gcc-65479/gcc/xgcc -B/build/gcc-65479/gcc -O2 -fstrict-aliasing n685.c && ./a.out #include <assert.h> union U { struct t1 { int m; } s1; struct t2 { int m; } s2; }; int f (struct t1 *p1, struct t2 *p2) { // union U visible here, p1->m and p2->m may alias if (p1->m < 0) p2->m = -p2->m; return p1->m; } int main (void) { union U u = { .s1 = { -1 } }; int n = f (&u.s1, &u.s2); assert (1 == n); return 0; } a.out: n685.c:21: main: Assertion `1 == n' failed. Aborted (core dumped)