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/51568] New: Enum value is not extracted properly via a union


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: unassigned@gcc.gnu.org
        ReportedBy: eugene@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


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