1// REQUIRES: arm-registered-target
2// RUN: %clang_cc1 -target-abi apcs-gnu -triple armv7-apple-darwin10 %s -verify
3// expected-no-diagnostics
4//
5// Note: gcc forces the alignment to 4 bytes, regardless of the type of the
6// zero length bitfield.
7// rdar://9859156
8
9#include <stddef.h>
10
11struct t1
12{
13  int foo : 1;
14  char : 0;
15  char bar;
16};
17static int arr1_offset[(offsetof(struct t1, bar) == 4) ? 0 : -1];
18static int arr1_sizeof[(sizeof(struct t1) == 8) ? 0 : -1];
19
20struct t2
21{
22  int foo : 1;
23  short : 0;
24  char bar;
25};
26static int arr2_offset[(offsetof(struct t2, bar) == 4) ? 0 : -1];
27static int arr2_sizeof[(sizeof(struct t2) == 8) ? 0 : -1];
28
29struct t3
30{
31  int foo : 1;
32  int : 0;
33  char bar;
34};
35static int arr3_offset[(offsetof(struct t3, bar) == 4) ? 0 : -1];
36static int arr3_sizeof[(sizeof(struct t3) == 8) ? 0 : -1];
37
38struct t4
39{
40  int foo : 1;
41  long : 0;
42  char bar;
43};
44static int arr4_offset[(offsetof(struct t4, bar) == 4) ? 0 : -1];
45static int arr4_sizeof[(sizeof(struct t4) == 8) ? 0 : -1];
46
47struct t5
48{
49  int foo : 1;
50  long long : 0;
51  char bar;
52};
53static int arr5_offset[(offsetof(struct t5, bar) == 4) ? 0 : -1];
54static int arr5_sizeof[(sizeof(struct t5) == 8) ? 0 : -1];
55
56struct t6
57{
58  int foo : 1;
59  char : 0;
60  char bar : 1;
61  char bar2;
62};
63static int arr6_offset[(offsetof(struct t6, bar2) == 5) ? 0 : -1];
64static int arr6_sizeof[(sizeof(struct t6) == 8) ? 0 : -1];
65
66struct t7
67{
68  int foo : 1;
69  short : 0;
70  char bar1 : 1;
71  char bar2;
72};
73static int arr7_offset[(offsetof(struct t7, bar2) == 5) ? 0 : -1];
74static int arr7_sizeof[(sizeof(struct t7) == 8) ? 0 : -1];
75
76struct t8
77{
78  int foo : 1;
79  int : 0;
80  char bar1 : 1;
81  char bar2;
82};
83static int arr8_offset[(offsetof(struct t8, bar2) == 5) ? 0 : -1];
84static int arr8_sizeof[(sizeof(struct t8) == 8) ? 0 : -1];
85
86struct t9
87{
88  int foo : 1;
89  long : 0;
90  char bar1 : 1;
91  char bar2;
92};
93static int arr9_offset[(offsetof(struct t9, bar2) == 5) ? 0 : -1];
94static int arr9_sizeof[(sizeof(struct t9) == 8) ? 0 : -1];
95
96struct t10
97{
98  int foo : 1;
99  long long : 0;
100  char bar1 : 1;
101  char bar2;
102};
103static int arr10_offset[(offsetof(struct t10, bar2) == 5) ? 0 : -1];
104static int arr10_sizeof[(sizeof(struct t10) == 8) ? 0 : -1];
105
106struct t11
107{
108  int foo : 1;
109  long long : 0;
110  char : 0;
111  char bar1 : 1;
112  char bar2;
113};
114static int arr11_offset[(offsetof(struct t11, bar2) == 5) ? 0 : -1];
115static int arr11_sizeof[(sizeof(struct t11) == 8) ? 0 : -1];
116
117struct t12
118{
119  int foo : 1;
120  char : 0;
121  long long : 0;
122  char : 0;
123  char bar;
124};
125static int arr12_offset[(offsetof(struct t12, bar) == 4) ? 0 : -1];
126static int arr12_sizeof[(sizeof(struct t12) == 8) ? 0 : -1];
127
128struct t13
129{
130  char foo;
131  long : 0;
132  char bar;
133};
134static int arr13_offset[(offsetof(struct t13, bar) == 4) ? 0 : -1];
135static int arr13_sizeof[(sizeof(struct t13) == 8) ? 0 : -1];
136
137struct t14
138{
139  char foo1;
140  int : 0;
141  char foo2 : 1;
142  short foo3 : 16;
143  char : 0;
144  short foo4 : 16;
145  char bar1;
146  int : 0;
147  char bar2;
148};
149static int arr14_bar1_offset[(offsetof(struct t14, bar1) == 10) ? 0 : -1];
150static int arr14_bar2_offset[(offsetof(struct t14, bar2) == 12) ? 0 : -1];
151static int arr14_sizeof[(sizeof(struct t14) == 16) ? 0 : -1];
152
153struct t15
154{
155  char foo;
156  char : 0;
157  int : 0;
158  char bar;
159  long : 0;
160  char : 0;
161};
162static int arr15_offset[(offsetof(struct t15, bar) == 4) ? 0 : -1];
163static int arr15_sizeof[(sizeof(struct t15) == 8) ? 0 : -1];
164
165struct t16
166{
167  long : 0;
168  char bar;
169};
170static int arr16_offset[(offsetof(struct t16, bar) == 0) ? 0 : -1];
171static int arr16_sizeof[(sizeof(struct t16) == 4) ? 0 : -1];
172
173struct t17
174{
175  char foo;
176  long : 0;
177  long : 0;
178  char : 0;
179  char bar;
180};
181static int arr17_offset[(offsetof(struct t17, bar) == 4) ? 0 : -1];
182static int arr17_sizeof[(sizeof(struct t17) == 8) ? 0 : -1];
183
184struct t18
185{
186  long : 0;
187  long : 0;
188  char : 0;
189};
190static int arr18_sizeof[(sizeof(struct t18) == 0) ? 0 : -1];
191
192struct t19
193{
194  char foo1;
195  long foo2 : 1;
196  char : 0;
197  long foo3 : 32;
198  char bar;
199};
200static int arr19_offset[(offsetof(struct t19, bar) == 8) ? 0 : -1];
201static int arr19_sizeof[(sizeof(struct t19) == 12) ? 0 : -1];
202
203struct t20
204{
205  short : 0;
206  int foo : 1;
207  long : 0;
208  char bar;
209};
210static int arr20_offset[(offsetof(struct t20, bar) == 4) ? 0 : -1];
211static int arr20_sizeof[(sizeof(struct t20) == 8) ? 0 : -1];
212
213struct t21
214{
215  short : 0;
216  int foo1 : 1;
217  char : 0;
218  int foo2 : 16;
219  long : 0;
220  char bar1;
221  int bar2;
222  long bar3;
223  char foo3 : 8;
224  char : 0;
225  long : 0;
226  int foo4 : 32;
227  short foo5: 1;
228  long bar4;
229  short foo6: 16;
230  short foo7: 16;
231  short foo8: 16;
232};
233static int arr21_bar1_offset[(offsetof(struct t21, bar1) == 8) ? 0 : -1];
234static int arr21_bar2_offset[(offsetof(struct t21, bar2) == 12) ? 0 : -1];
235static int arr21_bar3_offset[(offsetof(struct t21, bar3) == 16) ? 0 : -1];
236static int arr21_bar4_offset[(offsetof(struct t21, bar4) == 32) ? 0 : -1];
237static int arr21_sizeof[(sizeof(struct t21) == 44) ? 0 : -1];
238
239int main() {
240  return 0;
241}
242
243