Um bug na implementação do GCC de campos de bits

Trabalhando em C11, a seguinte estrutura:

struct S {
  unsigned a : 4;
  _Bool    b : 1;
};

É apresentado pelo GCC como umunsigned (4 bytes) dos quais 4 bits são usados, seguido por um_Bool (4 bytes) dos quais 1 bit é usado, para um tamanho total de 8 bytes.

Note que C99 e C11 permitem especificamente_Bool como um membro de campo de bits. O padrão C11 (e provavelmente o C99 também) também afirma em §6.7.2.1 'Especificadores de estrutura e união' ¶11 que:

Uma implementação pode alocar qualquer unidade de armazenamento endereçável grande o suficiente para manter um campo de bits. Se houver espaço suficiente, um campo de bits que segue imediatamente outro campo de bits em uma estrutura deve ser empacotado em bits adjacentes da mesma unidade.

Então eu acredito que o membrob acima deveria ter sido embalado na unidade de armazenamento alocada para o membroa, resultando em uma estrutura de tamanho total de 4 bytes.

O GCC se comporta corretamente e a embalagem ocorre ao usar os mesmos tipos para os dois membros, ou quando um éunsigned e o outrosigned, mas os tiposunsigned e_Bool parecem ser considerados muito distintos pelo GCC para lidar com eles corretamente.

Alguém pode confirmar minha interpretação do padrão e que isso é de fato um bug do GCC?

Eu também estou interessado em uma solução alternativa (algum switch de compilador, pragma,__attribute__...)

Estou usando o gcc 4.7.0 com-std=c11 (embora outras configurações mostrem o mesmo comportamento).

questionAnswers(2)

yourAnswerToTheQuestion