blob: 2b3d08e44c6712ef8583ac1ce347f8a2b7a6bb1e [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
Warren Hunt55d8e822013-10-23 23:53:07 +00003// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fdump-record-layouts -fsyntax-only -cxx-abi microsoft %s 2>/dev/null \
4// RUN: | FileCheck %s -check-prefix CHECK-X64
Warren Huntbd1b0c62013-10-14 19:08:58 +00005
6extern "C" int printf(const char *fmt, ...);
7
8struct B0 { int a; B0() : a(0xf00000B0) { printf("B0 = %p\n", this); } };
9struct B1 { int a; B1() : a(0xf00000B1) { printf("B1 = %p\n", this); } };
10struct B2 { B2() { printf("B2 = %p\n", this); } virtual void g() { printf("B2"); } };
11struct B3 : virtual B1 { B3() { printf("B3 = %p\n", this); } };
12struct B4 : virtual B1 { B4() { printf("B4 = %p\n", this); } virtual void g() { printf("B4"); } };
13
14struct A : B0, virtual B1 {
15 __declspec(align(16)) int a;
16 A() : a(0xf000000A) { printf(" A = %p\n\n", this); }
17 virtual void f() { printf("A"); }
18};
19
20// CHECK: *** Dumping AST Record Layout
21// CHECK: 0 | struct A
22// CHECK: 0 | (A vftable pointer)
23// CHECK: 16 | struct B0 (base)
24// CHECK: 16 | int a
25// CHECK: 20 | (A vbtable pointer)
26// CHECK: 48 | int a
27// CHECK: 64 | struct B1 (virtual base)
28// CHECK: 64 | int a
29// CHECK: | [sizeof=80, align=16
30// CHECK: | nvsize=64, nvalign=16]
Warren Hunt55d8e822013-10-23 23:53:07 +000031// CHECK-X64: *** Dumping AST Record Layout
32// CHECK-X64: 0 | struct A
33// CHECK-X64: 0 | (A vftable pointer)
34// CHECK-X64: 8 | struct B0 (base)
35// CHECK-X64: 8 | int a
36// CHECK-X64: 16 | (A vbtable pointer)
37// CHECK-X64: 32 | int a
38// CHECK-X64: 48 | struct B1 (virtual base)
39// CHECK-X64: 48 | int a
40// CHECK-X64: | [sizeof=64, align=16
41// CHECK-X64: | nvsize=48, nvalign=16]
Warren Huntbd1b0c62013-10-14 19:08:58 +000042
43struct B : B2, B0, virtual B1 {
44 __declspec(align(16)) int a;
45 B() : a(0xf000000B) { printf(" B = %p\n\n", this); }
46 virtual void f() { printf("B"); }
47};
48
49// CHECK: *** Dumping AST Record Layout
50// CHECK: 0 | struct B
51// CHECK: 0 | struct B2 (primary base)
52// CHECK: 0 | (B2 vftable pointer)
53// CHECK: 4 | struct B0 (base)
54// CHECK: 4 | int a
55// CHECK: 8 | (B vbtable pointer)
56// CHECK: 32 | int a
57// CHECK: 48 | struct B1 (virtual base)
58// CHECK: 48 | int a
59// CHECK: | [sizeof=64, align=16
60// CHECK: | nvsize=48, nvalign=16]
Warren Hunt55d8e822013-10-23 23:53:07 +000061// CHECK-X64: *** Dumping AST Record Layout
62// CHECK-X64: 0 | struct B
63// CHECK-X64: 0 | struct B2 (primary base)
64// CHECK-X64: 0 | (B2 vftable pointer)
65// CHECK-X64: 8 | struct B0 (base)
66// CHECK-X64: 8 | int a
67// CHECK-X64: 16 | (B vbtable pointer)
68// CHECK-X64: 32 | int a
69// CHECK-X64: 48 | struct B1 (virtual base)
70// CHECK-X64: 48 | int a
71// CHECK-X64: | [sizeof=64, align=16
72// CHECK-X64: | nvsize=48, nvalign=16]
Warren Huntbd1b0c62013-10-14 19:08:58 +000073
74struct C : B3, B0, virtual B1 {
75 __declspec(align(16)) int a;
76 C() : a(0xf000000C) { printf(" C = %p\n\n", this); }
77 virtual void f() { printf("C"); }
78};
79
80// CHECK: *** Dumping AST Record Layout
81// CHECK: 0 | struct C
82// CHECK: 0 | (C vftable pointer)
83// CHECK: 16 | struct B3 (base)
84// CHECK: 16 | (B3 vbtable pointer)
85// CHECK: 20 | struct B0 (base)
86// CHECK: 20 | int a
87// CHECK: 32 | int a
88// CHECK: 48 | struct B1 (virtual base)
89// CHECK: 48 | int a
90// CHECK: | [sizeof=64, align=16
91// CHECK: | nvsize=48, nvalign=16]
Warren Hunt55d8e822013-10-23 23:53:07 +000092// CHECK-X64: *** Dumping AST Record Layout
93// CHECK-X64: 0 | struct C
94// CHECK-X64: 0 | (C vftable pointer)
95// CHECK-X64: 8 | struct B3 (base)
96// CHECK-X64: 8 | (B3 vbtable pointer)
97// CHECK-X64: 16 | struct B0 (base)
98// CHECK-X64: 16 | int a
99// CHECK-X64: 32 | int a
100// CHECK-X64: 48 | struct B1 (virtual base)
101// CHECK-X64: 48 | int a
102// CHECK-X64: | [sizeof=64, align=16
103// CHECK-X64: | nvsize=48, nvalign=16]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000104
105struct D : B4, B0, virtual B1 {
106 __declspec(align(16)) int a;
107 D() : a(0xf000000D) { printf(" D = %p\n\n", this); }
108 virtual void f() { printf("D"); }
109};
110
111// CHECK: *** Dumping AST Record Layout
112// CHECK: 0 | struct D
113// CHECK: 0 | struct B4 (primary base)
114// CHECK: 0 | (B4 vftable pointer)
115// CHECK: 4 | (B4 vbtable pointer)
116// CHECK: 8 | struct B0 (base)
117// CHECK: 8 | int a
118// CHECK: 16 | int a
119// CHECK: 32 | struct B1 (virtual base)
120// CHECK: 32 | int a
121// CHECK: | [sizeof=48, align=16
122// CHECK: | nvsize=32, nvalign=16]
Warren Hunt55d8e822013-10-23 23:53:07 +0000123// CHECK-X64: *** Dumping AST Record Layout
124// CHECK-X64: 0 | struct D
125// CHECK-X64: 0 | struct B4 (primary base)
126// CHECK-X64: 0 | (B4 vftable pointer)
127// CHECK-X64: 8 | (B4 vbtable pointer)
128// CHECK-X64: 16 | struct B0 (base)
129// CHECK-X64: 16 | int a
130// CHECK-X64: 32 | int a
131// CHECK-X64: 48 | struct B1 (virtual base)
132// CHECK-X64: 48 | int a
133// CHECK-X64: | [sizeof=64, align=16
134// CHECK-X64: | nvsize=48, nvalign=16]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000135
136int a[
137sizeof(A)+
138sizeof(B)+
139sizeof(C)+
140sizeof(D)];