blob: 13c90b0c9ed1c65068a8d7386a10f3fa5ee82194 [file] [log] [blame]
Eli Friedman2fe36362011-09-27 19:12:27 +00001// RUN: %clang_cc1 -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -cxx-abi microsoft %s 2>&1 \
2// RUN: | FileCheck %s
3
4#pragma pack(push, 8)
5
6class B {
7public:
8 virtual void b(){}
9 int b_field;
10protected:
11private:
12};
13
14class A : public B {
15public:
16 int a_field;
17 virtual void a(){}
18 char one;
19protected:
20private:
21};
22
23class D {
24public:
25 virtual void b(){}
26 double a;
27};
28
29class C : public virtual A,
30 public D, public B {
31public:
32 double c1_field;
33 int c2_field;
34 double c3_field;
35 int c4_field;
36 virtual void foo(){}
37 virtual void bar(){}
38protected:
39private:
40};
41
42struct BaseStruct
43{
44 BaseStruct(){}
45 double v0;
46 float v1;
47 C fg;
48};
49
50struct DerivedStruct : public BaseStruct {
51 int x;
52};
53
54struct G
55{
56 virtual ~G(){}
57 int a;
58 double b;
59};
60
61#pragma pack(pop)
62
63// This needs only for building layouts.
64// Without this clang doesn`t dump record layouts.
65int main() {
66 // This avoid "Can't yet mangle constructors!" for MS ABI.
67 C* c;
68 c->foo();
69 DerivedStruct* v;
70 G* g;
71 BaseStruct* u;
72 return 0;
73}
74
75// CHECK: 0 | class D
76// CHECK-NEXT: 0 | (D vtable pointer)
77// CHECK-NEXT: 8 | double a
78
79// CHECK-NEXT: sizeof=16, dsize=16, align=8
80// CHECK-NEXT: nvsize=16, nvalign=8
81
82// CHECK: 0 | class B
83// CHECK-NEXT: 0 | (B vtable pointer)
84// CHECK-NEXT: 4 | int b_field
85
86// CHECK-NEXT: sizeof=8, dsize=8, align=4
87// CHECK-NEXT: nvsize=8, nvalign=4
88
89// CHECK: 0 | class A
90// CHECK-NEXT: 0 | class B (primary base)
91// CHECK-NEXT: 0 | (B vtable pointer)
92// CHECK-NEXT: 4 | int b_field
93// CHECK-NEXT: 8 | int a_field
94// CHECK-NEXT: 12 | char one
95
96// CHECK-NEXT: sizeof=16, dsize=16, align=4
97// CHECK-NEXT: nvsize=16, nvalign=4
98
99// CHECK: 0 | class C
100// CHECK-NEXT: 0 | class D (primary base)
101// CHECK-NEXT: 0 | (D vtable pointer)
102// CHECK-NEXT: 8 | double a
103// CHECK-NEXT: 16 | class B (base)
104// CHECK-NEXT: 16 | (B vtable pointer)
105// CHECK-NEXT: 20 | int b_field
106// CHECK-NEXT: 24 | (C vbtable pointer)
107// CHECK-NEXT: 32 | double c1_field
108// CHECK-NEXT: 40 | int c2_field
109// CHECK-NEXT: 48 | double c3_field
110// CHECK-NEXT: 56 | int c4_field
111// CHECK-NEXT: 64 | class A (virtual base)
112// CHECK-NEXT: 64 | class B (primary base)
113// CHECK-NEXT: 64 | (B vtable pointer)
114// CHECK-NEXT: 68 | int b_field
115// CHECK-NEXT: 72 | int a_field
116// CHECK-NEXT: 76 | char one
117
118// CHECK-NEXT: sizeof=80, dsize=80, align=8
119// CHECK-NEXT: nvsize=80, nvalign=8
120
121// CHECK: 0 | struct BaseStruct
122// CHECK-NEXT: 0 | double v0
123// CHECK-NEXT: 8 | float v1
124// CHECK-NEXT: 16 | class C fg
125// CHECK-NEXT: 16 | class D (primary base)
126// CHECK-NEXT: 16 | (D vtable pointer)
127// CHECK-NEXT: 24 | double a
128// CHECK-NEXT: 32 | class B (base)
129// CHECK-NEXT: 32 | (B vtable pointer)
130// CHECK-NEXT: 36 | int b_field
131// CHECK-NEXT: 40 | (C vbtable pointer)
132// CHECK-NEXT: 48 | double c1_field
133// CHECK-NEXT: 56 | int c2_field
134// CHECK-NEXT: 64 | double c3_field
135// CHECK-NEXT: 72 | int c4_field
136// CHECK-NEXT: 80 | class A (virtual base)
137// CHECK-NEXT: 80 | class B (primary base)
138// CHECK-NEXT: 80 | (B vtable pointer)
139// CHECK-NEXT: 84 | int b_field
140// CHECK-NEXT: 88 | int a_field
141// CHECK-NEXT: 92 | char one
142
143// CHECK-NEXT: sizeof=80, dsize=80, align=8
144// CHECK-NEXT: nvsize=80, nvalign=8
145
146// CHECK: sizeof=96, dsize=96, align=8
147// CHECK-NEXT: nvsize=96, nvalign=8
148
149// CHECK: 0 | struct DerivedStruct
150// CHECK-NEXT: 0 | struct BaseStruct (base)
151// CHECK-NEXT: 0 | double v0
152// CHECK-NEXT: 8 | float v1
153// CHECK-NEXT: 16 | class C fg
154// CHECK-NEXT: 16 | class D (primary base)
155// CHECK-NEXT: 16 | (D vtable pointer)
156// CHECK-NEXT: 24 | double a
157// CHECK-NEXT: 32 | class B (base)
158// CHECK-NEXT: 32 | (B vtable pointer)
159// CHECK-NEXT: 36 | int b_field
160// CHECK-NEXT: 40 | (C vbtable pointer)
161// CHECK-NEXT: 48 | double c1_field
162// CHECK-NEXT: 56 | int c2_field
163// CHECK-NEXT: 64 | double c3_field
164// CHECK-NEXT: 72 | int c4_field
165// CHECK-NEXT: 80 | class A (virtual base)
166// CHECK-NEXT: 80 | class B (primary base)
167// CHECK-NEXT: 80 | (B vtable pointer)
168// CHECK-NEXT: 84 | int b_field
169// CHECK-NEXT: 88 | int a_field
170// CHECK-NEXT: 92 | char one
171// CHECK-NEXT: sizeof=80, dsize=80, align=8
172// CHECK-NEXT: nvsize=80, nvalign=8
173
174// CHECK: 96 | int x
175// CHECK-NEXT: sizeof=104, dsize=104, align=8
176// CHECK-NEXT: nvsize=104, nvalign=8