blob: 1b5d25cd5b79ab1e48ac3a07aa2471501c6f8ca9 [file] [log] [blame]
Warren Hunt049f6732013-12-06 19:54:25 +00001// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only -cxx-abi microsoft %s 2>/dev/null \
2// RUN: | FileCheck %s
3// 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
5
6extern "C" int printf(const char *fmt, ...);
7__declspec(align(4096)) char buffer[4096];
8
9struct AT {};
10
11struct V : AT {
12 char c;
13 V() {
14 printf("V - this: %d\n", (int)((char*)this - buffer));
15 }
16};
17
18struct AT0 {
19 union { struct { int a; AT t; } y; int b; } x;
20 char c;
21 AT0() {
22 printf("AT0 - this: %d\n", (int)((char*)this - buffer));
23 }
24};
25
26struct AT1 : V {
27 int a;
28 AT1() {
29 printf("AT1 - this: %d\n", (int)((char*)this - buffer));
30 }
31};
32
33struct AT2 {
34 AT0 t;
35 char AT2FieldName0;
36 AT2() {
37 printf("AT2 - this: %d\n", (int)((char*)this - buffer));
38 printf("AT2 - Fiel: %d\n", (int)((char*)&AT2FieldName0 - buffer));
39 }
40};
41
42struct AT3 : AT2, AT1 {
43 AT3() {
44 printf("AT3 - this: %d\n", (int)((char*)this - buffer));
45 }
46};
47
48// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +000049// CHECK: *** Dumping AST Record Layout
50// CHECK: *** Dumping AST Record Layout
51// CHECK: *** Dumping AST Record Layout
52// CHECK: *** Dumping AST Record Layout
53// CHECK: *** Dumping AST Record Layout
54// CHECK: *** Dumping AST Record Layout
55// CHECK: *** Dumping AST Record Layout
56// CHECK-NEXT: 0 | struct AT3
57// CHECK-NEXT: 0 | struct AT2 (base)
58// CHECK-NEXT: 0 | struct AT0 t
59// CHECK-NEXT: 0 | union AT0::<anonymous at {{.*}} x
60// CHECK-NEXT: 0 | struct AT0::<anonymous at {{.*}} y
61// CHECK-NEXT: 0 | int a
62// CHECK-NEXT: 4 | struct AT t (empty)
63// CHECK: 0 | int b
64// CHECK: 8 | char c
65// CHECK: 12 | char AT2FieldName0
66// CHECK-NEXT: 20 | struct AT1 (base)
67// CHECK-NEXT: 20 | struct V (base)
68// CHECK-NEXT: 20 | struct AT (base) (empty)
69// CHECK-NEXT: 20 | char c
70// CHECK-NEXT: 24 | int a
71// CHECK-NEXT: | [sizeof=28, align=4
72// CHECK-NEXT: | nvsize=28, nvalign=4]
Warren Hunt049f6732013-12-06 19:54:25 +000073// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +000074// CHECK-X64: *** Dumping AST Record Layout
75// CHECK-X64: *** Dumping AST Record Layout
76// CHECK-X64: *** Dumping AST Record Layout
77// CHECK-X64: *** Dumping AST Record Layout
78// CHECK-X64: *** Dumping AST Record Layout
79// CHECK-X64: *** Dumping AST Record Layout
80// CHECK-X64: *** Dumping AST Record Layout
81// CHECK-X64-NEXT: 0 | struct AT3
82// CHECK-X64-NEXT: 0 | struct AT2 (base)
83// CHECK-X64-NEXT: 0 | struct AT0 t
84// CHECK-X64-NEXT: 0 | union AT0::<anonymous at {{.*}} x
85// CHECK-X64-NEXT: 0 | struct AT0::<anonymous at {{.*}} y
86// CHECK-X64-NEXT: 0 | int a
87// CHECK-X64-NEXT: 4 | struct AT t (empty)
88// CHECK-X64: 0 | int b
89// CHECK-X64: 8 | char c
90// CHECK-X64: 12 | char AT2FieldName0
91// CHECK-X64-NEXT: 20 | struct AT1 (base)
92// CHECK-X64-NEXT: 20 | struct V (base)
93// CHECK-X64-NEXT: 20 | struct AT (base) (empty)
94// CHECK-X64-NEXT: 20 | char c
95// CHECK-X64-NEXT: 24 | int a
96// CHECK-X64-NEXT: | [sizeof=28, align=4
97// CHECK-X64-NEXT: | nvsize=28, nvalign=4]
Warren Hunt049f6732013-12-06 19:54:25 +000098
99struct BT0 {
100 BT0() {
101 printf("BT0 - this: %d\n", (int)((char*)this - buffer));
102 }
103};
104
105struct BT2 : BT0 {
106 char BT2FieldName0;
107 BT2() {
108 printf("BT2 - this: %d\n", (int)((char*)this - buffer));
109 printf("BT2 - Fiel: %d\n", (int)((char*)&BT2FieldName0 - buffer));
110 }
111};
112
113struct BT3 : BT0, BT2 {
114 BT3() {
115 printf("BT3 - this: %d\n", (int)((char*)this - buffer));
116 }
117};
118
119// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000120// CHECK: *** Dumping AST Record Layout
121// CHECK: *** Dumping AST Record Layout
122// CHECK-NEXT: 0 | struct BT3
123// CHECK-NEXT: 0 | struct BT0 (base) (empty)
124// CHECK-NEXT: 1 | struct BT2 (base)
125// CHECK-NEXT: 1 | struct BT0 (base) (empty)
126// CHECK-NEXT: 1 | char BT2FieldName0
127// CHECK-NEXT: | [sizeof=2, align=1
128// CHECK-NEXT: | nvsize=2, nvalign=1]
Warren Hunt049f6732013-12-06 19:54:25 +0000129// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000130// CHECK-X64: *** Dumping AST Record Layout
131// CHECK-X64: *** Dumping AST Record Layout
132// CHECK-X64-NEXT: 0 | struct BT3
133// CHECK-X64-NEXT: 0 | struct BT0 (base) (empty)
134// CHECK-X64-NEXT: 1 | struct BT2 (base)
135// CHECK-X64-NEXT: 1 | struct BT0 (base) (empty)
136// CHECK-X64-NEXT: 1 | char BT2FieldName0
137// CHECK-X64-NEXT: | [sizeof=2, align=1
138// CHECK-X64-NEXT: | nvsize=2, nvalign=1]
Warren Hunt049f6732013-12-06 19:54:25 +0000139
140struct T0 : AT {
141 T0() {
142 printf("T0 (this) : %d\n", (char*)this - buffer);
143 }
144};
145
146struct T1 : T0 {
147 char a;
148 T1() {
149 printf("T1 (this) : %d\n", (char*)this - buffer);
150 printf("T1 (fiel) : %d\n", (char*)&a - buffer);
151 }
152};
153
154struct T2 : AT {
155 char a;
156 T2() {
157 printf("T2 (this) : %d\n", (char*)this - buffer);
158 printf("T2 (fiel) : %d\n", (char*)&a - buffer);
159 }
160};
161
162struct __declspec(align(1)) T3 : virtual T1, virtual T2 {
163 T3() {
164 printf("T3 (this) : %d\n", (char*)this - buffer);
165 }
166};
167
168// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000169// CHECK: *** Dumping AST Record Layout
170// CHECK: *** Dumping AST Record Layout
171// CHECK: *** Dumping AST Record Layout
172// CHECK-NEXT: 0 | struct T3
173// CHECK-NEXT: 0 | (T3 vbtable pointer)
174// CHECK-NEXT: 4 | struct T1 (virtual base)
175// CHECK-NEXT: 4 | struct T0 (base) (empty)
176// CHECK-NEXT: 4 | struct AT (base) (empty)
177// CHECK-NEXT: 4 | char a
178// CHECK-NEXT: 12 | struct T2 (virtual base)
179// CHECK-NEXT: 12 | struct AT (base) (empty)
180// CHECK-NEXT: 12 | char a
181// CHECK-NEXT: | [sizeof=16, align=4
182// CHECK-NEXT: | nvsize=4, nvalign=4]
Warren Hunt049f6732013-12-06 19:54:25 +0000183// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000184// CHECK-X64: *** Dumping AST Record Layout
185// CHECK-X64: *** Dumping AST Record Layout
186// CHECK-X64: *** Dumping AST Record Layout
187// CHECK-X64-NEXT: 0 | struct T3
188// CHECK-X64-NEXT: 0 | (T3 vbtable pointer)
189// CHECK-X64-NEXT: 8 | struct T1 (virtual base)
190// CHECK-X64-NEXT: 8 | struct T0 (base) (empty)
191// CHECK-X64-NEXT: 8 | struct AT (base) (empty)
192// CHECK-X64-NEXT: 8 | char a
193// CHECK-X64-NEXT: 16 | struct T2 (virtual base)
194// CHECK-X64-NEXT: 16 | struct AT (base) (empty)
195// CHECK-X64-NEXT: 16 | char a
196// CHECK-X64-NEXT: | [sizeof=24, align=8
197// CHECK-X64-NEXT: | nvsize=8, nvalign=8]
Warren Hunt049f6732013-12-06 19:54:25 +0000198
199int a[
200sizeof(AT3) +
201sizeof(BT3) +
202sizeof(T3)];