1 // RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -fsyntax-only -verify -std=c++98 -Wno-inaccessible-base
2 // RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base
3 // expected-no-diagnostics
5 #define SA(n, p) int a##n[(p) ? 1 : -1]
12 SA(0, sizeof(A) == 8);
18 SA(1, sizeof(B) == 12);
21 // Make fields private so C won't be a POD type.
27 SA(2, sizeof(C) == 8);
33 SA(3, sizeof(D) == 8);
35 struct __attribute__((packed)) E {
40 SA(4, sizeof(E) == 5);
42 struct __attribute__((packed)) F : E {
46 SA(5, sizeof(F) == 6);
51 SA(6, sizeof(H) == 1);
56 } __attribute__((packed));
58 SA(6_1, sizeof(I) == 5);
63 class A { bool iv0 : 1; };
64 SA(7, sizeof(A) == 1);
66 class B : A { bool iv0 : 1; };
67 SA(8, sizeof(B) == 2);
69 struct C { bool iv0 : 1; };
70 SA(9, sizeof(C) == 1);
72 struct D : C { bool iv0 : 1; };
73 SA(10, sizeof(D) == 2);
79 // Test that we don't assert on this hierarchy.
81 struct B : A { virtual void b(); };
82 class C : virtual A { int c; };
83 struct D : virtual B { };
84 struct E : C, virtual D { };
85 class F : virtual E { };
86 struct G : virtual E, F { };
88 SA(0, sizeof(G) == 24);
94 // Test that this somewhat complex class structure is laid out correctly.
96 struct B : A { virtual void b(); };
97 struct C : virtual B { };
98 struct D : virtual A { };
99 struct E : virtual B, D { };
100 struct F : E, virtual C { };
101 struct G : virtual F, A { };
104 SA(0, sizeof(H) == 24);
110 struct pod_in_11_only {
115 struct tail_padded_pod_in_11_only {
116 pod_in_11_only pod11;
120 struct might_use_tail_padding : public tail_padded_pod_in_11_only {
121 char may_go_into_tail_padding;
124 SA(0, sizeof(might_use_tail_padding) == 16);
128 struct pod_in_11_only {
133 struct tail_padded_pod_in_11_only {
134 pod_in_11_only pod11 __attribute__((aligned(16)));
137 struct might_use_tail_padding : public tail_padded_pod_in_11_only {
138 char may_go_into_tail_padding;
141 SA(0, sizeof(might_use_tail_padding) == 16);
145 struct pod_in_11_only {
150 struct tail_padded_pod_in_11_only {
151 pod_in_11_only pod11;
159 struct might_use_tail_padding : public tail_padded_pod_in_11_only, public second_base {
162 SA(0, sizeof(might_use_tail_padding) == 16);
166 struct pod_in_11_only {
171 struct tail_padded_pod_in_11_only {
172 pod_in_11_only pod11;
180 struct might_use_tail_padding : public tail_padded_pod_in_11_only, public second_base {
181 char may_go_into_tail_padding;
183 SA(0, sizeof(might_use_tail_padding) == 16);
187 struct pod_in_11_only {
192 struct pod_in_11_only2 {
197 struct tail_padded_pod_in_11_only {
198 pod_in_11_only pod11;
207 struct might_use_tail_padding : public tail_padded_pod_in_11_only, public second_base {
208 char may_go_into_tail_padding;
210 SA(0, sizeof(might_use_tail_padding) == 32);
214 struct pod_in_11_only {
219 struct pod_in_11_only2 {
224 struct tail_padded_pod_in_11_only {
225 pod_in_11_only pod11;
234 struct might_use_tail_padding : public tail_padded_pod_in_11_only, public second_base {
235 char may_go_into_tail_padding;
237 SA(0, sizeof(might_use_tail_padding) == 32);
241 struct pod_in_11_only {
246 struct tail_padded_pod_in_11_only {
247 pod_in_11_only pod11;
248 pod_in_11_only pod12;
252 struct might_use_tail_padding : public tail_padded_pod_in_11_only {
253 char may_go_into_tail_padding;
256 SA(0, sizeof(might_use_tail_padding) == 24);
260 struct pod_in_11_only {
265 struct tail_padded_pod_in_11_only {
266 pod_in_11_only pod11;
270 struct another_layer {
271 tail_padded_pod_in_11_only pod;
275 struct might_use_tail_padding : public another_layer {
276 char may_go_into_tail_padding;
279 SA(0, sizeof(might_use_tail_padding) == 24);
283 struct pod_in_11_only {
288 struct tail_padded_pod_in_11_only {
289 pod_in_11_only pod11;
293 struct another_layer : tail_padded_pod_in_11_only {
296 struct might_use_tail_padding : public another_layer {
297 char may_go_into_tail_padding;
300 SA(0, sizeof(might_use_tail_padding) == 16);
304 struct pod_in_11_only {
327 struct might_use_tail_padding : public A, public B, public C, public D {
330 SA(0, sizeof(might_use_tail_padding) == 32);
334 struct pod_in_11_only {
362 struct might_use_tail_padding : public A, public B, public C, public D {
366 SA(0, sizeof(might_use_tail_padding) == 88);
370 struct pod_in_11_only {
376 pod_in_11_only a __attribute__((aligned(128)));
391 struct might_use_tail_padding : public A, public B, public C, public D {
394 SA(0, sizeof(might_use_tail_padding) == 128);
398 struct pod_in_11_only {
420 struct might_use_tail_padding : public A, public B, public C, public D {
423 SA(0, sizeof(might_use_tail_padding) == 40);
427 struct pod_in_11_only {
437 struct might_use_tail_padding : public A {
442 SA(0, sizeof(might_use_tail_padding) == 16);
446 struct pod_in_11_only {
456 struct might_use_tail_padding : public A {
465 SA(0, sizeof(might_use_tail_padding) == 16);
469 struct pod_in_11_only {
485 struct C : public A, public B {
488 struct D : public C {
491 struct might_use_tail_padding : public D {
494 SA(0, sizeof(might_use_tail_padding) == 40);
498 struct pod_in_11_only {
504 pod_in_11_only a __attribute__((aligned(512)));
521 struct might_use_tail_padding : public A, public B, public C, public D {
524 SA(0, sizeof(might_use_tail_padding) == 512);
528 struct pod_in_11_only {
555 struct C : public A, public B {
558 struct D : public A1, public B1 {
561 struct E : public D, public C {
564 struct F : public E {
567 struct might_use_tail_padding : public F {
570 SA(0, sizeof(might_use_tail_padding) == 80);
572 } // namespace PR16537