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