1*67e74705SXin Li // REQUIRES: aarch64-registered-target
2*67e74705SXin Li // RUN: %clang_cc1 -triple aarch64-linux-gnu -x c++ -std=c++1z %s -verify
3*67e74705SXin Li // expected-no-diagnostics
4*67e74705SXin Li
5*67e74705SXin Li #include <stddef.h>
6*67e74705SXin Li
7*67e74705SXin Li struct t1
8*67e74705SXin Li {
9*67e74705SXin Li int foo : 1;
10*67e74705SXin Li char : 0;
11*67e74705SXin Li char bar;
12*67e74705SXin Li
13*67e74705SXin Li };
14*67e74705SXin Li static_assert(offsetof(struct t1, bar) == 1);
15*67e74705SXin Li static_assert(sizeof(struct t1) == 4);
16*67e74705SXin Li
17*67e74705SXin Li struct t2
18*67e74705SXin Li {
19*67e74705SXin Li int foo : 1;
20*67e74705SXin Li short : 0;
21*67e74705SXin Li char bar;
22*67e74705SXin Li };
23*67e74705SXin Li static_assert(offsetof(struct t2, bar) == 2);
24*67e74705SXin Li static_assert(sizeof(struct t2) == 4);
25*67e74705SXin Li
26*67e74705SXin Li struct t3
27*67e74705SXin Li {
28*67e74705SXin Li int foo : 1;
29*67e74705SXin Li int : 0;
30*67e74705SXin Li char bar;
31*67e74705SXin Li };
32*67e74705SXin Li static_assert(offsetof(struct t3, bar) == 4);
33*67e74705SXin Li static_assert(sizeof(struct t3) == 8);
34*67e74705SXin Li
35*67e74705SXin Li struct t4
36*67e74705SXin Li {
37*67e74705SXin Li int foo : 1;
38*67e74705SXin Li long : 0;
39*67e74705SXin Li char bar;
40*67e74705SXin Li };
41*67e74705SXin Li static_assert(offsetof(struct t4, bar) == 8);
42*67e74705SXin Li static_assert(sizeof(struct t4) == 16);
43*67e74705SXin Li
44*67e74705SXin Li struct t5
45*67e74705SXin Li {
46*67e74705SXin Li int foo : 1;
47*67e74705SXin Li long long : 0;
48*67e74705SXin Li char bar;
49*67e74705SXin Li };
50*67e74705SXin Li static_assert(offsetof(struct t5, bar) == 8);
51*67e74705SXin Li static_assert(sizeof(struct t5) == 16);
52*67e74705SXin Li
53*67e74705SXin Li struct t6
54*67e74705SXin Li {
55*67e74705SXin Li int foo : 1;
56*67e74705SXin Li char : 0;
57*67e74705SXin Li char bar : 1;
58*67e74705SXin Li char bar2;
59*67e74705SXin Li };
60*67e74705SXin Li static_assert(offsetof(struct t6, bar2) == 2);
61*67e74705SXin Li static_assert(sizeof(struct t6) == 4);
62*67e74705SXin Li
63*67e74705SXin Li struct t7
64*67e74705SXin Li {
65*67e74705SXin Li int foo : 1;
66*67e74705SXin Li short : 0;
67*67e74705SXin Li char bar1 : 1;
68*67e74705SXin Li char bar2;
69*67e74705SXin Li };
70*67e74705SXin Li static_assert(offsetof(struct t7, bar2) == 3);
71*67e74705SXin Li static_assert(sizeof(struct t7) == 4);
72*67e74705SXin Li
73*67e74705SXin Li struct t8
74*67e74705SXin Li {
75*67e74705SXin Li int foo : 1;
76*67e74705SXin Li int : 0;
77*67e74705SXin Li char bar1 : 1;
78*67e74705SXin Li char bar2;
79*67e74705SXin Li };
80*67e74705SXin Li static_assert(offsetof(struct t8, bar2) == 5);
81*67e74705SXin Li static_assert(sizeof(struct t8) == 8);
82*67e74705SXin Li
83*67e74705SXin Li struct t9
84*67e74705SXin Li {
85*67e74705SXin Li int foo : 1;
86*67e74705SXin Li long : 0;
87*67e74705SXin Li char bar1 : 1;
88*67e74705SXin Li char bar2;
89*67e74705SXin Li };
90*67e74705SXin Li static_assert(offsetof(struct t9, bar2) == 9);
91*67e74705SXin Li static_assert(sizeof(struct t9) == 16);
92*67e74705SXin Li
93*67e74705SXin Li struct t10
94*67e74705SXin Li {
95*67e74705SXin Li int foo : 1;
96*67e74705SXin Li long long : 0;
97*67e74705SXin Li char bar1 : 1;
98*67e74705SXin Li char bar2;
99*67e74705SXin Li };
100*67e74705SXin Li static_assert(offsetof(struct t10, bar2) == 9);
101*67e74705SXin Li static_assert(sizeof(struct t10) == 16);
102*67e74705SXin Li
103*67e74705SXin Li struct t11
104*67e74705SXin Li {
105*67e74705SXin Li int foo : 1;
106*67e74705SXin Li long long : 0;
107*67e74705SXin Li char : 0;
108*67e74705SXin Li char bar1 : 1;
109*67e74705SXin Li char bar2;
110*67e74705SXin Li };
111*67e74705SXin Li static_assert(offsetof(struct t11, bar2) == 9);
112*67e74705SXin Li static_assert(sizeof(struct t11) == 16);
113*67e74705SXin Li
114*67e74705SXin Li struct t12
115*67e74705SXin Li {
116*67e74705SXin Li int foo : 1;
117*67e74705SXin Li char : 0;
118*67e74705SXin Li long long : 0;
119*67e74705SXin Li char : 0;
120*67e74705SXin Li char bar;
121*67e74705SXin Li };
122*67e74705SXin Li static_assert(offsetof(struct t12, bar) == 8);
123*67e74705SXin Li static_assert(sizeof(struct t12) == 16);
124*67e74705SXin Li
125*67e74705SXin Li struct t13
126*67e74705SXin Li {
127*67e74705SXin Li char foo;
128*67e74705SXin Li long : 0;
129*67e74705SXin Li char bar;
130*67e74705SXin Li };
131*67e74705SXin Li static_assert(offsetof(struct t13, bar) == 8);
132*67e74705SXin Li static_assert(sizeof(struct t13) == 16);
133*67e74705SXin Li
134*67e74705SXin Li struct t14
135*67e74705SXin Li {
136*67e74705SXin Li char foo1;
137*67e74705SXin Li int : 0;
138*67e74705SXin Li char foo2 : 1;
139*67e74705SXin Li short foo3 : 16;
140*67e74705SXin Li char : 0;
141*67e74705SXin Li short foo4 : 16;
142*67e74705SXin Li char bar1;
143*67e74705SXin Li int : 0;
144*67e74705SXin Li char bar2;
145*67e74705SXin Li };
146*67e74705SXin Li static_assert(offsetof(struct t14, bar1) == 10);
147*67e74705SXin Li static_assert(offsetof(struct t14, bar2) == 12);
148*67e74705SXin Li static_assert(sizeof(struct t14) == 16);
149*67e74705SXin Li
150*67e74705SXin Li struct t15
151*67e74705SXin Li {
152*67e74705SXin Li char foo;
153*67e74705SXin Li char : 0;
154*67e74705SXin Li int : 0;
155*67e74705SXin Li char bar;
156*67e74705SXin Li long : 0;
157*67e74705SXin Li char : 0;
158*67e74705SXin Li };
159*67e74705SXin Li static_assert(offsetof(struct t15, bar) == 4);
160*67e74705SXin Li static_assert(sizeof(struct t15) == 8);
161*67e74705SXin Li
162*67e74705SXin Li struct t16
163*67e74705SXin Li {
164*67e74705SXin Li long : 0;
165*67e74705SXin Li char bar;
166*67e74705SXin Li };
167*67e74705SXin Li static_assert(offsetof(struct t16, bar) == 0);
168*67e74705SXin Li static_assert(sizeof(struct t16) == 8);
169*67e74705SXin Li
170*67e74705SXin Li struct t17
171*67e74705SXin Li {
172*67e74705SXin Li char foo;
173*67e74705SXin Li long : 0;
174*67e74705SXin Li long : 0;
175*67e74705SXin Li char : 0;
176*67e74705SXin Li char bar;
177*67e74705SXin Li };
178*67e74705SXin Li static_assert(offsetof(struct t17, bar) == 8);
179*67e74705SXin Li static_assert(sizeof(struct t17) == 16);
180*67e74705SXin Li
181*67e74705SXin Li struct t18
182*67e74705SXin Li {
183*67e74705SXin Li long : 0;
184*67e74705SXin Li long : 0;
185*67e74705SXin Li char : 0;
186*67e74705SXin Li };
187*67e74705SXin Li static_assert(sizeof(struct t18) == 8);
188*67e74705SXin Li
189*67e74705SXin Li struct t19
190*67e74705SXin Li {
191*67e74705SXin Li char foo1;
192*67e74705SXin Li long foo2 : 1;
193*67e74705SXin Li char : 0;
194*67e74705SXin Li long foo3 : 32;
195*67e74705SXin Li char bar;
196*67e74705SXin Li };
197*67e74705SXin Li static_assert(offsetof(struct t19, bar) == 6);
198*67e74705SXin Li static_assert(sizeof(struct t19) == 8);
199*67e74705SXin Li
200*67e74705SXin Li struct t20
201*67e74705SXin Li {
202*67e74705SXin Li short : 0;
203*67e74705SXin Li int foo : 1;
204*67e74705SXin Li long : 0;
205*67e74705SXin Li char bar;
206*67e74705SXin Li };
207*67e74705SXin Li static_assert(offsetof(struct t20, bar) == 8);
208*67e74705SXin Li static_assert(sizeof(struct t20) == 16);
209*67e74705SXin Li
210*67e74705SXin Li struct t21
211*67e74705SXin Li {
212*67e74705SXin Li short : 0;
213*67e74705SXin Li int foo1 : 1;
214*67e74705SXin Li char : 0;
215*67e74705SXin Li int foo2 : 16;
216*67e74705SXin Li long : 0;
217*67e74705SXin Li char bar1;
218*67e74705SXin Li int bar2;
219*67e74705SXin Li long bar3;
220*67e74705SXin Li char foo3 : 8;
221*67e74705SXin Li char : 0;
222*67e74705SXin Li long : 0;
223*67e74705SXin Li int foo4 : 32;
224*67e74705SXin Li short foo5: 1;
225*67e74705SXin Li long bar4;
226*67e74705SXin Li short foo6: 16;
227*67e74705SXin Li short foo7: 16;
228*67e74705SXin Li short foo8: 16;
229*67e74705SXin Li };
230*67e74705SXin Li static_assert(offsetof(struct t21, bar1) == 8);
231*67e74705SXin Li static_assert(offsetof(struct t21, bar2) == 12);
232*67e74705SXin Li static_assert(offsetof(struct t21, bar3) == 16);
233*67e74705SXin Li static_assert(offsetof(struct t21, bar4) == 40);
234*67e74705SXin Li static_assert(sizeof(struct t21) == 56);
235*67e74705SXin Li
236*67e74705SXin Li // The rules also apply to anonymous bitfields with non-zero length.
237*67e74705SXin Li struct t22
238*67e74705SXin Li {
239*67e74705SXin Li char foo;
240*67e74705SXin Li short :2;
241*67e74705SXin Li char bar;
242*67e74705SXin Li };
243*67e74705SXin Li static_assert(alignof(struct t22) == 2);
244*67e74705SXin Li static_assert(offsetof(struct t22, bar) == 2);
245*67e74705SXin Li
main()246*67e74705SXin Li int main() {
247*67e74705SXin Li return 0;
248*67e74705SXin Li }
249*67e74705SXin Li
250