History

Make signed/unsigned bitfields the same as gcc/clang

herman ten brugge committed 1 year ago

Commit 8845b6c1 parent 199e1353 files · +151 −73Browse files

Unified · Split

3 files
  1. tccgen.c +7 −4
  2. tests/tests2/93_integer_promotion.c +77 −37
  3. tests/tests2/93_integer_promotion.expect +67 −32
tccgen.c+7−4
@@ -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 == bsize4558 } 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 ;
tests/tests2/93_integer_promotion.c+77−37
@@ -6,66 +6,106 @@ int printf(const char*, ...); · 5 unmodified lines
6int main (void)6int 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}
tests/tests2/93_integer_promotion.expect+67−32
@@ -1,46 +1,81 @@
1 signed : s.ub1 signed : s.u3
2 unsigned : s.u2 signed : s.u31
3 signed : s.ullb3 unsigned : s.u32
4 unsigned : s.ull4 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.c10 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 << 123 signed : s.u3 << 1
14 unsigned : s.u << 124 signed : s.u31 << 1
15 signed : s.ullb << 125 unsigned : s.u32 << 1
16 unsigned : s.ull << 126 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 << 132 signed : s.c << 1
18 33
19 signed : +s.ub34 signed : +s.u3
20 unsigned : +s.u35 signed : +s.u31
21 signed : +s.ullb36 unsigned : +s.u32
22 unsigned : +s.ull37 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.c43 signed : +s.c
24 44
25 signed : -s.ub45 signed : -s.u3
26 unsigned : -s.u46 signed : -s.u31
27 signed : -s.ullb47 unsigned : -s.u32
28 unsigned : -s.ull48 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.c54 signed : -s.c
30 55
31 signed : ~s.ub56 signed : ~s.u3
32 unsigned : ~s.u57 signed : ~s.u31
33 signed : ~s.ullb58 unsigned : ~s.u32
34 unsigned : ~s.ull59 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.c65 signed : ~s.c
36 66
37 signed : !s.ub67 signed : !s.u3
38 signed : !s.u68 signed : !s.u31
39 signed : !s.ullb69 signed : !s.u32
40 signed : !s.ull70 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.c76 signed : !s.c
42 77
43 unsigned : +(unsigned)s.ub78 unsigned : +(unsigned)s.u3
44 unsigned : -(unsigned)s.ub79 unsigned : -(unsigned)s.u3
45 unsigned : ~(unsigned)s.ub80 unsigned : ~(unsigned)s.u3
46 signed : !(unsigned)s.ub81 signed : !(unsigned)s.u3

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t