X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=support%2Fregression%2Ftests%2Fbitfields.c;h=2744094cfef929ddd857201abb14e2d8f1a374f5;hb=f3a44fc094dc5ce393e2029d3c7c6587a4b1a835;hp=4ed42e256a3b36e2f6e15c9bef874ed7a133e00b;hpb=53c9b327792b000f06d162ceb30460ca5fa76aab;p=fw%2Fsdcc diff --git a/support/regression/tests/bitfields.c b/support/regression/tests/bitfields.c index 4ed42e25..2744094c 100644 --- a/support/regression/tests/bitfields.c +++ b/support/regression/tests/bitfields.c @@ -1,5 +1,7 @@ /** Bitfield tests. + SDCC pic16 port currently does not support bitfields of size > 8, + so they are ifdefed out. */ #include @@ -8,6 +10,7 @@ struct { char c3_5 : 5; } c_bf; +#if !defined(SDCC_pic16) struct { int i0_7 : 7; int i7_9 : 9; @@ -19,7 +22,6 @@ struct { long l17_15 : 15; } l_bf; - struct { unsigned int b0 : 1; unsigned int b1 : 1; @@ -32,6 +34,7 @@ struct { unsigned int b8 : 1; unsigned int b9 : 1; } sb_bf; +#endif /* !SDCC_pic16 */ struct { unsigned int b0 : 1; @@ -56,6 +59,7 @@ struct { unsigned int b1 : 1; } size2a_bf; +#if !defined(SDCC_pic16) struct { unsigned int b0 : 1; unsigned int b1 : 1; @@ -85,6 +89,13 @@ struct { } size3a_bf; +struct { + signed int s0_7 : 7; + signed int s7_1 : 1; + signed int s8_9 : 9; +} s_bf; +#endif /* !SDCC_pic16 */ + void testBitfieldSizeof(void) { @@ -95,20 +106,13 @@ testBitfieldSizeof(void) ASSERT( sizeof(size1a_bf) >= 1); ASSERT( sizeof(size1b_bf) >= 1); ASSERT( sizeof(size1c_bf) >= 1); -#if !defined (__amd64__) - /* assertion fails on amd64 */ - ASSERT( sizeof(size2a_bf) >= 2); -#endif +#if !defined(SDCC_pic16) ASSERT( sizeof(size2b_bf) >= 2); ASSERT( sizeof(size2c_bf) >= 2); ASSERT( sizeof(size2d_bf) >= 2); ASSERT( sizeof(size3a_bf) >= 2); ASSERT( sizeof(size1a_bf) <= sizeof(size1b_bf)); -#if !defined (__amd64__) - /* assertion fails on amd64 */ - ASSERT( sizeof(size1a_bf) < sizeof(size2a_bf)); -#endif - +#endif /* !SDCC_pic16 */ /* Some SDCC specific assertions. SDCC uses 8 bit storage units. Bitfields that are less than 8 bits, but would (due to earlier bitfield declarations) span a storage unit boundary are @@ -121,10 +125,12 @@ testBitfieldSizeof(void) ASSERT( sizeof(size1b_bf) == 1); ASSERT( sizeof(size1c_bf) == 1); ASSERT( sizeof(size2a_bf) == 2); +#if !defined(SDCC_pic16) ASSERT( sizeof(size2b_bf) == 2); ASSERT( sizeof(size2c_bf) == 2); ASSERT( sizeof(size2d_bf) == 2); ASSERT( sizeof(size3a_bf) == 3); +#endif /* !SDCC_pic16 */ #endif } @@ -132,16 +138,17 @@ testBitfieldSizeof(void) void testBitfieldsSingleBitLiteral(void) { - size2b_bf.b0 = 0; - size2b_bf.b1 = 0; - size2b_bf.b2 = 0; - size2b_bf.b3 = 0; - size2b_bf.b4 = 0; - size2b_bf.b5 = 0; - size2b_bf.b6 = 0; - size2b_bf.b7 = 0; - size2b_bf.b8 = 0; - size2b_bf.b9 = 0; +#if !defined(SDCC_pic16) + size2b_bf.b0 = 0; + size2b_bf.b1 = 0; + size2b_bf.b2 = 0; + size2b_bf.b3 = 0; + size2b_bf.b4 = 0; + size2b_bf.b5 = 0; + size2b_bf.b6 = 0; + size2b_bf.b7 = 0; + size2b_bf.b8 = 0; + size2b_bf.b9 = 0; /* make sure modulo 2 truncation works */ size2b_bf.b0 = 0x3fe; @@ -179,24 +186,26 @@ testBitfieldsSingleBitLiteral(void) ASSERT(size2b_bf.b7==0); ASSERT(size2b_bf.b8==0); ASSERT(size2b_bf.b9==1); +#endif /* !SDCC_pic16 */ } void testBitfieldsSingleBit(void) { +#if !defined(SDCC_pic16) volatile unsigned char c; c = 0; - size2b_bf.b0 = c; - size2b_bf.b1 = c; - size2b_bf.b2 = c; - size2b_bf.b3 = c; - size2b_bf.b4 = c; - size2b_bf.b5 = c; - size2b_bf.b6 = c; - size2b_bf.b7 = c; - size2b_bf.b8 = c; - size2b_bf.b9 = c; + size2b_bf.b0 = c; + size2b_bf.b1 = c; + size2b_bf.b2 = c; + size2b_bf.b3 = c; + size2b_bf.b4 = c; + size2b_bf.b5 = c; + size2b_bf.b6 = c; + size2b_bf.b7 = c; + size2b_bf.b8 = c; + size2b_bf.b9 = c; /* make sure modulo 2 truncation works */ c = 0xfe; @@ -236,11 +245,13 @@ testBitfieldsSingleBit(void) ASSERT(size2b_bf.b7==0); ASSERT(size2b_bf.b8==0); ASSERT(size2b_bf.b9==1); +#endif /* !SDCC_pic16 */ } void testBitfieldsMultibitLiteral(void) { +#if !defined(SDCC_pic16) size2c_bf.b0 = 0xff; /* should truncate to 0x0f */ size2c_bf.b1 = 0; ASSERT(size2c_bf.b0==0x0f); @@ -251,6 +262,11 @@ testBitfieldsMultibitLiteral(void) ASSERT(size2c_bf.b0==0); ASSERT(size2c_bf.b1==0x1f); + size2c_bf.b0 = 0xff; /* should truncate to 0x0f */ + size2c_bf.b1 = 0xff; /* should truncate to 0x1f */ + ASSERT(size2c_bf.b0==0x0f); + ASSERT(size2c_bf.b1==0x1f); + size2d_bf.b0 = 0xffff; /* should truncate to 0x0fff */ size2d_bf.b1 = 0; ASSERT(size2d_bf.b0==0x0fff); @@ -261,6 +277,11 @@ testBitfieldsMultibitLiteral(void) ASSERT(size2d_bf.b0==0); ASSERT(size2d_bf.b1==0x07); + size2d_bf.b0 = 0xffff; /* should truncate to 0x0fff */ + size2d_bf.b1 = 0xffff; /* should truncate to 0x07 */ + ASSERT(size2d_bf.b0==0x0fff); + ASSERT(size2d_bf.b1==0x07); + size2d_bf.b0 = 0x0321; size2d_bf.b1 = 1; ASSERT(size2d_bf.b0==0x0321); @@ -270,15 +291,17 @@ testBitfieldsMultibitLiteral(void) size2d_bf.b1 = 5; ASSERT(size2d_bf.b0==0x0a46); ASSERT(size2d_bf.b1==5); +#endif /* !SDCC_pic16 */ } void testBitfieldsMultibit(void) { +#if !defined(SDCC_pic16) volatile int allones = 0xffff; volatile int zero = 0; volatile int x; - + size2c_bf.b0 = allones; /* should truncate to 0x0f */ size2c_bf.b1 = zero; ASSERT(size2c_bf.b0==0x0f); @@ -312,23 +335,96 @@ testBitfieldsMultibit(void) size2d_bf.b1 = x; ASSERT(size2d_bf.b0==0x0a46); ASSERT(size2d_bf.b1==5); +#endif /* !SDCC_pic16 */ } void testBitfields(void) { -#if 0 // not yet - c_bitfield.c0_3 = 2; - c_bitfield.c3_5 = 3; - ASSERT(*(char *)(&c_bitfield) == (2 + (3<<3)) ); + c_bf.c0_3 = 2; + c_bf.c3_5 = 3; +#if defined(PORT_HOST) && (defined(__ppc__) || defined(__PPC__)) + /* bitfields on powerpc architecture are allocated from left to right */ + ASSERT(*(char *)(&c_bf) == ((2<<(8-3)) + 3) ); +#else + ASSERT(*(char *)(&c_bf) == (2 + (3<<3)) ); +#endif - i_bitfield.i0_7 = 23; - i_bitfield.i7_9 = 234; - ASSERT(*(int *)(&i_bitfield) == (23 + (234<<7)) ); +#if 0 // not yet + i_bf.i0_7 = 23; + i_bf.i7_9 = 234; + ASSERT(*(int *)(&i_bf) == (23 + (234<<7)) ); l_bitfield.l0_7 = 23; l_bitfield.l7_10 = 234; l_bitfield.l17_15 = 2345; - ASSERT(*(long *)(&l_bitfield) == (23 + (234<<7) + (2345<<17)) ); + ASSERT(*(long *)(&l_bf) == (23 + (234<<7) + (2345<<17)) ); #endif } + +void +testSignedBitfields(void) +{ +#if !defined(SDCC_pic16) + s_bf.s0_7 = 0xf0; + s_bf.s7_1 = 1; + s_bf.s8_9 = 0xfff8; + ASSERT(s_bf.s0_7 == -16); + ASSERT(s_bf.s7_1 == - 1); + ASSERT(s_bf.s8_9 == - 8); + ASSERT(s_bf.s0_7 < 0); + ASSERT(s_bf.s7_1 < 0); + ASSERT(s_bf.s8_9 < 0); + + s_bf.s0_7 = 0x3f; + s_bf.s7_1 = 2; + s_bf.s8_9 = 0x00ff; + ASSERT(s_bf.s0_7 == 0x3f); + ASSERT(s_bf.s7_1 == 0); + ASSERT(s_bf.s8_9 == 0xff); + ASSERT(s_bf.s0_7 > 0); + ASSERT(s_bf.s8_9 > 0); +#endif /* !SDCC_pic16 */ +} + +/* test case for enhancement request #2291335 : Unnamed bit-field initialization */ + +struct s2291335_1 { + int a : 2; + char : 2; + int b : 2; +}; + +struct s2291335_2 { + int a : 2; + char : 0; + int b : 2; +}; + +struct s2291335_1 gs2291335_1 = {1, 2}; +struct s2291335_2 gs2291335_2 = {1, 2}; + +void +__test2291335(void) +{ + struct s2291335_1 ls2291335_1 = {1, 2}; + struct s2291335_2 ls2291335_2 = {1, 2}; + + ASSERT(gs2291335_1.a == 1); + ASSERT(gs2291335_1.b == 2); + ASSERT(gs2291335_2.a == 1); + ASSERT(gs2291335_2.b == 2); + + ASSERT(ls2291335_1.a == 1); + ASSERT(ls2291335_1.b == 2); + ASSERT(ls2291335_2.a == 1); + ASSERT(ls2291335_2.b == 2); +} + +/* test case for bug #2366757: segfault when initializing structure with bitfield */ + +struct +{ + char a : 1; + char b : 1; +} s2366757 = {0};