mirror of
git://repo.or.cz/tinycc.git
synced 2026-07-04 02:18:50 +08:00
Make signed/unsigned bitfields the same as gcc/clang
This commit is contained in:
parent
199e135142
commit
8845b6cd45
11
tccgen.c
11
tccgen.c
@ -2959,15 +2959,17 @@ static int combine_types(CType *dest, SValue *op1, SValue *op2, int op)
|
|||||||
if (bt2 == VT_LLONG)
|
if (bt2 == VT_LLONG)
|
||||||
type.t &= t2;
|
type.t &= t2;
|
||||||
/* convert to unsigned if it does not fit in a long long */
|
/* convert to unsigned if it does not fit in a long long */
|
||||||
if ((t1 & (VT_BTYPE | VT_UNSIGNED | VT_BITFIELD)) == (VT_LLONG | VT_UNSIGNED) ||
|
if ((t1 & (VT_BTYPE | VT_UNSIGNED)) == (VT_LLONG | VT_UNSIGNED) ||
|
||||||
(t2 & (VT_BTYPE | VT_UNSIGNED | VT_BITFIELD)) == (VT_LLONG | VT_UNSIGNED))
|
(t2 & (VT_BTYPE | VT_UNSIGNED)) == (VT_LLONG | VT_UNSIGNED))
|
||||||
type.t |= VT_UNSIGNED;
|
type.t |= VT_UNSIGNED;
|
||||||
} else {
|
} else {
|
||||||
|
int t1_bit = BIT_SIZE(t1) <= 31 ? VT_BITFIELD : 0;
|
||||||
|
int t2_bit = BIT_SIZE(t2) <= 31 ? VT_BITFIELD : 0;
|
||||||
/* integer operations */
|
/* integer operations */
|
||||||
type.t = VT_INT | (VT_LONG & (t1 | t2));
|
type.t = VT_INT | (VT_LONG & (t1 | t2));
|
||||||
/* convert to unsigned if it does not fit in an integer */
|
/* convert to unsigned if it does not fit in an integer */
|
||||||
if ((t1 & (VT_BTYPE | VT_UNSIGNED | VT_BITFIELD)) == (VT_INT | VT_UNSIGNED) ||
|
if ((t1 & (VT_BTYPE | VT_UNSIGNED | t1_bit)) == (VT_INT | VT_UNSIGNED) ||
|
||||||
(t2 & (VT_BTYPE | VT_UNSIGNED | VT_BITFIELD)) == (VT_INT | VT_UNSIGNED))
|
(t2 & (VT_BTYPE | VT_UNSIGNED | t2_bit)) == (VT_INT | VT_UNSIGNED))
|
||||||
type.t |= VT_UNSIGNED;
|
type.t |= VT_UNSIGNED;
|
||||||
}
|
}
|
||||||
if (dest)
|
if (dest)
|
||||||
@ -4554,6 +4556,7 @@ do_decl:
|
|||||||
tcc_error("width of '%s' exceeds its type",
|
tcc_error("width of '%s' exceeds its type",
|
||||||
get_tok_str(v, NULL));
|
get_tok_str(v, NULL));
|
||||||
} else if (bit_size == bsize
|
} else if (bit_size == bsize
|
||||||
|
&& !*tcc_state->pack_stack_ptr
|
||||||
&& !ad.a.packed && !ad1.a.packed) {
|
&& !ad.a.packed && !ad1.a.packed) {
|
||||||
/* no need for bit fields */
|
/* no need for bit fields */
|
||||||
;
|
;
|
||||||
|
|||||||
@ -6,66 +6,106 @@ int printf(const char*, ...);
|
|||||||
int main (void)
|
int main (void)
|
||||||
{
|
{
|
||||||
struct {
|
struct {
|
||||||
unsigned ub:3;
|
unsigned u3:3;
|
||||||
unsigned u:32;
|
unsigned u31:31;
|
||||||
unsigned long long ullb:35;
|
unsigned u32:32;
|
||||||
unsigned long long ull:64;
|
unsigned long ul31:31;
|
||||||
|
unsigned long ul32:32;
|
||||||
|
unsigned long long ull31:31;
|
||||||
|
unsigned long long ull32:32;
|
||||||
|
unsigned long long ull33:33;
|
||||||
|
unsigned long long ull64:64;
|
||||||
unsigned char c;
|
unsigned char c;
|
||||||
} s = { 1, 1, 1 };
|
} s = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
|
||||||
|
|
||||||
promote(s.ub);
|
promote(s.u3);
|
||||||
promote(s.u);
|
promote(s.u31);
|
||||||
promote(s.ullb);
|
promote(s.u32);
|
||||||
promote(s.ull);
|
promote(s.ul31);
|
||||||
|
promote(s.ul32);
|
||||||
|
promote(s.ull31);
|
||||||
|
promote(s.ull32);
|
||||||
|
promote(s.ull33);
|
||||||
|
promote(s.ull64);
|
||||||
promote(s.c);
|
promote(s.c);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
promote((1 ? s.ub : 1));
|
promote((1 ? s.u3 : 1));
|
||||||
promote((1 ? s.u : 1));
|
promote((1 ? s.u31 : 1));
|
||||||
promote((1 ? s.ullb : 1));
|
promote((1 ? s.u32 : 1));
|
||||||
promote((1 ? s.ull : 1));
|
promote((1 ? s.ul31 : 1));
|
||||||
|
promote((1 ? s.ul32 : 1));
|
||||||
|
promote((1 ? s.ull31 : 1));
|
||||||
|
promote((1 ? s.ull32 : 1));
|
||||||
|
promote((1 ? s.ull33 : 1));
|
||||||
|
promote((1 ? s.ull64 : 1));
|
||||||
promote((1 ? s.c : 1));
|
promote((1 ? s.c : 1));
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
promote(s.ub << 1);
|
promote(s.u3 << 1);
|
||||||
promote(s.u << 1);
|
promote(s.u31 << 1);
|
||||||
promote(s.ullb << 1);
|
promote(s.u32 << 1);
|
||||||
promote(s.ull << 1);
|
promote(s.ul31 << 1);
|
||||||
|
promote(s.ul32 << 1);
|
||||||
|
promote(s.ull31 << 1);
|
||||||
|
promote(s.ull32 << 1);
|
||||||
|
promote(s.ull33 << 1);
|
||||||
|
promote(s.ull64 << 1);
|
||||||
promote(s.c << 1);
|
promote(s.c << 1);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
promote(+s.ub);
|
promote(+s.u3);
|
||||||
promote(+s.u);
|
promote(+s.u31);
|
||||||
promote(+s.ullb);
|
promote(+s.u32);
|
||||||
promote(+s.ull);
|
promote(+s.ul31);
|
||||||
|
promote(+s.ul32);
|
||||||
|
promote(+s.ull31);
|
||||||
|
promote(+s.ull32);
|
||||||
|
promote(+s.ull33);
|
||||||
|
promote(+s.ull64);
|
||||||
promote(+s.c);
|
promote(+s.c);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
promote(-s.ub);
|
promote(-s.u3);
|
||||||
promote(-s.u);
|
promote(-s.u31);
|
||||||
promote(-s.ullb);
|
promote(-s.u32);
|
||||||
promote(-s.ull);
|
promote(-s.ul31);
|
||||||
|
promote(-s.ul32);
|
||||||
|
promote(-s.ull31);
|
||||||
|
promote(-s.ull32);
|
||||||
|
promote(-s.ull33);
|
||||||
|
promote(-s.ull64);
|
||||||
promote(-s.c);
|
promote(-s.c);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
promote(~s.ub);
|
promote(~s.u3);
|
||||||
promote(~s.u);
|
promote(~s.u31);
|
||||||
promote(~s.ullb);
|
promote(~s.u32);
|
||||||
promote(~s.ull);
|
promote(~s.ul31);
|
||||||
|
promote(~s.ul32);
|
||||||
|
promote(~s.ull31);
|
||||||
|
promote(~s.ull32);
|
||||||
|
promote(~s.ull33);
|
||||||
|
promote(~s.ull64);
|
||||||
promote(~s.c);
|
promote(~s.c);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
promote(!s.ub);
|
promote(!s.u3);
|
||||||
promote(!s.u);
|
promote(!s.u31);
|
||||||
promote(!s.ullb);
|
promote(!s.u32);
|
||||||
promote(!s.ull);
|
promote(!s.ul31);
|
||||||
|
promote(!s.ul32);
|
||||||
|
promote(!s.ull31);
|
||||||
|
promote(!s.ull32);
|
||||||
|
promote(!s.ull33);
|
||||||
|
promote(!s.ull64);
|
||||||
promote(!s.c);
|
promote(!s.c);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
promote(+(unsigned)s.ub);
|
promote(+(unsigned)s.u3);
|
||||||
promote(-(unsigned)s.ub);
|
promote(-(unsigned)s.u3);
|
||||||
promote(~(unsigned)s.ub);
|
promote(~(unsigned)s.u3);
|
||||||
promote(!(unsigned)s.ub);
|
promote(!(unsigned)s.u3);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,46 +1,81 @@
|
|||||||
signed : s.ub
|
signed : s.u3
|
||||||
unsigned : s.u
|
signed : s.u31
|
||||||
signed : s.ullb
|
unsigned : s.u32
|
||||||
unsigned : s.ull
|
signed : s.ul31
|
||||||
|
unsigned : s.ul32
|
||||||
|
signed : s.ull31
|
||||||
|
unsigned : s.ull32
|
||||||
|
unsigned : s.ull33
|
||||||
|
unsigned : s.ull64
|
||||||
signed : s.c
|
signed : s.c
|
||||||
|
|
||||||
signed : (1 ? s.ub : 1)
|
signed : (1 ? s.u3 : 1)
|
||||||
unsigned : (1 ? s.u : 1)
|
signed : (1 ? s.u31 : 1)
|
||||||
signed : (1 ? s.ullb : 1)
|
unsigned : (1 ? s.u32 : 1)
|
||||||
unsigned : (1 ? s.ull : 1)
|
signed : (1 ? s.ul31 : 1)
|
||||||
|
unsigned : (1 ? s.ul32 : 1)
|
||||||
|
signed : (1 ? s.ull31 : 1)
|
||||||
|
unsigned : (1 ? s.ull32 : 1)
|
||||||
|
unsigned : (1 ? s.ull33 : 1)
|
||||||
|
unsigned : (1 ? s.ull64 : 1)
|
||||||
signed : (1 ? s.c : 1)
|
signed : (1 ? s.c : 1)
|
||||||
|
|
||||||
signed : s.ub << 1
|
signed : s.u3 << 1
|
||||||
unsigned : s.u << 1
|
signed : s.u31 << 1
|
||||||
signed : s.ullb << 1
|
unsigned : s.u32 << 1
|
||||||
unsigned : s.ull << 1
|
signed : s.ul31 << 1
|
||||||
|
unsigned : s.ul32 << 1
|
||||||
|
signed : s.ull31 << 1
|
||||||
|
unsigned : s.ull32 << 1
|
||||||
|
unsigned : s.ull33 << 1
|
||||||
|
unsigned : s.ull64 << 1
|
||||||
signed : s.c << 1
|
signed : s.c << 1
|
||||||
|
|
||||||
signed : +s.ub
|
signed : +s.u3
|
||||||
unsigned : +s.u
|
signed : +s.u31
|
||||||
signed : +s.ullb
|
unsigned : +s.u32
|
||||||
unsigned : +s.ull
|
signed : +s.ul31
|
||||||
|
unsigned : +s.ul32
|
||||||
|
signed : +s.ull31
|
||||||
|
unsigned : +s.ull32
|
||||||
|
unsigned : +s.ull33
|
||||||
|
unsigned : +s.ull64
|
||||||
signed : +s.c
|
signed : +s.c
|
||||||
|
|
||||||
signed : -s.ub
|
signed : -s.u3
|
||||||
unsigned : -s.u
|
signed : -s.u31
|
||||||
signed : -s.ullb
|
unsigned : -s.u32
|
||||||
unsigned : -s.ull
|
signed : -s.ul31
|
||||||
|
unsigned : -s.ul32
|
||||||
|
signed : -s.ull31
|
||||||
|
unsigned : -s.ull32
|
||||||
|
unsigned : -s.ull33
|
||||||
|
unsigned : -s.ull64
|
||||||
signed : -s.c
|
signed : -s.c
|
||||||
|
|
||||||
signed : ~s.ub
|
signed : ~s.u3
|
||||||
unsigned : ~s.u
|
signed : ~s.u31
|
||||||
signed : ~s.ullb
|
unsigned : ~s.u32
|
||||||
unsigned : ~s.ull
|
signed : ~s.ul31
|
||||||
|
unsigned : ~s.ul32
|
||||||
|
signed : ~s.ull31
|
||||||
|
unsigned : ~s.ull32
|
||||||
|
unsigned : ~s.ull33
|
||||||
|
unsigned : ~s.ull64
|
||||||
signed : ~s.c
|
signed : ~s.c
|
||||||
|
|
||||||
signed : !s.ub
|
signed : !s.u3
|
||||||
signed : !s.u
|
signed : !s.u31
|
||||||
signed : !s.ullb
|
signed : !s.u32
|
||||||
signed : !s.ull
|
signed : !s.ul31
|
||||||
|
signed : !s.ul32
|
||||||
|
signed : !s.ull31
|
||||||
|
signed : !s.ull32
|
||||||
|
signed : !s.ull33
|
||||||
|
signed : !s.ull64
|
||||||
signed : !s.c
|
signed : !s.c
|
||||||
|
|
||||||
unsigned : +(unsigned)s.ub
|
unsigned : +(unsigned)s.u3
|
||||||
unsigned : -(unsigned)s.ub
|
unsigned : -(unsigned)s.u3
|
||||||
unsigned : ~(unsigned)s.ub
|
unsigned : ~(unsigned)s.u3
|
||||||
signed : !(unsigned)s.ub
|
signed : !(unsigned)s.u3
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user