https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88739
rsandifo at gcc dot gnu.org <rsandifo at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |rsandifo at gcc dot gnu.org --- Comment #35 from rsandifo at gcc dot gnu.org <rsandifo at gcc dot gnu.org> --- Yeah, the expr.c patch makes the original testcase work, but we still fail for: #include<stdio.h> typedef unsigned int U32; typedef unsigned short U16; typedef unsigned char U8; typedef struct MEM_HEAD_4DW { /* first word */ U32 b11 : 1; U32 b12 : 3; U32 b13 : 3; U32 b14 : 1; U32 b15 : 16; U32 b16 : 8; /* second word */ U32 b21 : 16; U32 b22 : 1; U32 b23 : 4; U32 b24 : 11; /* third word */ U32 b31 : 32; /* fourth word */ U32 b30AddrL : 30; U32 b2AddrType : 2; }MEM_REQ_HEAD_4DW; typedef union HEAD_DW4_UNION { MEM_REQ_HEAD_4DW strMemHead; U32 aulValue[4]; U16 ausValue[8]; U8 aucValue[16]; }HEAD_REQ_DW4_UNION; U32 Test_func(U32 ulAddr) { HEAD_REQ_DW4_UNION unData; unData.strMemHead.b30AddrL = ulAddr >> 2; unData.strMemHead.b2AddrType = 0; printf("unData.ausValue[6]=0x%x\r\n",unData.ausValue[6]); // why get 0x0 instead of 0x1 ? return 0; } int main() { Test_func(0x10224); return 0; } Like Wilco says, the torture test seems to pass with an unpatched compiler (but seems like a good thing to have anyway).