ms_class_layout.cpp revision 2fe363622c32c471e8a68c68ba5cc372644f24fb
1// 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
177