This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c/65892] New: gcc fails to implement N685 aliasing of union members
- From: "msebor at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Sat, 25 Apr 2015 23:58:55 +0000
- Subject: [Bug c/65892] New: gcc fails to implement N685 aliasing of union members
- Auto-submitted: auto-generated
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)