blob: 79e72f4b16159898814d1a2c1c948647b5afd46b [file] [log] [blame]
Warren Huntbd1b0c62013-10-14 19:08:58 +00001// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only -cxx-abi microsoft %s 2>&1 \
2// RUN: | FileCheck %s
3
4extern "C" int printf(const char *fmt, ...);
5
6struct B0 { int a; B0() : a(0xf00000B0) { printf("B0 = %p\n", this); } virtual void f() { printf("B0"); } };
7struct B1 { int a; B1() : a(0xf00000B1) { printf("B1 = %p\n", this); } virtual void g() { printf("B1"); } };
8struct B2 { int a; B2() : a(0xf00000B2) { printf("B1 = %p\n", this); } };
9struct B0X { int a; B0X() : a(0xf00000B0) {} };
10struct B1X { int a; B1X() : a(0xf00000B1) {} virtual void f() { printf("B0"); } };
11struct B2X : virtual B1X { int a; B2X() : a(0xf00000B2) {} };
12
13struct A : virtual B0 {
14};
15
16// CHECK: *** Dumping AST Record Layout
17// CHECK: 0 | struct A
18// CHECK: 0 | (A vbtable pointer)
19// CHECK: 4 | struct B0 (virtual base)
20// CHECK: 4 | (B0 vftable pointer)
21// CHECK: 8 | int a
22// CHECK: | [sizeof=12, align=4
23// CHECK: | nvsize=4, nvalign=4]
24
25struct B : virtual B0 {
26 virtual void f() { printf("B"); }
27};
28
29// CHECK: *** Dumping AST Record Layout
30// CHECK: 0 | struct B
31// CHECK: 0 | (B vbtable pointer)
32// CHECK: 4 | struct B0 (virtual base)
33// CHECK: 4 | (B0 vftable pointer)
34// CHECK: 8 | int a
35// CHECK: | [sizeof=12, align=4
36// CHECK: | nvsize=4, nvalign=4]
37
38struct C : virtual B0 {
39 virtual void g() { printf("A"); }
40};
41
42// CHECK: *** Dumping AST Record Layout
43// CHECK: 0 | struct C
44// CHECK: 0 | (C vftable pointer)
45// CHECK: 4 | (C vbtable pointer)
46// CHECK: 8 | struct B0 (virtual base)
47// CHECK: 8 | (B0 vftable pointer)
48// CHECK: 12 | int a
49// CHECK: | [sizeof=16, align=4
50// CHECK: | nvsize=8, nvalign=4]
51
52struct D : virtual B2, virtual B0 {
53 virtual void f() { printf("D"); }
54 virtual void g() { printf("D"); }
55};
56
57// CHECK: *** Dumping AST Record Layout
58// CHECK: 0 | struct D
59// CHECK: 0 | (D vftable pointer)
60// CHECK: 4 | (D vbtable pointer)
61// CHECK: 8 | struct B2 (virtual base)
62// CHECK: 8 | int a
63// CHECK: 12 | struct B0 (virtual base)
64// CHECK: 12 | (B0 vftable pointer)
65// CHECK: 16 | int a
66// CHECK: | [sizeof=20, align=4
67// CHECK: | nvsize=8, nvalign=4]
68
69struct E : B0, virtual B1 {
70 virtual void f() { printf("E"); }
71 virtual void g() { printf("E"); }
72};
73
74// CHECK: *** Dumping AST Record Layout
75// CHECK: 0 | struct E
76// CHECK: 0 | struct B0 (primary base)
77// CHECK: 0 | (B0 vftable pointer)
78// CHECK: 4 | int a
79// CHECK: 8 | (E vbtable pointer)
80// CHECK: 12 | struct B1 (virtual base)
81// CHECK: 12 | (B1 vftable pointer)
82// CHECK: 16 | int a
83// CHECK: | [sizeof=20, align=4
84// CHECK: | nvsize=12, nvalign=4]
85
86struct F : virtual B0, virtual B1 {
87};
88
89// CHECK: *** Dumping AST Record Layout
90// CHECK: 0 | struct F
91// CHECK: 0 | (F vbtable pointer)
92// CHECK: 4 | struct B0 (virtual base)
93// CHECK: 4 | (B0 vftable pointer)
94// CHECK: 8 | int a
95// CHECK: 12 | struct B1 (virtual base)
96// CHECK: 12 | (B1 vftable pointer)
97// CHECK: 16 | int a
98// CHECK: | [sizeof=20, align=4
99// CHECK: | nvsize=4, nvalign=4]
100
101struct AX : B0X, B1X { int a; AX() : a(0xf000000A) {} virtual void f() { printf("A"); } };
102
103// CHECK: *** Dumping AST Record Layout
104// CHECK: 0 | struct AX
105// CHECK: 8 | struct B0X (base)
106// CHECK: 8 | int a
107// CHECK: 0 | struct B1X (primary base)
108// CHECK: 0 | (B1X vftable pointer)
109// CHECK: 4 | int a
110// CHECK: 12 | int a
111// CHECK: | [sizeof=16, align=4
112// CHECK: | nvsize=16, nvalign=4]
113
114struct BX : B0X, B1X { int a; BX() : a(0xf000000B) {} virtual void g() { printf("B"); } };
115
116// CHECK: *** Dumping AST Record Layout
117// CHECK: 0 | struct BX
118// CHECK: 8 | struct B0X (base)
119// CHECK: 8 | int a
120// CHECK: 0 | struct B1X (primary base)
121// CHECK: 0 | (B1X vftable pointer)
122// CHECK: 4 | int a
123// CHECK: 12 | int a
124// CHECK: | [sizeof=16, align=4
125// CHECK: | nvsize=16, nvalign=4]
126
127struct CX : B0X, B2X { int a; CX() : a(0xf000000C) {} virtual void g() { printf("C"); } };
128
129// CHECK: *** Dumping AST Record Layout
130// CHECK: 0 | struct CX
131// CHECK: 0 | (CX vftable pointer)
132// CHECK: 4 | struct B0X (base)
133// CHECK: 4 | int a
134// CHECK: 8 | struct B2X (base)
135// CHECK: 8 | (B2X vbtable pointer)
136// CHECK: 12 | int a
137// CHECK: 16 | int a
138// CHECK: 20 | struct B1X (virtual base)
139// CHECK: 20 | (B1X vftable pointer)
140// CHECK: 24 | int a
141// CHECK: | [sizeof=28, align=4
142// CHECK: | nvsize=20, nvalign=4]
143
144struct DX : virtual B1X { int a; DX() : a(0xf000000D) {} virtual void f() { printf("D"); } };
145
146// CHECK: *** Dumping AST Record Layout
147// CHECK: 0 | struct DX
148// CHECK: 0 | (DX vbtable pointer)
149// CHECK: 4 | int a
150// CHECK: 8 | (vtordisp for vbase B1X)
151// CHECK: 12 | struct B1X (virtual base)
152// CHECK: 12 | (B1X vftable pointer)
153// CHECK: 16 | int a
154// CHECK: | [sizeof=20, align=4
155// CHECK: | nvsize=8, nvalign=4]
156
157struct EX : virtual B1X { int a; EX() : a(0xf000000E) {} virtual void g() { printf("E"); } };
158
159// CHECK: *** Dumping AST Record Layout
160// CHECK: 0 | struct EX
161// CHECK: 0 | (EX vftable pointer)
162// CHECK: 4 | (EX vbtable pointer)
163// CHECK: 8 | int a
164// CHECK: 12 | struct B1X (virtual base)
165// CHECK: 12 | (B1X vftable pointer)
166// CHECK: 16 | int a
167// CHECK: | [sizeof=20, align=4
168// CHECK: | nvsize=12, nvalign=4]
169
170struct FX : virtual B1X { int a; FX() : a(0xf000000F) {} };
171
172// CHECK: *** Dumping AST Record Layout
173// CHECK: 0 | struct FX
174// CHECK: 0 | (FX vbtable pointer)
175// CHECK: 4 | int a
176// CHECK: 8 | struct B1X (virtual base)
177// CHECK: 8 | (B1X vftable pointer)
178// CHECK: 12 | int a
179// CHECK: | [sizeof=16, align=4
180// CHECK: | nvsize=8, nvalign=4]
181
182int a[
183sizeof(A)+
184sizeof(B)+
185sizeof(C)+
186sizeof(D)+
187sizeof(E)+
188sizeof(F)+
189sizeof(AX)+
190sizeof(BX)+
191sizeof(CX)+
192sizeof(DX)+
193sizeof(EX)+
194sizeof(FX)];