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