// { dg-do run { target i?86-*-linux* i?86-*-gnu* x86_64-*-linux* i?86-*-freebsd* } } // { dg-require-effective-target ilp32 } // { dg-options "-malign-double" } // Origin: Alex Samuel /* Test the data layout of C aggregates by checking aggregate size and alignment and field offsets for compliance with the IA-64 ABI. */ template inline unsigned alignmentof () { struct S { char start_; T object_; }; return (unsigned) & ((S *) 0)->object_; } /* Computes the alignment, in bytes, of TYPE. */ #define alignof(type) (alignmentof ()) /* Computes the offset of FIELD in AGGREGATE. */ #define offsetof(aggregate, field) \ ((unsigned) (& ((aggregate*) 0)->field)) /* Structs S1, S2, S3, S4, and union U5 are taken from Intel, "IA-64 Software Conventions and Runtime Architecture Guide", version of August 1999. */ struct S1 { char c; }; struct S2 { char c; char d; short s; int n; }; struct S3 { char c; short s; }; struct S4 { char c; double d; short s; }; union U5 { char c; short s; int j; }; int main () { if (sizeof (struct S1) != 1) return 1; if (alignof (struct S1) != 1) return 2; if (offsetof (struct S1, c) != 0) return 3; if (sizeof (struct S2) != 8) return 4; if (alignof (struct S2) != 4) return 5; if (offsetof (struct S2, c) != 0) return 6; if (offsetof (struct S2, d) != 1) return 7; if (offsetof (struct S2, s) != 2) return 8; if (offsetof (struct S2, n) != 4) return 9; if (sizeof (struct S3) != 4) return 10; if (alignof (struct S3) != 2) return 11; if (offsetof (struct S3, c) != 0) return 12; if (offsetof (struct S3, s) != 2) return 13; if (sizeof (struct S4) != 24) return 14; if (alignof (struct S4) != 8) return 15; if (offsetof (struct S4, c) != 0) return 16; if (offsetof (struct S4, d) != 8) return 17; if (offsetof (struct S4, s) != 16) return 18; if (sizeof (union U5) != 4) return 19; if (alignof (union U5) != 4) return 20; if (offsetof (union U5, c) != 0) return 21; if (offsetof (union U5, s) != 0) return 22; if (offsetof (union U5, j) != 0) return 23; return 0; }