blob: f2ff9fcfd7c195e6f8f6606e317042bbe1ff39d8 [file] [log] [blame]
Daniel Dunbara5728872009-12-15 20:14:24 +00001// RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -fsyntax-only -verify
Andy Gibbs8e8fb3b2012-10-19 12:44:48 +00002// expected-no-diagnostics
Anders Carlsson74cbe222009-07-19 00:18:47 +00003
4#define SA(n, p) int a##n[(p) ? 1 : -1]
5
6struct A {
7 int a;
8 char b;
9};
10
11SA(0, sizeof(A) == 8);
12
13struct B : A {
14 char c;
15};
16
17SA(1, sizeof(B) == 12);
18
19struct C {
20// Make fields private so C won't be a POD type.
21private:
22 int a;
23 char b;
24};
25
26SA(2, sizeof(C) == 8);
27
28struct D : C {
29 char c;
30};
31
32SA(3, sizeof(D) == 8);
Anders Carlsson227aad52009-07-28 17:14:18 +000033
34struct __attribute__((packed)) E {
35 char b;
36 int a;
37};
38
39SA(4, sizeof(E) == 5);
40
41struct __attribute__((packed)) F : E {
42 char d;
43};
44
45SA(5, sizeof(F) == 6);
Anders Carlssonb237fd62009-09-17 04:42:56 +000046
47struct G { G(); };
48struct H : G { };
49
50SA(6, sizeof(H) == 1);
Anders Carlssone4fc0d92009-11-22 19:13:51 +000051
Douglas Gregor0b4c9b52010-03-29 14:42:08 +000052struct I {
53 char b;
54 int a;
55} __attribute__((packed));
56
57SA(6_1, sizeof(I) == 5);
58
Anders Carlssone4fc0d92009-11-22 19:13:51 +000059// PR5580
60namespace PR5580 {
61
62class A { bool iv0 : 1; };
63SA(7, sizeof(A) == 1);
64
65class B : A { bool iv0 : 1; };
66SA(8, sizeof(B) == 2);
67
68struct C { bool iv0 : 1; };
69SA(9, sizeof(C) == 1);
70
71struct D : C { bool iv0 : 1; };
72SA(10, sizeof(D) == 2);
73
74}
Anders Carlsson3cd09cc2010-05-29 19:44:50 +000075
76namespace Test1 {
77
78// Test that we don't assert on this hierarchy.
79struct A { };
80struct B : A { virtual void b(); };
81class C : virtual A { int c; };
82struct D : virtual B { };
83struct E : C, virtual D { };
84class F : virtual E { };
85struct G : virtual E, F { };
86
87SA(0, sizeof(G) == 24);
Anders Carlsson83a45e72010-05-30 06:52:33 +000088
89}
90
91namespace Test2 {
92
93// Test that this somewhat complex class structure is laid out correctly.
94struct A { };
95struct B : A { virtual void b(); };
96struct C : virtual B { };
97struct D : virtual A { };
98struct E : virtual B, D { };
99struct F : E, virtual C { };
100struct G : virtual F, A { };
101struct H { G g; };
102
103SA(0, sizeof(H) == 24);
104
Anders Carlsson3cd09cc2010-05-29 19:44:50 +0000105}