xref: /minix3/external/bsd/llvm/dist/clang/test/SemaCXX/class-layout.cpp (revision f4a2713ac843a11c696ec80c0a5e3e5d80b4d338)
1*f4a2713aSLionel Sambuc // RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -fsyntax-only -verify -std=c++98
2*f4a2713aSLionel Sambuc // RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -fsyntax-only -verify -std=c++11
3*f4a2713aSLionel Sambuc // expected-no-diagnostics
4*f4a2713aSLionel Sambuc 
5*f4a2713aSLionel Sambuc #define SA(n, p) int a##n[(p) ? 1 : -1]
6*f4a2713aSLionel Sambuc 
7*f4a2713aSLionel Sambuc struct A {
8*f4a2713aSLionel Sambuc   int a;
9*f4a2713aSLionel Sambuc   char b;
10*f4a2713aSLionel Sambuc };
11*f4a2713aSLionel Sambuc 
12*f4a2713aSLionel Sambuc SA(0, sizeof(A) == 8);
13*f4a2713aSLionel Sambuc 
14*f4a2713aSLionel Sambuc struct B : A {
15*f4a2713aSLionel Sambuc   char c;
16*f4a2713aSLionel Sambuc };
17*f4a2713aSLionel Sambuc 
18*f4a2713aSLionel Sambuc SA(1, sizeof(B) == 12);
19*f4a2713aSLionel Sambuc 
20*f4a2713aSLionel Sambuc struct C {
21*f4a2713aSLionel Sambuc // Make fields private so C won't be a POD type.
22*f4a2713aSLionel Sambuc private:
23*f4a2713aSLionel Sambuc   int a;
24*f4a2713aSLionel Sambuc   char b;
25*f4a2713aSLionel Sambuc };
26*f4a2713aSLionel Sambuc 
27*f4a2713aSLionel Sambuc SA(2, sizeof(C) == 8);
28*f4a2713aSLionel Sambuc 
29*f4a2713aSLionel Sambuc struct D : C {
30*f4a2713aSLionel Sambuc   char c;
31*f4a2713aSLionel Sambuc };
32*f4a2713aSLionel Sambuc 
33*f4a2713aSLionel Sambuc SA(3, sizeof(D) == 8);
34*f4a2713aSLionel Sambuc 
35*f4a2713aSLionel Sambuc struct __attribute__((packed)) E {
36*f4a2713aSLionel Sambuc   char b;
37*f4a2713aSLionel Sambuc   int a;
38*f4a2713aSLionel Sambuc };
39*f4a2713aSLionel Sambuc 
40*f4a2713aSLionel Sambuc SA(4, sizeof(E) == 5);
41*f4a2713aSLionel Sambuc 
42*f4a2713aSLionel Sambuc struct __attribute__((packed)) F : E {
43*f4a2713aSLionel Sambuc   char d;
44*f4a2713aSLionel Sambuc };
45*f4a2713aSLionel Sambuc 
46*f4a2713aSLionel Sambuc SA(5, sizeof(F) == 6);
47*f4a2713aSLionel Sambuc 
48*f4a2713aSLionel Sambuc struct G { G(); };
49*f4a2713aSLionel Sambuc struct H : G { };
50*f4a2713aSLionel Sambuc 
51*f4a2713aSLionel Sambuc SA(6, sizeof(H) == 1);
52*f4a2713aSLionel Sambuc 
53*f4a2713aSLionel Sambuc struct I {
54*f4a2713aSLionel Sambuc   char b;
55*f4a2713aSLionel Sambuc   int a;
56*f4a2713aSLionel Sambuc } __attribute__((packed));
57*f4a2713aSLionel Sambuc 
58*f4a2713aSLionel Sambuc SA(6_1, sizeof(I) == 5);
59*f4a2713aSLionel Sambuc 
60*f4a2713aSLionel Sambuc // PR5580
61*f4a2713aSLionel Sambuc namespace PR5580 {
62*f4a2713aSLionel Sambuc 
63*f4a2713aSLionel Sambuc class A { bool iv0 : 1; };
64*f4a2713aSLionel Sambuc SA(7, sizeof(A) == 1);
65*f4a2713aSLionel Sambuc 
66*f4a2713aSLionel Sambuc class B : A { bool iv0 : 1; };
67*f4a2713aSLionel Sambuc SA(8, sizeof(B) == 2);
68*f4a2713aSLionel Sambuc 
69*f4a2713aSLionel Sambuc struct C { bool iv0 : 1; };
70*f4a2713aSLionel Sambuc SA(9, sizeof(C) == 1);
71*f4a2713aSLionel Sambuc 
72*f4a2713aSLionel Sambuc struct D : C { bool iv0 : 1; };
73*f4a2713aSLionel Sambuc SA(10, sizeof(D) == 2);
74*f4a2713aSLionel Sambuc 
75*f4a2713aSLionel Sambuc }
76*f4a2713aSLionel Sambuc 
77*f4a2713aSLionel Sambuc namespace Test1 {
78*f4a2713aSLionel Sambuc 
79*f4a2713aSLionel Sambuc // Test that we don't assert on this hierarchy.
80*f4a2713aSLionel Sambuc struct A { };
81*f4a2713aSLionel Sambuc struct B : A { virtual void b(); };
82*f4a2713aSLionel Sambuc class C : virtual A { int c; };
83*f4a2713aSLionel Sambuc struct D : virtual B { };
84*f4a2713aSLionel Sambuc struct E : C, virtual D { };
85*f4a2713aSLionel Sambuc class F : virtual E { };
86*f4a2713aSLionel Sambuc struct G : virtual E, F { };
87*f4a2713aSLionel Sambuc 
88*f4a2713aSLionel Sambuc SA(0, sizeof(G) == 24);
89*f4a2713aSLionel Sambuc 
90*f4a2713aSLionel Sambuc }
91*f4a2713aSLionel Sambuc 
92*f4a2713aSLionel Sambuc namespace Test2 {
93*f4a2713aSLionel Sambuc 
94*f4a2713aSLionel Sambuc // Test that this somewhat complex class structure is laid out correctly.
95*f4a2713aSLionel Sambuc struct A { };
96*f4a2713aSLionel Sambuc struct B : A { virtual void b(); };
97*f4a2713aSLionel Sambuc struct C : virtual B { };
98*f4a2713aSLionel Sambuc struct D : virtual A { };
99*f4a2713aSLionel Sambuc struct E : virtual B, D { };
100*f4a2713aSLionel Sambuc struct F : E, virtual C { };
101*f4a2713aSLionel Sambuc struct G : virtual F, A { };
102*f4a2713aSLionel Sambuc struct H { G g; };
103*f4a2713aSLionel Sambuc 
104*f4a2713aSLionel Sambuc SA(0, sizeof(H) == 24);
105*f4a2713aSLionel Sambuc 
106*f4a2713aSLionel Sambuc }
107*f4a2713aSLionel Sambuc 
108*f4a2713aSLionel Sambuc namespace PR16537 {
109*f4a2713aSLionel Sambuc namespace test1 {
110*f4a2713aSLionel Sambuc   struct pod_in_11_only {
111*f4a2713aSLionel Sambuc   private:
112*f4a2713aSLionel Sambuc     long long x;
113*f4a2713aSLionel Sambuc   };
114*f4a2713aSLionel Sambuc 
115*f4a2713aSLionel Sambuc   struct tail_padded_pod_in_11_only {
116*f4a2713aSLionel Sambuc     pod_in_11_only pod11;
117*f4a2713aSLionel Sambuc     char tail_padding;
118*f4a2713aSLionel Sambuc   };
119*f4a2713aSLionel Sambuc 
120*f4a2713aSLionel Sambuc   struct might_use_tail_padding : public tail_padded_pod_in_11_only {
121*f4a2713aSLionel Sambuc     char may_go_into_tail_padding;
122*f4a2713aSLionel Sambuc   };
123*f4a2713aSLionel Sambuc 
124*f4a2713aSLionel Sambuc   SA(0, sizeof(might_use_tail_padding) == 16);
125*f4a2713aSLionel Sambuc }
126*f4a2713aSLionel Sambuc 
127*f4a2713aSLionel Sambuc namespace test2 {
128*f4a2713aSLionel Sambuc   struct pod_in_11_only {
129*f4a2713aSLionel Sambuc   private:
130*f4a2713aSLionel Sambuc     long long x;
131*f4a2713aSLionel Sambuc   };
132*f4a2713aSLionel Sambuc 
133*f4a2713aSLionel Sambuc   struct tail_padded_pod_in_11_only {
134*f4a2713aSLionel Sambuc     pod_in_11_only pod11 __attribute__((aligned(16)));
135*f4a2713aSLionel Sambuc   };
136*f4a2713aSLionel Sambuc 
137*f4a2713aSLionel Sambuc   struct might_use_tail_padding : public tail_padded_pod_in_11_only {
138*f4a2713aSLionel Sambuc     char may_go_into_tail_padding;
139*f4a2713aSLionel Sambuc   };
140*f4a2713aSLionel Sambuc 
141*f4a2713aSLionel Sambuc   SA(0, sizeof(might_use_tail_padding) == 16);
142*f4a2713aSLionel Sambuc }
143*f4a2713aSLionel Sambuc 
144*f4a2713aSLionel Sambuc namespace test3 {
145*f4a2713aSLionel Sambuc   struct pod_in_11_only {
146*f4a2713aSLionel Sambuc   private:
147*f4a2713aSLionel Sambuc     long long x;
148*f4a2713aSLionel Sambuc   };
149*f4a2713aSLionel Sambuc 
150*f4a2713aSLionel Sambuc   struct tail_padded_pod_in_11_only {
151*f4a2713aSLionel Sambuc     pod_in_11_only pod11;
152*f4a2713aSLionel Sambuc     char tail_padding;
153*f4a2713aSLionel Sambuc   };
154*f4a2713aSLionel Sambuc 
155*f4a2713aSLionel Sambuc   struct second_base {
156*f4a2713aSLionel Sambuc       char foo;
157*f4a2713aSLionel Sambuc   };
158*f4a2713aSLionel Sambuc 
159*f4a2713aSLionel Sambuc   struct might_use_tail_padding : public tail_padded_pod_in_11_only, public second_base {
160*f4a2713aSLionel Sambuc 
161*f4a2713aSLionel Sambuc   };
162*f4a2713aSLionel Sambuc   SA(0, sizeof(might_use_tail_padding) == 16);
163*f4a2713aSLionel Sambuc }
164*f4a2713aSLionel Sambuc 
165*f4a2713aSLionel Sambuc namespace test4 {
166*f4a2713aSLionel Sambuc   struct pod_in_11_only {
167*f4a2713aSLionel Sambuc   private:
168*f4a2713aSLionel Sambuc     long long x;
169*f4a2713aSLionel Sambuc   };
170*f4a2713aSLionel Sambuc 
171*f4a2713aSLionel Sambuc   struct tail_padded_pod_in_11_only {
172*f4a2713aSLionel Sambuc     pod_in_11_only pod11;
173*f4a2713aSLionel Sambuc     char tail_padding;
174*f4a2713aSLionel Sambuc   };
175*f4a2713aSLionel Sambuc 
176*f4a2713aSLionel Sambuc   struct second_base {
177*f4a2713aSLionel Sambuc     char foo;
178*f4a2713aSLionel Sambuc   };
179*f4a2713aSLionel Sambuc 
180*f4a2713aSLionel Sambuc   struct might_use_tail_padding : public tail_padded_pod_in_11_only, public second_base {
181*f4a2713aSLionel Sambuc     char may_go_into_tail_padding;
182*f4a2713aSLionel Sambuc   };
183*f4a2713aSLionel Sambuc   SA(0, sizeof(might_use_tail_padding) == 16);
184*f4a2713aSLionel Sambuc }
185*f4a2713aSLionel Sambuc 
186*f4a2713aSLionel Sambuc namespace test5 {
187*f4a2713aSLionel Sambuc   struct pod_in_11_only {
188*f4a2713aSLionel Sambuc   private:
189*f4a2713aSLionel Sambuc     long long x;
190*f4a2713aSLionel Sambuc   };
191*f4a2713aSLionel Sambuc 
192*f4a2713aSLionel Sambuc   struct pod_in_11_only2 {
193*f4a2713aSLionel Sambuc   private:
194*f4a2713aSLionel Sambuc     long long x;
195*f4a2713aSLionel Sambuc   };
196*f4a2713aSLionel Sambuc 
197*f4a2713aSLionel Sambuc   struct tail_padded_pod_in_11_only {
198*f4a2713aSLionel Sambuc     pod_in_11_only pod11;
199*f4a2713aSLionel Sambuc     char tail_padding;
200*f4a2713aSLionel Sambuc   };
201*f4a2713aSLionel Sambuc 
202*f4a2713aSLionel Sambuc   struct second_base {
203*f4a2713aSLionel Sambuc     pod_in_11_only2 two;
204*f4a2713aSLionel Sambuc     char foo;
205*f4a2713aSLionel Sambuc   };
206*f4a2713aSLionel Sambuc 
207*f4a2713aSLionel Sambuc   struct might_use_tail_padding : public tail_padded_pod_in_11_only, public second_base {
208*f4a2713aSLionel Sambuc     char may_go_into_tail_padding;
209*f4a2713aSLionel Sambuc   };
210*f4a2713aSLionel Sambuc   SA(0, sizeof(might_use_tail_padding) == 32);
211*f4a2713aSLionel Sambuc }
212*f4a2713aSLionel Sambuc 
213*f4a2713aSLionel Sambuc namespace test6 {
214*f4a2713aSLionel Sambuc   struct pod_in_11_only {
215*f4a2713aSLionel Sambuc   private:
216*f4a2713aSLionel Sambuc     long long x;
217*f4a2713aSLionel Sambuc   };
218*f4a2713aSLionel Sambuc 
219*f4a2713aSLionel Sambuc   struct pod_in_11_only2 {
220*f4a2713aSLionel Sambuc   private:
221*f4a2713aSLionel Sambuc     long long x;
222*f4a2713aSLionel Sambuc   };
223*f4a2713aSLionel Sambuc 
224*f4a2713aSLionel Sambuc   struct tail_padded_pod_in_11_only {
225*f4a2713aSLionel Sambuc     pod_in_11_only pod11;
226*f4a2713aSLionel Sambuc     char tail_padding;
227*f4a2713aSLionel Sambuc   };
228*f4a2713aSLionel Sambuc 
229*f4a2713aSLionel Sambuc   struct second_base {
230*f4a2713aSLionel Sambuc     pod_in_11_only2 two;
231*f4a2713aSLionel Sambuc     char foo;
232*f4a2713aSLionel Sambuc   };
233*f4a2713aSLionel Sambuc 
234*f4a2713aSLionel Sambuc   struct might_use_tail_padding : public tail_padded_pod_in_11_only, public second_base {
235*f4a2713aSLionel Sambuc     char may_go_into_tail_padding;
236*f4a2713aSLionel Sambuc   };
237*f4a2713aSLionel Sambuc   SA(0, sizeof(might_use_tail_padding) == 32);
238*f4a2713aSLionel Sambuc }
239*f4a2713aSLionel Sambuc 
240*f4a2713aSLionel Sambuc namespace test7 {
241*f4a2713aSLionel Sambuc   struct pod_in_11_only {
242*f4a2713aSLionel Sambuc   private:
243*f4a2713aSLionel Sambuc     long long x;
244*f4a2713aSLionel Sambuc   };
245*f4a2713aSLionel Sambuc 
246*f4a2713aSLionel Sambuc   struct tail_padded_pod_in_11_only {
247*f4a2713aSLionel Sambuc     pod_in_11_only pod11;
248*f4a2713aSLionel Sambuc     pod_in_11_only pod12;
249*f4a2713aSLionel Sambuc     char tail_padding;
250*f4a2713aSLionel Sambuc   };
251*f4a2713aSLionel Sambuc 
252*f4a2713aSLionel Sambuc   struct might_use_tail_padding : public tail_padded_pod_in_11_only {
253*f4a2713aSLionel Sambuc     char may_go_into_tail_padding;
254*f4a2713aSLionel Sambuc   };
255*f4a2713aSLionel Sambuc 
256*f4a2713aSLionel Sambuc   SA(0, sizeof(might_use_tail_padding) == 24);
257*f4a2713aSLionel Sambuc }
258*f4a2713aSLionel Sambuc 
259*f4a2713aSLionel Sambuc namespace test8 {
260*f4a2713aSLionel Sambuc   struct pod_in_11_only {
261*f4a2713aSLionel Sambuc   private:
262*f4a2713aSLionel Sambuc     long long x;
263*f4a2713aSLionel Sambuc   };
264*f4a2713aSLionel Sambuc 
265*f4a2713aSLionel Sambuc   struct tail_padded_pod_in_11_only {
266*f4a2713aSLionel Sambuc     pod_in_11_only pod11;
267*f4a2713aSLionel Sambuc     char tail_padding;
268*f4a2713aSLionel Sambuc   };
269*f4a2713aSLionel Sambuc 
270*f4a2713aSLionel Sambuc   struct another_layer {
271*f4a2713aSLionel Sambuc     tail_padded_pod_in_11_only pod;
272*f4a2713aSLionel Sambuc     char padding;
273*f4a2713aSLionel Sambuc   };
274*f4a2713aSLionel Sambuc 
275*f4a2713aSLionel Sambuc   struct might_use_tail_padding : public another_layer {
276*f4a2713aSLionel Sambuc     char may_go_into_tail_padding;
277*f4a2713aSLionel Sambuc   };
278*f4a2713aSLionel Sambuc 
279*f4a2713aSLionel Sambuc   SA(0, sizeof(might_use_tail_padding) == 24);
280*f4a2713aSLionel Sambuc }
281*f4a2713aSLionel Sambuc 
282*f4a2713aSLionel Sambuc namespace test9 {
283*f4a2713aSLionel Sambuc   struct pod_in_11_only {
284*f4a2713aSLionel Sambuc   private:
285*f4a2713aSLionel Sambuc     long long x;
286*f4a2713aSLionel Sambuc   };
287*f4a2713aSLionel Sambuc 
288*f4a2713aSLionel Sambuc   struct tail_padded_pod_in_11_only {
289*f4a2713aSLionel Sambuc     pod_in_11_only pod11;
290*f4a2713aSLionel Sambuc     char tail_padding;
291*f4a2713aSLionel Sambuc   };
292*f4a2713aSLionel Sambuc 
293*f4a2713aSLionel Sambuc   struct another_layer : tail_padded_pod_in_11_only {
294*f4a2713aSLionel Sambuc   };
295*f4a2713aSLionel Sambuc 
296*f4a2713aSLionel Sambuc   struct might_use_tail_padding : public another_layer {
297*f4a2713aSLionel Sambuc     char may_go_into_tail_padding;
298*f4a2713aSLionel Sambuc   };
299*f4a2713aSLionel Sambuc 
300*f4a2713aSLionel Sambuc   SA(0, sizeof(might_use_tail_padding) == 16);
301*f4a2713aSLionel Sambuc }
302*f4a2713aSLionel Sambuc 
303*f4a2713aSLionel Sambuc namespace test10 {
304*f4a2713aSLionel Sambuc   struct pod_in_11_only {
305*f4a2713aSLionel Sambuc   private:
306*f4a2713aSLionel Sambuc     long long x;
307*f4a2713aSLionel Sambuc   };
308*f4a2713aSLionel Sambuc 
309*f4a2713aSLionel Sambuc   struct A {
310*f4a2713aSLionel Sambuc     pod_in_11_only a;
311*f4a2713aSLionel Sambuc     char apad;
312*f4a2713aSLionel Sambuc   };
313*f4a2713aSLionel Sambuc 
314*f4a2713aSLionel Sambuc   struct B {
315*f4a2713aSLionel Sambuc     char b;
316*f4a2713aSLionel Sambuc   };
317*f4a2713aSLionel Sambuc 
318*f4a2713aSLionel Sambuc   struct C {
319*f4a2713aSLionel Sambuc     pod_in_11_only c;
320*f4a2713aSLionel Sambuc     char cpad;
321*f4a2713aSLionel Sambuc   };
322*f4a2713aSLionel Sambuc 
323*f4a2713aSLionel Sambuc   struct D {
324*f4a2713aSLionel Sambuc     char d;
325*f4a2713aSLionel Sambuc   };
326*f4a2713aSLionel Sambuc 
327*f4a2713aSLionel Sambuc   struct might_use_tail_padding : public A, public B, public C, public D {
328*f4a2713aSLionel Sambuc   };
329*f4a2713aSLionel Sambuc 
330*f4a2713aSLionel Sambuc   SA(0, sizeof(might_use_tail_padding) == 32);
331*f4a2713aSLionel Sambuc }
332*f4a2713aSLionel Sambuc 
333*f4a2713aSLionel Sambuc namespace test11 {
334*f4a2713aSLionel Sambuc   struct pod_in_11_only {
335*f4a2713aSLionel Sambuc   private:
336*f4a2713aSLionel Sambuc     long long x;
337*f4a2713aSLionel Sambuc   };
338*f4a2713aSLionel Sambuc 
339*f4a2713aSLionel Sambuc   struct A {
340*f4a2713aSLionel Sambuc     pod_in_11_only a;
341*f4a2713aSLionel Sambuc     char apad;
342*f4a2713aSLionel Sambuc   };
343*f4a2713aSLionel Sambuc 
344*f4a2713aSLionel Sambuc   struct B {
345*f4a2713aSLionel Sambuc     char b_pre;
346*f4a2713aSLionel Sambuc     pod_in_11_only b;
347*f4a2713aSLionel Sambuc     char bpad;
348*f4a2713aSLionel Sambuc   };
349*f4a2713aSLionel Sambuc 
350*f4a2713aSLionel Sambuc   struct C {
351*f4a2713aSLionel Sambuc     char c_pre;
352*f4a2713aSLionel Sambuc     pod_in_11_only c;
353*f4a2713aSLionel Sambuc     char cpad;
354*f4a2713aSLionel Sambuc   };
355*f4a2713aSLionel Sambuc 
356*f4a2713aSLionel Sambuc   struct D {
357*f4a2713aSLionel Sambuc     char d_pre;
358*f4a2713aSLionel Sambuc     pod_in_11_only d;
359*f4a2713aSLionel Sambuc     char dpad;
360*f4a2713aSLionel Sambuc   };
361*f4a2713aSLionel Sambuc 
362*f4a2713aSLionel Sambuc   struct might_use_tail_padding : public A, public B, public C, public D {
363*f4a2713aSLionel Sambuc     char m;
364*f4a2713aSLionel Sambuc   };
365*f4a2713aSLionel Sambuc 
366*f4a2713aSLionel Sambuc   SA(0, sizeof(might_use_tail_padding) == 88);
367*f4a2713aSLionel Sambuc }
368*f4a2713aSLionel Sambuc 
369*f4a2713aSLionel Sambuc namespace test12 {
370*f4a2713aSLionel Sambuc   struct pod_in_11_only {
371*f4a2713aSLionel Sambuc   private:
372*f4a2713aSLionel Sambuc     long long x;
373*f4a2713aSLionel Sambuc   };
374*f4a2713aSLionel Sambuc 
375*f4a2713aSLionel Sambuc   struct A {
376*f4a2713aSLionel Sambuc     pod_in_11_only a __attribute__((aligned(128)));
377*f4a2713aSLionel Sambuc   };
378*f4a2713aSLionel Sambuc 
379*f4a2713aSLionel Sambuc   struct B {
380*f4a2713aSLionel Sambuc     char bpad;
381*f4a2713aSLionel Sambuc   };
382*f4a2713aSLionel Sambuc 
383*f4a2713aSLionel Sambuc   struct C {
384*f4a2713aSLionel Sambuc     char cpad;
385*f4a2713aSLionel Sambuc   };
386*f4a2713aSLionel Sambuc 
387*f4a2713aSLionel Sambuc   struct D {
388*f4a2713aSLionel Sambuc     char dpad;
389*f4a2713aSLionel Sambuc   };
390*f4a2713aSLionel Sambuc 
391*f4a2713aSLionel Sambuc   struct might_use_tail_padding : public A, public B, public C, public D {
392*f4a2713aSLionel Sambuc     char m;
393*f4a2713aSLionel Sambuc   };
394*f4a2713aSLionel Sambuc   SA(0, sizeof(might_use_tail_padding) == 128);
395*f4a2713aSLionel Sambuc }
396*f4a2713aSLionel Sambuc 
397*f4a2713aSLionel Sambuc namespace test13 {
398*f4a2713aSLionel Sambuc   struct pod_in_11_only {
399*f4a2713aSLionel Sambuc   private:
400*f4a2713aSLionel Sambuc     long long x;
401*f4a2713aSLionel Sambuc   };
402*f4a2713aSLionel Sambuc 
403*f4a2713aSLionel Sambuc   struct A {
404*f4a2713aSLionel Sambuc     pod_in_11_only a;
405*f4a2713aSLionel Sambuc     char apad;
406*f4a2713aSLionel Sambuc   };
407*f4a2713aSLionel Sambuc 
408*f4a2713aSLionel Sambuc   struct B {
409*f4a2713aSLionel Sambuc   };
410*f4a2713aSLionel Sambuc 
411*f4a2713aSLionel Sambuc   struct C {
412*f4a2713aSLionel Sambuc     char c_pre;
413*f4a2713aSLionel Sambuc     pod_in_11_only c;
414*f4a2713aSLionel Sambuc     char cpad;
415*f4a2713aSLionel Sambuc   };
416*f4a2713aSLionel Sambuc 
417*f4a2713aSLionel Sambuc   struct D {
418*f4a2713aSLionel Sambuc   };
419*f4a2713aSLionel Sambuc 
420*f4a2713aSLionel Sambuc   struct might_use_tail_padding : public A, public B, public C, public D {
421*f4a2713aSLionel Sambuc     char m;
422*f4a2713aSLionel Sambuc   };
423*f4a2713aSLionel Sambuc   SA(0, sizeof(might_use_tail_padding) == 40);
424*f4a2713aSLionel Sambuc }
425*f4a2713aSLionel Sambuc 
426*f4a2713aSLionel Sambuc namespace test14 {
427*f4a2713aSLionel Sambuc   struct pod_in_11_only {
428*f4a2713aSLionel Sambuc   private:
429*f4a2713aSLionel Sambuc     long long x;
430*f4a2713aSLionel Sambuc   };
431*f4a2713aSLionel Sambuc 
432*f4a2713aSLionel Sambuc   struct A {
433*f4a2713aSLionel Sambuc     pod_in_11_only a;
434*f4a2713aSLionel Sambuc     char apad;
435*f4a2713aSLionel Sambuc   };
436*f4a2713aSLionel Sambuc 
437*f4a2713aSLionel Sambuc   struct might_use_tail_padding : public A {
438*f4a2713aSLionel Sambuc     struct {
439*f4a2713aSLionel Sambuc       int : 0;
440*f4a2713aSLionel Sambuc     } x;
441*f4a2713aSLionel Sambuc   };
442*f4a2713aSLionel Sambuc   SA(0, sizeof(might_use_tail_padding) == 16);
443*f4a2713aSLionel Sambuc }
444*f4a2713aSLionel Sambuc 
445*f4a2713aSLionel Sambuc namespace test15 {
446*f4a2713aSLionel Sambuc   struct pod_in_11_only {
447*f4a2713aSLionel Sambuc   private:
448*f4a2713aSLionel Sambuc     long long x;
449*f4a2713aSLionel Sambuc   };
450*f4a2713aSLionel Sambuc 
451*f4a2713aSLionel Sambuc   struct A {
452*f4a2713aSLionel Sambuc     pod_in_11_only a;
453*f4a2713aSLionel Sambuc     char apad;
454*f4a2713aSLionel Sambuc   };
455*f4a2713aSLionel Sambuc 
456*f4a2713aSLionel Sambuc   struct might_use_tail_padding : public A {
457*f4a2713aSLionel Sambuc     struct {
458*f4a2713aSLionel Sambuc       char a:1;
459*f4a2713aSLionel Sambuc       char b:2;
460*f4a2713aSLionel Sambuc       char c:2;
461*f4a2713aSLionel Sambuc       char d:2;
462*f4a2713aSLionel Sambuc       char e:1;
463*f4a2713aSLionel Sambuc     } x;
464*f4a2713aSLionel Sambuc   };
465*f4a2713aSLionel Sambuc   SA(0, sizeof(might_use_tail_padding) == 16);
466*f4a2713aSLionel Sambuc }
467*f4a2713aSLionel Sambuc 
468*f4a2713aSLionel Sambuc namespace test16 {
469*f4a2713aSLionel Sambuc   struct pod_in_11_only {
470*f4a2713aSLionel Sambuc   private:
471*f4a2713aSLionel Sambuc     long long x;
472*f4a2713aSLionel Sambuc   };
473*f4a2713aSLionel Sambuc 
474*f4a2713aSLionel Sambuc   struct A  {
475*f4a2713aSLionel Sambuc     pod_in_11_only a;
476*f4a2713aSLionel Sambuc     char apad;
477*f4a2713aSLionel Sambuc   };
478*f4a2713aSLionel Sambuc 
479*f4a2713aSLionel Sambuc   struct B {
480*f4a2713aSLionel Sambuc     char bpod;
481*f4a2713aSLionel Sambuc     pod_in_11_only b;
482*f4a2713aSLionel Sambuc     char bpad;
483*f4a2713aSLionel Sambuc   };
484*f4a2713aSLionel Sambuc 
485*f4a2713aSLionel Sambuc   struct C : public A, public B {
486*f4a2713aSLionel Sambuc   };
487*f4a2713aSLionel Sambuc 
488*f4a2713aSLionel Sambuc   struct D : public C {
489*f4a2713aSLionel Sambuc   };
490*f4a2713aSLionel Sambuc 
491*f4a2713aSLionel Sambuc   struct might_use_tail_padding : public D {
492*f4a2713aSLionel Sambuc     char m;
493*f4a2713aSLionel Sambuc   };
494*f4a2713aSLionel Sambuc   SA(0, sizeof(might_use_tail_padding) == 40);
495*f4a2713aSLionel Sambuc }
496*f4a2713aSLionel Sambuc 
497*f4a2713aSLionel Sambuc namespace test17 {
498*f4a2713aSLionel Sambuc   struct pod_in_11_only {
499*f4a2713aSLionel Sambuc   private:
500*f4a2713aSLionel Sambuc     long long x;
501*f4a2713aSLionel Sambuc   };
502*f4a2713aSLionel Sambuc 
503*f4a2713aSLionel Sambuc   struct A {
504*f4a2713aSLionel Sambuc     pod_in_11_only a __attribute__((aligned(512)));
505*f4a2713aSLionel Sambuc   };
506*f4a2713aSLionel Sambuc 
507*f4a2713aSLionel Sambuc   struct B {
508*f4a2713aSLionel Sambuc     char bpad;
509*f4a2713aSLionel Sambuc     pod_in_11_only foo;
510*f4a2713aSLionel Sambuc     char btail;
511*f4a2713aSLionel Sambuc   };
512*f4a2713aSLionel Sambuc 
513*f4a2713aSLionel Sambuc   struct C {
514*f4a2713aSLionel Sambuc     char cpad;
515*f4a2713aSLionel Sambuc   };
516*f4a2713aSLionel Sambuc 
517*f4a2713aSLionel Sambuc   struct D {
518*f4a2713aSLionel Sambuc     char dpad;
519*f4a2713aSLionel Sambuc   };
520*f4a2713aSLionel Sambuc 
521*f4a2713aSLionel Sambuc   struct might_use_tail_padding : public A, public B, public C, public D {
522*f4a2713aSLionel Sambuc     char a;
523*f4a2713aSLionel Sambuc   };
524*f4a2713aSLionel Sambuc   SA(0, sizeof(might_use_tail_padding) == 512);
525*f4a2713aSLionel Sambuc }
526*f4a2713aSLionel Sambuc 
527*f4a2713aSLionel Sambuc namespace test18 {
528*f4a2713aSLionel Sambuc   struct pod_in_11_only {
529*f4a2713aSLionel Sambuc   private:
530*f4a2713aSLionel Sambuc     long long x;
531*f4a2713aSLionel Sambuc   };
532*f4a2713aSLionel Sambuc 
533*f4a2713aSLionel Sambuc   struct A  {
534*f4a2713aSLionel Sambuc     pod_in_11_only a;
535*f4a2713aSLionel Sambuc     char apad;
536*f4a2713aSLionel Sambuc   };
537*f4a2713aSLionel Sambuc 
538*f4a2713aSLionel Sambuc   struct B {
539*f4a2713aSLionel Sambuc     char bpod;
540*f4a2713aSLionel Sambuc     pod_in_11_only b;
541*f4a2713aSLionel Sambuc     char bpad;
542*f4a2713aSLionel Sambuc   };
543*f4a2713aSLionel Sambuc 
544*f4a2713aSLionel Sambuc   struct A1  {
545*f4a2713aSLionel Sambuc     pod_in_11_only a;
546*f4a2713aSLionel Sambuc     char apad;
547*f4a2713aSLionel Sambuc   };
548*f4a2713aSLionel Sambuc 
549*f4a2713aSLionel Sambuc   struct B1 {
550*f4a2713aSLionel Sambuc     char bpod;
551*f4a2713aSLionel Sambuc     pod_in_11_only b;
552*f4a2713aSLionel Sambuc     char bpad;
553*f4a2713aSLionel Sambuc   };
554*f4a2713aSLionel Sambuc 
555*f4a2713aSLionel Sambuc   struct C : public A, public B {
556*f4a2713aSLionel Sambuc   };
557*f4a2713aSLionel Sambuc 
558*f4a2713aSLionel Sambuc   struct D : public A1, public B1 {
559*f4a2713aSLionel Sambuc   };
560*f4a2713aSLionel Sambuc 
561*f4a2713aSLionel Sambuc   struct E : public D, public C {
562*f4a2713aSLionel Sambuc   };
563*f4a2713aSLionel Sambuc 
564*f4a2713aSLionel Sambuc   struct F : public E {
565*f4a2713aSLionel Sambuc   };
566*f4a2713aSLionel Sambuc 
567*f4a2713aSLionel Sambuc   struct might_use_tail_padding : public F {
568*f4a2713aSLionel Sambuc     char m;
569*f4a2713aSLionel Sambuc   };
570*f4a2713aSLionel Sambuc   SA(0, sizeof(might_use_tail_padding) == 80);
571*f4a2713aSLionel Sambuc }
572*f4a2713aSLionel Sambuc } // namespace PR16537
573