| /* This is a small test to see if bitfields are working. It is only a |
| few structs and a union and a test to see if they have the correct |
| size, if values can be read and written and a couple of argument |
| passing tests. No alignment testing is done. */ |
| |
| #include "defines.h" |
| #include "macros.h" |
| |
| |
| /* These five bitfields are taken from the System V ABI, Intel 386 |
| architecture supplement. */ |
| |
| /* Word aligned, sizeof is 4. */ |
| struct RightToLeft |
| { |
| int j:5; |
| int k:6; |
| int m:7; |
| }; |
| |
| /* Word aligned, sizeof is 12. */ |
| struct BoundaryAlignment |
| { |
| short s:9; |
| int j:9; |
| char c; |
| short t:9; |
| short u:9; |
| char d; |
| }; |
| |
| /* Halfword aligned, sizeof is 2. */ |
| struct StorageUnitSharing |
| { |
| char c; |
| short s:8; |
| }; |
| |
| /* Halfword aligned, sizeof is 2. */ |
| union Allocation |
| { |
| char c; |
| short s:8; |
| }; |
| |
| /* Byte aligned, sizeof is 9. */ |
| struct Unnamed |
| { |
| char c; |
| int :0; |
| char d; |
| short :9; |
| char e; |
| char :0; |
| }; |
| |
| /* Extra struct testing bitfields in larger types. |
| Doubleword aligned, sizeof is 8. */ |
| struct LargerTypes |
| { |
| long long l:33; |
| int i:31; |
| }; |
| |
| |
| void |
| passing1 (struct RightToLeft str, int j, int k, int m) |
| { |
| assert (str.j == j); |
| assert (str.k == k); |
| assert (str.m == m); |
| } |
| |
| void |
| passing2 (struct BoundaryAlignment str, short s, int j, char c, short t, |
| short u, char d) |
| { |
| assert (str.s == s); |
| assert (str.j == j); |
| assert (str.c == c); |
| assert (str.t == t); |
| assert (str.u == u); |
| assert (str.d == d); |
| } |
| |
| void |
| passing3 (struct StorageUnitSharing str, char c, short s) |
| { |
| assert (str.c == c); |
| assert (str.s == s); |
| } |
| |
| void |
| passing4 (struct Unnamed str, char c, char d, char e) |
| { |
| assert (str.c == c); |
| assert (str.d == d); |
| assert (str.e == e); |
| } |
| |
| void |
| passing5 (struct LargerTypes str, long long l, int i) |
| { |
| assert (str.l == l); |
| assert (str.i == i); |
| } |
| |
| |
| void |
| passingU (union Allocation u, char c) |
| { |
| assert (u.c == c); |
| assert (u.s == c); |
| } |
| |
| |
| int |
| main (void) |
| { |
| struct RightToLeft str1; |
| struct BoundaryAlignment str2; |
| struct StorageUnitSharing str3; |
| struct Unnamed str4; |
| struct LargerTypes str5; |
| union Allocation u; |
| |
| /* Check sizeof's. */ |
| check_size(str1, 4); |
| check_size(str2, 12); |
| check_size(str3, 2); |
| check_size(str4, 9); |
| check_size(str5, 8); |
| check_size(u, 2); |
| |
| /* Check alignof's. */ |
| check_align_lv(str1, 4); |
| check_align_lv(str2, 4); |
| check_align_lv(str3, 2); |
| check_align_lv(str4, 1); |
| check_align_lv(str5, 8); |
| check_align_lv(u, 2); |
| |
| /* Check passing. */ |
| str1.j = str2.s = str3.c = str4.c = str5.l = 4; |
| str1.k = str2.j = str3.s = str4.d = str5.i = 5; |
| str1.m = str2.c = str4.e = 6; |
| str2.t = 7; |
| str2.u = 8; |
| str2.d = 9; |
| passing1 (str1, 4, 5, 6); |
| passing2 (str2, 4, 5, 6, 7, 8, 9); |
| passing3 (str3, 4, 5); |
| passing4 (str4, 4, 5, 6); |
| passing5 (str5, 4, 5); |
| |
| u.c = 5; |
| passingU (u, 5); |
| u.s = 6; |
| passingU (u, 6); |
| |
| return 0; |
| } |