This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c/65892] New: gcc fails to implement N685 aliasing of union members


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)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]