1// { dg-do run { target i?86-*-linux* x86_64-*-linux* i?86-*-freebsd* } }
2// { dg-require-effective-target ilp32 }
3// { dg-options "-malign-double" }
4// Origin: Alex Samuel <samuel@codesourcery.com>
5
6/* Test the data layout of C aggregates by checking aggregate size and
7   alignment and field offsets for compliance with the IA-64 ABI.  */
8
9template<typename T>
10inline unsigned
11alignmentof ()
12{
13  struct S
14  {
15    char start_;
16    T object_;
17  };
18
19  return (unsigned) & ((S *) 0)->object_;
20}
21
22/* Computes the alignment, in bytes, of TYPE.  */
23
24#define alignof(type) (alignmentof<type> ())
25
26/* Computes the offset of FIELD in AGGREGATE.  */
27
28#define offsetof(aggregate, field) \
29  ((unsigned) (& ((aggregate*) 0)->field))
30
31
32/* Structs S1, S2, S3, S4, and union U5 are taken from Intel, "IA-64
33   Software Conventions and Runtime Architecture Guide", version of
34   August 1999.  */
35
36struct S1
37{
38  char c;
39};
40
41struct S2
42{
43  char c;
44  char d;
45  short s;
46  int n;
47};
48
49struct S3
50{
51  char c;
52  short s;
53};
54
55struct S4
56{
57  char c;
58  double d;
59  short s;
60};
61
62union U5
63{
64  char c;
65  short s;
66  int j;
67};
68
69
70
71int
72main ()
73{
74  if (sizeof (struct S1) 		!=  1)
75    return 1;
76  if (alignof (struct S1)		!=  1)
77    return 2;
78  if (offsetof (struct S1, c)		!=  0)
79    return 3;
80
81  if (sizeof (struct S2)		!=  8)
82    return 4;
83  if (alignof (struct S2)       	!=  4)
84    return 5;
85  if (offsetof (struct S2, c)		!=  0)
86    return 6;
87  if (offsetof (struct S2, d)		!=  1)
88    return 7;
89  if (offsetof (struct S2, s)		!=  2)
90    return 8;
91  if (offsetof (struct S2, n)		!=  4)
92    return 9;
93
94  if (sizeof (struct S3)		!=  4)
95    return 10;
96  if (alignof (struct S3)		!=  2)
97    return 11;
98  if (offsetof (struct S3, c)		!=  0)
99    return 12;
100  if (offsetof (struct S3, s)		!=  2)
101    return 13;
102
103  if (sizeof (struct S4)		!= 24)
104    return 14;
105  if (alignof (struct S4)		!=  8)
106    return 15;
107  if (offsetof (struct S4, c)		!=  0)
108    return 16;
109  if (offsetof (struct S4, d)		!=  8)
110    return 17;
111  if (offsetof (struct S4, s)		!= 16)
112    return 18;
113
114  if (sizeof (union U5)			!=  4)
115    return 19;
116  if (alignof (union U5)		!=  4)
117    return 20;
118  if (offsetof (union U5, c)		!=  0)
119    return 21;
120  if (offsetof (union U5, s)		!=  0)
121    return 22;
122  if (offsetof (union U5, j)		!=  0)
123    return 23;
124
125  return 0;
126}
127