diff --git a/tccgen.c b/tccgen.c index cd236fda..d0448ce9 100644 --- a/tccgen.c +++ b/tccgen.c @@ -2093,7 +2093,7 @@ static int adjust_bf(SValue *sv, int bit_pos, int bit_size) return 0; t = sv->type.ref->auxtype; if (t != -1 && t != VT_STRUCT) { - sv->type.t = (sv->type.t & ~VT_BTYPE) | t; + sv->type.t = (sv->type.t & ~(VT_BTYPE | VT_LONG)) | t; sv->r |= VT_LVAL; } return t; diff --git a/tests/tests2/95_bitfields.c b/tests/tests2/95_bitfields.c index f025c575..0702b2e1 100644 --- a/tests/tests2/95_bitfields.c +++ b/tests/tests2/95_bitfields.c @@ -77,6 +77,22 @@ TEST_STRUCT(1,2,3,4,-3); } +/* ----------------------------------------------------------------------- */ +#elif TEST == 7 +{ + struct M P __s { + long int d : 16; + long int b : 16; + long int x : 16; + long int y : 1; + long int z : 2; + long int a : 11; + long int e : 1; + long int f : 1; + }; + TEST_STRUCT(1,2,3,4,5); +} + /* ----------------------------------------------------------------------- */ #elif defined PACK @@ -101,6 +117,8 @@ top = 0; #include SELF #define TEST 6 #include SELF +#define TEST 7 +#include SELF #if PACK # pragma pack(pop) diff --git a/tests/tests2/95_bitfields.expect b/tests/tests2/95_bitfields.expect index 6a8fd9ab..215055d3 100644 --- a/tests/tests2/95_bitfields.expect +++ b/tests/tests2/95_bitfields.expect @@ -34,6 +34,12 @@ bits as set : 00000030002001FD00000004 values : 01 02 03 04 fffffffd align/size : 4 12 +---- TEST 7 ---- +bits in use : 3FFFFFFFFFFF0000 +bits as set : 0026000100050000 +values : 01 00 ffffffff 04 05 +align/size : 8 8 + ---- TEST 1 - PACKED ---- @@ -72,6 +78,12 @@ bits as set : 0030002001FD00000004 values : 01 02 03 04 fffffffd align/size : 1 10 +---- TEST 7 - PACKED ---- +bits in use : 3FFFFFFFFFFF0000 +bits as set : 0026000100050000 +values : 01 00 ffffffff 04 05 +align/size : 1 8 + ---- TEST 1 - WITH ALIGN ---- @@ -110,6 +122,12 @@ bits as set : 00000030002001FD00000004 values : 01 02 03 04 fffffffd align/size : 4 12 +---- TEST 7 - WITH ALIGN ---- +bits in use : 3FFFFFFFFFFF0000 +bits as set : 0026000100050000 +values : 01 00 ffffffff 04 05 +align/size : 8 8 + ---- TEST 1 - PACKED - WITH ALIGN ---- @@ -147,3 +165,9 @@ bits in use : 007000FFFFFFFFFFFFFF bits as set : 0030002001FD00000004 values : 01 02 03 04 fffffffd align/size : 1 10 + +---- TEST 7 - PACKED - WITH ALIGN ---- +bits in use : 3FFFFFFFFFFF0000 +bits as set : 0026000100050000 +values : 01 00 ffffffff 04 05 +align/size : 1 8 diff --git a/tests/tests2/95_bitfields_ms.expect b/tests/tests2/95_bitfields_ms.expect index 8ccafb78..97c46be5 100644 --- a/tests/tests2/95_bitfields_ms.expect +++ b/tests/tests2/95_bitfields_ms.expect @@ -34,6 +34,12 @@ bits as set : 000000000000003000002001000000FD00000004 values : 01 02 03 04 fffffffd align/size : 4 20 +---- TEST 7 - MS-BITFIELDS ---- +bits in use : 3FFFFFFFFFFF0000 +bits as set : 0026000100050000 +values : 0000000000000001 0000000000000000 ffffffffffffffff 0000000000000004 0000000000000005 +align/size : 8 8 + ---- TEST 1 - MS-BITFIELDS - PACKED ---- @@ -72,6 +78,12 @@ bits as set : 000000003000002001FD00000004 values : 01 02 03 04 fffffffd align/size : 1 14 +---- TEST 7 - MS-BITFIELDS - PACKED ---- +bits in use : 3FFFFFFFFFFF0000 +bits as set : 0026000100050000 +values : 0000000000000001 0000000000000000 ffffffffffffffff 0000000000000004 0000000000000005 +align/size : 1 8 + ---- TEST 1 - MS-BITFIELDS - WITH ALIGN ---- @@ -110,6 +122,12 @@ bits as set : 000000000000003000002001000000FD00000004 values : 01 02 03 04 fffffffd align/size : 4 20 +---- TEST 7 - MS-BITFIELDS - WITH ALIGN ---- +bits in use : 3FFFFFFFFFFF0000 +bits as set : 0026000100050000 +values : 0000000000000001 0000000000000000 ffffffffffffffff 0000000000000004 0000000000000005 +align/size : 8 8 + ---- TEST 1 - MS-BITFIELDS - PACKED - WITH ALIGN ---- @@ -147,3 +165,9 @@ bits in use : 00000000700000FFFFFFFFFFFFFF bits as set : 000000003000002001FD00000004 values : 01 02 03 04 fffffffd align/size : 1 14 + +---- TEST 7 - MS-BITFIELDS - PACKED - WITH ALIGN ---- +bits in use : 3FFFFFFFFFFF0000 +bits as set : 0026000100050000 +values : 0000000000000001 0000000000000000 ffffffffffffffff 0000000000000004 0000000000000005 +align/size : 1 8