Unified · Split
| @@ -2959,15 +2959,17 @@ static int combine_types(CType *dest, SValue *op1, SValue *op2, int op) · 2958 unmodified lines | |||
| 2959 | if (bt2 == VT_LLONG) | 2959 | if (bt2 == VT_LLONG) |
| 2960 | type.t &= t2; | 2960 | type.t &= t2; |
| 2961 | /* convert to unsigned if it does not fit in a long long */ | 2961 | /* convert to unsigned if it does not fit in a long long */ |
| 2962 | if ((t1 & (VT_BTYPE | VT_UNSIGNED | VT_BITFIELD)) == (VT_LLONG | VT_UNSIGNED) || | 2962 | if ((t1 & (VT_BTYPE | VT_UNSIGNED)) == (VT_LLONG | VT_UNSIGNED) || |
| 2963 | (t2 & (VT_BTYPE | VT_UNSIGNED | VT_BITFIELD)) == (VT_LLONG | VT_UNSIGNED)) | 2963 | (t2 & (VT_BTYPE | VT_UNSIGNED)) == (VT_LLONG | VT_UNSIGNED)) |
| 2964 | type.t |= VT_UNSIGNED; | 2964 | type.t |= VT_UNSIGNED; |
| 2965 | } else { | 2965 | } else { |
| 2966 | int t1_bit = BIT_SIZE(t1) <= 31 ? VT_BITFIELD : 0; | ||
| 2967 | int t2_bit = BIT_SIZE(t2) <= 31 ? VT_BITFIELD : 0; | ||
| 2966 | /* integer operations */ | 2968 | /* integer operations */ |
| 2967 | type.t = VT_INT | (VT_LONG & (t1 | t2)); | 2969 | type.t = VT_INT | (VT_LONG & (t1 | t2)); |
| 2968 | /* convert to unsigned if it does not fit in an integer */ | 2970 | /* convert to unsigned if it does not fit in an integer */ |
| 2969 | if ((t1 & (VT_BTYPE | VT_UNSIGNED | VT_BITFIELD)) == (VT_INT | VT_UNSIGNED) || | 2971 | if ((t1 & (VT_BTYPE | VT_UNSIGNED | t1_bit)) == (VT_INT | VT_UNSIGNED) || |
| 2970 | (t2 & (VT_BTYPE | VT_UNSIGNED | VT_BITFIELD)) == (VT_INT | VT_UNSIGNED)) | 2972 | (t2 & (VT_BTYPE | VT_UNSIGNED | t2_bit)) == (VT_INT | VT_UNSIGNED)) |
| 2971 | type.t |= VT_UNSIGNED; | 2973 | type.t |= VT_UNSIGNED; |
| 2972 | } | 2974 | } |
| 2973 | if (dest) | 2975 | if (dest) |
| @@ -4554,6 +4556,7 @@ do_decl: · 1580 unmodified lines | |||
| 4554 | tcc_error("width of '%s' exceeds its type", | 4556 | tcc_error("width of '%s' exceeds its type", |
| 4555 | get_tok_str(v, NULL)); | 4557 | get_tok_str(v, NULL)); |
| 4556 | } else if (bit_size == bsize | 4558 | } else if (bit_size == bsize |
| 4559 | && !*tcc_state->pack_stack_ptr | ||
| 4557 | && !ad.a.packed && !ad1.a.packed) { | 4560 | && !ad.a.packed && !ad1.a.packed) { |
| 4558 | /* no need for bit fields */ | 4561 | /* no need for bit fields */ |
| 4559 | ; | 4562 | ; |
| @@ -6,66 +6,106 @@ int printf(const char*, ...); · 5 unmodified lines | |||
| 6 | int main (void) | 6 | int main (void) |
| 7 | { | 7 | { |
| 8 | struct { | 8 | struct { |
| 9 | unsigned ub:3; | 9 | unsigned u3:3; |
| 10 | unsigned u:32; | 10 | unsigned u31:31; |
| 11 | unsigned long long ullb:35; | 11 | unsigned u32:32; |
| 12 | unsigned long long ull:64; | 12 | unsigned long ul31:31; |
| 13 | unsigned long ul32:32; | ||
| 14 | unsigned long long ull31:31; | ||
| 15 | unsigned long long ull32:32; | ||
| 16 | unsigned long long ull33:33; | ||
| 17 | unsigned long long ull64:64; | ||
| 13 | unsigned char c; | 18 | unsigned char c; |
| 14 | } s = { 1, 1, 1 }; | 19 | } s = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; |
| 15 | 20 | ||
| 16 | promote(s.ub); | 21 | promote(s.u3); |
| 17 | promote(s.u); | 22 | promote(s.u31); |
| 18 | promote(s.ullb); | 23 | promote(s.u32); |
| 19 | promote(s.ull); | 24 | promote(s.ul31); |
| 25 | promote(s.ul32); | ||
| 26 | promote(s.ull31); | ||
| 27 | promote(s.ull32); | ||
| 28 | promote(s.ull33); | ||
| 29 | promote(s.ull64); | ||
| 20 | promote(s.c); | 30 | promote(s.c); |
| 21 | printf("\n"); | 31 | printf("\n"); |
| 22 | 32 | ||
| 23 | promote((1 ? s.ub : 1)); | 33 | promote((1 ? s.u3 : 1)); |
| 24 | promote((1 ? s.u : 1)); | 34 | promote((1 ? s.u31 : 1)); |
| 25 | promote((1 ? s.ullb : 1)); | 35 | promote((1 ? s.u32 : 1)); |
| 26 | promote((1 ? s.ull : 1)); | 36 | promote((1 ? s.ul31 : 1)); |
| 37 | promote((1 ? s.ul32 : 1)); | ||
| 38 | promote((1 ? s.ull31 : 1)); | ||
| 39 | promote((1 ? s.ull32 : 1)); | ||
| 40 | promote((1 ? s.ull33 : 1)); | ||
| 41 | promote((1 ? s.ull64 : 1)); | ||
| 27 | promote((1 ? s.c : 1)); | 42 | promote((1 ? s.c : 1)); |
| 28 | printf("\n"); | 43 | printf("\n"); |
| 29 | 44 | ||
| 30 | promote(s.ub << 1); | 45 | promote(s.u3 << 1); |
| 31 | promote(s.u << 1); | 46 | promote(s.u31 << 1); |
| 32 | promote(s.ullb << 1); | 47 | promote(s.u32 << 1); |
| 33 | promote(s.ull << 1); | 48 | promote(s.ul31 << 1); |
| 49 | promote(s.ul32 << 1); | ||
| 50 | promote(s.ull31 << 1); | ||
| 51 | promote(s.ull32 << 1); | ||
| 52 | promote(s.ull33 << 1); | ||
| 53 | promote(s.ull64 << 1); | ||
| 34 | promote(s.c << 1); | 54 | promote(s.c << 1); |
| 35 | printf("\n"); | 55 | printf("\n"); |
| 36 | 56 | ||
| 37 | promote(+s.ub); | 57 | promote(+s.u3); |
| 38 | promote(+s.u); | 58 | promote(+s.u31); |
| 39 | promote(+s.ullb); | 59 | promote(+s.u32); |
| 40 | promote(+s.ull); | 60 | promote(+s.ul31); |
| 61 | promote(+s.ul32); | ||
| 62 | promote(+s.ull31); | ||
| 63 | promote(+s.ull32); | ||
| 64 | promote(+s.ull33); | ||
| 65 | promote(+s.ull64); | ||
| 41 | promote(+s.c); | 66 | promote(+s.c); |
| 42 | printf("\n"); | 67 | printf("\n"); |
| 43 | 68 | ||
| 44 | promote(-s.ub); | 69 | promote(-s.u3); |
| 45 | promote(-s.u); | 70 | promote(-s.u31); |
| 46 | promote(-s.ullb); | 71 | promote(-s.u32); |
| 47 | promote(-s.ull); | 72 | promote(-s.ul31); |
| 73 | promote(-s.ul32); | ||
| 74 | promote(-s.ull31); | ||
| 75 | promote(-s.ull32); | ||
| 76 | promote(-s.ull33); | ||
| 77 | promote(-s.ull64); | ||
| 48 | promote(-s.c); | 78 | promote(-s.c); |
| 49 | printf("\n"); | 79 | printf("\n"); |
| 50 | 80 | ||
| 51 | promote(~s.ub); | 81 | promote(~s.u3); |
| 52 | promote(~s.u); | 82 | promote(~s.u31); |
| 53 | promote(~s.ullb); | 83 | promote(~s.u32); |
| 54 | promote(~s.ull); | 84 | promote(~s.ul31); |
| 85 | promote(~s.ul32); | ||
| 86 | promote(~s.ull31); | ||
| 87 | promote(~s.ull32); | ||
| 88 | promote(~s.ull33); | ||
| 89 | promote(~s.ull64); | ||
| 55 | promote(~s.c); | 90 | promote(~s.c); |
| 56 | printf("\n"); | 91 | printf("\n"); |
| 57 | 92 | ||
| 58 | promote(!s.ub); | 93 | promote(!s.u3); |
| 59 | promote(!s.u); | 94 | promote(!s.u31); |
| 60 | promote(!s.ullb); | 95 | promote(!s.u32); |
| 61 | promote(!s.ull); | 96 | promote(!s.ul31); |
| 97 | promote(!s.ul32); | ||
| 98 | promote(!s.ull31); | ||
| 99 | promote(!s.ull32); | ||
| 100 | promote(!s.ull33); | ||
| 101 | promote(!s.ull64); | ||
| 62 | promote(!s.c); | 102 | promote(!s.c); |
| 63 | printf("\n"); | 103 | printf("\n"); |
| 64 | 104 | ||
| 65 | promote(+(unsigned)s.ub); | 105 | promote(+(unsigned)s.u3); |
| 66 | promote(-(unsigned)s.ub); | 106 | promote(-(unsigned)s.u3); |
| 67 | promote(~(unsigned)s.ub); | 107 | promote(~(unsigned)s.u3); |
| 68 | promote(!(unsigned)s.ub); | 108 | promote(!(unsigned)s.u3); |
| 69 | 109 | ||
| 70 | return 0; | 110 | return 0; |
| 71 | } | 111 | } |
| @@ -1,46 +1,81 @@ | |||
| 1 | signed : s.ub | 1 | signed : s.u3 |
| 2 | unsigned : s.u | 2 | signed : s.u31 |
| 3 | signed : s.ullb | 3 | unsigned : s.u32 |
| 4 | unsigned : s.ull | 4 | signed : s.ul31 |
| 5 | unsigned : s.ul32 | ||
| 6 | signed : s.ull31 | ||
| 7 | unsigned : s.ull32 | ||
| 8 | unsigned : s.ull33 | ||
| 9 | unsigned : s.ull64 | ||
| 5 | signed : s.c | 10 | signed : s.c |
| 6 | 11 | ||
| 7 | signed : (1 ? s.ub : 1) | 12 | signed : (1 ? s.u3 : 1) |
| 8 | unsigned : (1 ? s.u : 1) | 13 | signed : (1 ? s.u31 : 1) |
| 9 | signed : (1 ? s.ullb : 1) | 14 | unsigned : (1 ? s.u32 : 1) |
| 10 | unsigned : (1 ? s.ull : 1) | 15 | signed : (1 ? s.ul31 : 1) |
| 16 | unsigned : (1 ? s.ul32 : 1) | ||
| 17 | signed : (1 ? s.ull31 : 1) | ||
| 18 | unsigned : (1 ? s.ull32 : 1) | ||
| 19 | unsigned : (1 ? s.ull33 : 1) | ||
| 20 | unsigned : (1 ? s.ull64 : 1) | ||
| 11 | signed : (1 ? s.c : 1) | 21 | signed : (1 ? s.c : 1) |
| 12 | 22 | ||
| 13 | signed : s.ub << 1 | 23 | signed : s.u3 << 1 |
| 14 | unsigned : s.u << 1 | 24 | signed : s.u31 << 1 |
| 15 | signed : s.ullb << 1 | 25 | unsigned : s.u32 << 1 |
| 16 | unsigned : s.ull << 1 | 26 | signed : s.ul31 << 1 |
| 27 | unsigned : s.ul32 << 1 | ||
| 28 | signed : s.ull31 << 1 | ||
| 29 | unsigned : s.ull32 << 1 | ||
| 30 | unsigned : s.ull33 << 1 | ||
| 31 | unsigned : s.ull64 << 1 | ||
| 17 | signed : s.c << 1 | 32 | signed : s.c << 1 |
| 18 | 33 | ||
| 19 | signed : +s.ub | 34 | signed : +s.u3 |
| 20 | unsigned : +s.u | 35 | signed : +s.u31 |
| 21 | signed : +s.ullb | 36 | unsigned : +s.u32 |
| 22 | unsigned : +s.ull | 37 | signed : +s.ul31 |
| 38 | unsigned : +s.ul32 | ||
| 39 | signed : +s.ull31 | ||
| 40 | unsigned : +s.ull32 | ||
| 41 | unsigned : +s.ull33 | ||
| 42 | unsigned : +s.ull64 | ||
| 23 | signed : +s.c | 43 | signed : +s.c |
| 24 | 44 | ||
| 25 | signed : -s.ub | 45 | signed : -s.u3 |
| 26 | unsigned : -s.u | 46 | signed : -s.u31 |
| 27 | signed : -s.ullb | 47 | unsigned : -s.u32 |
| 28 | unsigned : -s.ull | 48 | signed : -s.ul31 |
| 49 | unsigned : -s.ul32 | ||
| 50 | signed : -s.ull31 | ||
| 51 | unsigned : -s.ull32 | ||
| 52 | unsigned : -s.ull33 | ||
| 53 | unsigned : -s.ull64 | ||
| 29 | signed : -s.c | 54 | signed : -s.c |
| 30 | 55 | ||
| 31 | signed : ~s.ub | 56 | signed : ~s.u3 |
| 32 | unsigned : ~s.u | 57 | signed : ~s.u31 |
| 33 | signed : ~s.ullb | 58 | unsigned : ~s.u32 |
| 34 | unsigned : ~s.ull | 59 | signed : ~s.ul31 |
| 60 | unsigned : ~s.ul32 | ||
| 61 | signed : ~s.ull31 | ||
| 62 | unsigned : ~s.ull32 | ||
| 63 | unsigned : ~s.ull33 | ||
| 64 | unsigned : ~s.ull64 | ||
| 35 | signed : ~s.c | 65 | signed : ~s.c |
| 36 | 66 | ||
| 37 | signed : !s.ub | 67 | signed : !s.u3 |
| 38 | signed : !s.u | 68 | signed : !s.u31 |
| 39 | signed : !s.ullb | 69 | signed : !s.u32 |
| 40 | signed : !s.ull | 70 | signed : !s.ul31 |
| 71 | signed : !s.ul32 | ||
| 72 | signed : !s.ull31 | ||
| 73 | signed : !s.ull32 | ||
| 74 | signed : !s.ull33 | ||
| 75 | signed : !s.ull64 | ||
| 41 | signed : !s.c | 76 | signed : !s.c |
| 42 | 77 | ||
| 43 | unsigned : +(unsigned)s.ub | 78 | unsigned : +(unsigned)s.u3 |
| 44 | unsigned : -(unsigned)s.ub | 79 | unsigned : -(unsigned)s.u3 |
| 45 | unsigned : ~(unsigned)s.ub | 80 | unsigned : ~(unsigned)s.u3 |
| 46 | signed : !(unsigned)s.ub | 81 | signed : !(unsigned)s.u3 |