| |
| typedef __SIZE_TYPE__ Size_t; |
| |
| #if __SIZEOF_LONG__ < __SIZEOF_POINTER__ |
| #define bufsize ((1LL << (8 * sizeof(Size_t) - 2))-256) |
| #else |
| #define bufsize ((1L << (8 * sizeof(Size_t) - 2))-256) |
| #endif |
| |
| struct huge_struct |
| { |
| short buf[bufsize]; |
| int a; |
| int b; |
| int c; |
| int d; |
| }; |
| |
| union huge_union |
| { |
| int a; |
| char buf[bufsize]; |
| }; |
| |
| Size_t union_size() |
| { |
| return sizeof(union huge_union); |
| } |
| |
| Size_t struct_size() |
| { |
| return sizeof(struct huge_struct); |
| } |
| |
| Size_t struct_a_offset() |
| { |
| return (Size_t)(&((struct huge_struct *) 0)->a); |
| } |
| |
| int main() |
| { |
| /* Check the exact sizeof value. bufsize is aligned on 256b. */ |
| if (union_size() != sizeof(char) * bufsize) |
| abort(); |
| |
| if (struct_size() != sizeof(short) * bufsize + 4*sizeof(int)) |
| abort(); |
| |
| if (struct_a_offset() < sizeof(short) * bufsize) |
| abort(); |
| |
| return 0; |
| } |
| |