| #include <stdlib.h> |
| |
| #define ATTR __attribute__((__ms_struct__)) |
| |
| // GCC only implements #pragma ms_struct on Darwin. |
| #define HAVE_PRAGMA_MS_STRUCT (defined(__clang__) || defined(__MACH__)) |
| |
| struct { |
| unsigned int bf_1 : 12; |
| unsigned int : 0; |
| unsigned int bf_2 : 12; |
| } ATTR t1 = {1,2}; |
| static int a1[(sizeof(t1) == 8) -1]; |
| |
| struct |
| { |
| char foo : 4; |
| short : 0; |
| char bar; |
| } ATTR t2 = {3,4}; |
| static int a2[(sizeof(t2) == 4) -1]; |
| |
| #if HAVE_PRAGMA_MS_STRUCT |
| #pragma ms_struct on |
| struct |
| { |
| char foo : 4; |
| short : 0; |
| char bar; |
| } t3 = {5,6}; |
| #pragma ms_struct off |
| static int a3[(sizeof(t3) == 4) -1]; |
| #endif |
| |
| struct |
| { |
| char foo : 6; |
| int : 0; |
| } ATTR t4; |
| static int a4[(sizeof(t4) == 4) -1]; |
| |
| struct |
| { |
| char foo : 4; |
| short : 0; |
| char bar : 8; |
| } ATTR t5 = {7,8}; |
| static int a5[(sizeof(t5) == 4) -1]; |
| |
| struct |
| { |
| char foo : 4; |
| short : 0; |
| long :0; |
| char bar; |
| } ATTR t6 = {5, 10}; |
| static int a6[(sizeof(t6) == 4) -1]; |
| |
| struct |
| { |
| char foo : 4; |
| int :0; |
| short : 0; |
| char bar; |
| } ATTR t7 = {5, 10}; |
| static int a7[(sizeof(t7) == 8) -1]; |
| |
| struct |
| { |
| char foo : 4; |
| short : 0; |
| int :0; |
| char bar:7; |
| } ATTR t8 = {5, 10}; |
| static int a8[(sizeof(t8) == 4) -1]; |
| |
| struct |
| { |
| char foo : 4; |
| char : 0; |
| short : 0; |
| int : 0; |
| long :0; |
| char bar; |
| } ATTR t10 = {5, 10}; |
| static int a10[(sizeof(t10) == 2) -1]; |
| |
| int main() { |
| if (t1.bf_1 != 1 || t1.bf_2 != 2) |
| abort(); |
| if (t2.foo != 3 || t2.bar != 4) |
| abort(); |
| #if HAVE_PRAGMA_MS_STRUCT |
| if (t3.foo != 5 || t3.bar != 6) |
| abort(); |
| #endif |
| if (t5.foo != 7 || t5.bar != 8) |
| abort(); |
| if (t6.foo != 5 || t6.bar != 10) |
| abort(); |
| if (t7.foo != 5 || t7.bar != 10) |
| abort(); |
| if (t8.foo != 5 || t8.bar != 10) |
| abort(); |
| if (t10.foo != 5 || t10.bar != 10) |
| abort(); |
| return 0; |
| } |
| |