Un error en la implementación de GCC de campos de bits

Trabajando en C11, la siguiente estructura:

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

Se pone a disposición por GCC como unaunsigned (4 bytes) de los cuales se utilizan 4 bits, seguidos de un_Bool (4 bytes) de los cuales se usa 1 bit, para un tamaño total de 8 bytes.

Tenga en cuenta que C99 y C11 permiten específicamente_Bool como un miembro de campo de bits. El estándar C11 (y probablemente también C99) también establece bajo §6.7.2.1 'Especificadores de estructura y unión' ¶11 que:

Una implementación puede asignar cualquier unidad de almacenamiento direccionable lo suficientemente grande como para contener un campo de bits. Si queda suficiente espacio, un campo de bits que sigue inmediatamente a otro campo de bits en una estructura se empaquetará en bits adyacentes de la misma unidad.

Así que creo que el miembrob arriba debe haber sido empaquetado en la unidad de almacenamiento asignada para el miembroa, resultando en una estructura de tamaño total de 4 bytes.

GCC se comporta correctamente y el empaquetado ocurre cuando se usan los mismos tipos para los dos miembros, o cuando uno estáunsigned y el otrosigned, pero los tiposunsigned y_Bool Parece que GCC lo considera demasiado distinto para que pueda manejarlos correctamente.

¿Alguien puede confirmar mi interpretación del estándar y que esto es realmente un error de GCC?

También estoy interesado en una solución (algún compilador, pragma,__attribute__...).

Estoy usando gcc 4.7.0 con-std=c11 (aunque otras configuraciones muestran el mismo comportamiento.)

Respuestas a la pregunta(2)

Su respuesta a la pregunta