In the following testcase:

#include <new>
#include <stdlib.h>
#include <stdio.h>

class c1
{
  public:
    char m1 : 17;
    //char m2;
};

void printbytes(void * p, int size)
{
  printf("Printing an object on %i bytes\n",size);
  for (int i=0; i<size; i++)
  printf("Byte %i is %i\n",i, ((char*)p)[i]);
  printf("Finish printing\n%d\n", __alignof__(c1));
}

int
main (int argc, char **argv) {
  c1 * obj =  new c1;
  printf("Here\n");
  obj->m1 = 1;
  //obj->m2 = 1;
  printbytes(obj,sizeof(c1));
}

The output is:
Here
Printing an object on 4 bytes
Byte 0 is 1
Byte 1 is 0
Byte 2 is 0
Byte 3 is 0
Finish printing
2

The alignment is 2 bytes, however, according to the ABI the alignment of this
non-POD type should be 1. But, in reality the alignment is 1 because when I add
another char member m2, the output is:

Here
Printing an object on 4 bytes
Byte 0 is 1
Byte 1 is 0
Byte 2 is 0
Byte 3 is 1
Finish printing
2


-- 
           Summary: Wrong alignment of struct members where one member is
                    bitfield exceeding its type.
           Product: gcc
           Version: 4.1.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: cjain at ca dot ibm dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32210

Reply via email to