xref: /aosp_15_r20/external/clang/test/Layout/ms-x86-vfvb-sharing.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only %s 2>&1 \
2*67e74705SXin Li // RUN:            | FileCheck %s
3*67e74705SXin Li // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only %s 2>/dev/null \
4*67e74705SXin Li // RUN:            | FileCheck %s -check-prefix CHECK-X64
5*67e74705SXin Li 
6*67e74705SXin Li extern "C" int printf(const char *fmt, ...);
7*67e74705SXin Li 
B0B08*67e74705SXin Li struct B0 { int a; B0() : a(0xf00000B0) { printf("B0 = %p\n", this); } };
B1B19*67e74705SXin Li struct B1 { int a; B1() : a(0xf00000B1) { printf("B1 = %p\n", this); } };
B2B210*67e74705SXin Li struct B2 { B2() { printf("B2 = %p\n", this); } virtual void g() { printf("B2"); } };
B3B311*67e74705SXin Li struct B3 : virtual B1 { B3() { printf("B3 = %p\n", this); } };
B4B412*67e74705SXin Li struct B4 : virtual B1 { B4() { printf("B4 = %p\n", this); } virtual void g() { printf("B4"); } };
13*67e74705SXin Li 
14*67e74705SXin Li struct A : B0, virtual B1 {
15*67e74705SXin Li 	__declspec(align(16)) int a;
AA16*67e74705SXin Li 	A() : a(0xf000000A) { printf(" A = %p\n\n", this); }
fA17*67e74705SXin Li 	virtual void f() { printf("A"); }
18*67e74705SXin Li };
19*67e74705SXin Li 
20*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
21*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
22*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
23*67e74705SXin Li // CHECK-NEXT:    0 | struct A
24*67e74705SXin Li // CHECK-NEXT:    0 |   (A vftable pointer)
25*67e74705SXin Li // CHECK-NEXT:   16 |   struct B0 (base)
26*67e74705SXin Li // CHECK-NEXT:   16 |     int a
27*67e74705SXin Li // CHECK-NEXT:   20 |   (A vbtable pointer)
28*67e74705SXin Li // CHECK-NEXT:   48 |   int a
29*67e74705SXin Li // CHECK-NEXT:   64 |   struct B1 (virtual base)
30*67e74705SXin Li // CHECK-NEXT:   64 |     int a
31*67e74705SXin Li // CHECK-NEXT:      | [sizeof=80, align=16
32*67e74705SXin Li // CHECK-NEXT:      |  nvsize=64, nvalign=16]
33*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
34*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
35*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
36*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct A
37*67e74705SXin Li // CHECK-X64-NEXT:    0 |   (A vftable pointer)
38*67e74705SXin Li // CHECK-X64-NEXT:   16 |   struct B0 (base)
39*67e74705SXin Li // CHECK-X64-NEXT:   16 |     int a
40*67e74705SXin Li // CHECK-X64-NEXT:   24 |   (A vbtable pointer)
41*67e74705SXin Li // CHECK-X64-NEXT:   48 |   int a
42*67e74705SXin Li // CHECK-X64-NEXT:   64 |   struct B1 (virtual base)
43*67e74705SXin Li // CHECK-X64-NEXT:   64 |     int a
44*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=80, align=16
45*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=64, nvalign=16]
46*67e74705SXin Li 
47*67e74705SXin Li struct B : B2, B0, virtual B1 {
48*67e74705SXin Li 	__declspec(align(16)) int a;
BB49*67e74705SXin Li 	B() : a(0xf000000B) { printf(" B = %p\n\n", this); }
fB50*67e74705SXin Li 	virtual void f() { printf("B"); }
51*67e74705SXin Li };
52*67e74705SXin Li 
53*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
54*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
55*67e74705SXin Li // CHECK-NEXT:    0 | struct B
56*67e74705SXin Li // CHECK-NEXT:    0 |   struct B2 (primary base)
57*67e74705SXin Li // CHECK-NEXT:    0 |     (B2 vftable pointer)
58*67e74705SXin Li // CHECK-NEXT:    4 |   struct B0 (base)
59*67e74705SXin Li // CHECK-NEXT:    4 |     int a
60*67e74705SXin Li // CHECK-NEXT:    8 |   (B vbtable pointer)
61*67e74705SXin Li // CHECK-NEXT:   32 |   int a
62*67e74705SXin Li // CHECK-NEXT:   48 |   struct B1 (virtual base)
63*67e74705SXin Li // CHECK-NEXT:   48 |     int a
64*67e74705SXin Li // CHECK-NEXT:      | [sizeof=64, align=16
65*67e74705SXin Li // CHECK-NEXT:      |  nvsize=48, nvalign=16]
66*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
67*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
68*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct B
69*67e74705SXin Li // CHECK-X64-NEXT:    0 |   struct B2 (primary base)
70*67e74705SXin Li // CHECK-X64-NEXT:    0 |     (B2 vftable pointer)
71*67e74705SXin Li // CHECK-X64-NEXT:    8 |   struct B0 (base)
72*67e74705SXin Li // CHECK-X64-NEXT:    8 |     int a
73*67e74705SXin Li // CHECK-X64-NEXT:   16 |   (B vbtable pointer)
74*67e74705SXin Li // CHECK-X64-NEXT:   32 |   int a
75*67e74705SXin Li // CHECK-X64-NEXT:   48 |   struct B1 (virtual base)
76*67e74705SXin Li // CHECK-X64-NEXT:   48 |     int a
77*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=64, align=16
78*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
79*67e74705SXin Li 
80*67e74705SXin Li struct C : B3, B0, virtual B1 {
81*67e74705SXin Li 	__declspec(align(16)) int a;
CC82*67e74705SXin Li 	C() : a(0xf000000C) { printf(" C = %p\n\n", this); }
fC83*67e74705SXin Li 	virtual void f() { printf("C"); }
84*67e74705SXin Li };
85*67e74705SXin Li 
86*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
87*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
88*67e74705SXin Li // CHECK-NEXT:    0 | struct C
89*67e74705SXin Li // CHECK-NEXT:    0 |   (C vftable pointer)
90*67e74705SXin Li // CHECK-NEXT:   16 |   struct B3 (base)
91*67e74705SXin Li // CHECK-NEXT:   16 |     (B3 vbtable pointer)
92*67e74705SXin Li // CHECK-NEXT:   20 |   struct B0 (base)
93*67e74705SXin Li // CHECK-NEXT:   20 |     int a
94*67e74705SXin Li // CHECK-NEXT:   32 |   int a
95*67e74705SXin Li // CHECK-NEXT:   48 |   struct B1 (virtual base)
96*67e74705SXin Li // CHECK-NEXT:   48 |     int a
97*67e74705SXin Li // CHECK-NEXT:      | [sizeof=64, align=16
98*67e74705SXin Li // CHECK-NEXT:      |  nvsize=48, nvalign=16]
99*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
100*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
101*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct C
102*67e74705SXin Li // CHECK-X64-NEXT:    0 |   (C vftable pointer)
103*67e74705SXin Li // CHECK-X64-NEXT:   16 |   struct B3 (base)
104*67e74705SXin Li // CHECK-X64-NEXT:   16 |     (B3 vbtable pointer)
105*67e74705SXin Li // CHECK-X64-NEXT:   24 |   struct B0 (base)
106*67e74705SXin Li // CHECK-X64-NEXT:   24 |     int a
107*67e74705SXin Li // CHECK-X64-NEXT:   32 |   int a
108*67e74705SXin Li // CHECK-X64-NEXT:   48 |   struct B1 (virtual base)
109*67e74705SXin Li // CHECK-X64-NEXT:   48 |     int a
110*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=64, align=16
111*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
112*67e74705SXin Li 
113*67e74705SXin Li struct D : B4, B0, virtual B1 {
114*67e74705SXin Li 	__declspec(align(16)) int a;
DD115*67e74705SXin Li 	D() : a(0xf000000D) { printf(" D = %p\n\n", this); }
fD116*67e74705SXin Li 	virtual void f() { printf("D"); }
117*67e74705SXin Li };
118*67e74705SXin Li 
119*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
120*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
121*67e74705SXin Li // CHECK-NEXT:    0 | struct D
122*67e74705SXin Li // CHECK-NEXT:    0 |   struct B4 (primary base)
123*67e74705SXin Li // CHECK-NEXT:    0 |     (B4 vftable pointer)
124*67e74705SXin Li // CHECK-NEXT:    4 |     (B4 vbtable pointer)
125*67e74705SXin Li // CHECK-NEXT:    8 |   struct B0 (base)
126*67e74705SXin Li // CHECK-NEXT:    8 |     int a
127*67e74705SXin Li // CHECK-NEXT:   16 |   int a
128*67e74705SXin Li // CHECK-NEXT:   32 |   struct B1 (virtual base)
129*67e74705SXin Li // CHECK-NEXT:   32 |     int a
130*67e74705SXin Li // CHECK-NEXT:      | [sizeof=48, align=16
131*67e74705SXin Li // CHECK-NEXT:      |  nvsize=32, nvalign=16]
132*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
133*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
134*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct D
135*67e74705SXin Li // CHECK-X64-NEXT:    0 |   struct B4 (primary base)
136*67e74705SXin Li // CHECK-X64-NEXT:    0 |     (B4 vftable pointer)
137*67e74705SXin Li // CHECK-X64-NEXT:    8 |     (B4 vbtable pointer)
138*67e74705SXin Li // CHECK-X64-NEXT:   16 |   struct B0 (base)
139*67e74705SXin Li // CHECK-X64-NEXT:   16 |     int a
140*67e74705SXin Li // CHECK-X64-NEXT:   32 |   int a
141*67e74705SXin Li // CHECK-X64-NEXT:   48 |   struct B1 (virtual base)
142*67e74705SXin Li // CHECK-X64-NEXT:   48 |     int a
143*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=64, align=16
144*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
145*67e74705SXin Li 
146*67e74705SXin Li int a[
147*67e74705SXin Li sizeof(A)+
148*67e74705SXin Li sizeof(B)+
149*67e74705SXin Li sizeof(C)+
150*67e74705SXin Li sizeof(D)];
151