blob: 45ac64968210360b9a53ac7c80dd0ec1f8d76c7e [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 {
7 int a;
8 B0() : a(0xf00000B0) {}
9 virtual void f() { printf("B0"); }
10};
11
12struct __declspec(align(16)) B1 {
13 int a;
14 B1() : a(0xf00000B1) {}
15 virtual void f() { printf("B1"); }
16};
17
18struct __declspec(align(16)) Align16 {};
19struct __declspec(align(32)) Align32 {};
20struct VAlign16 : virtual Align16 {};
21struct VAlign32 : virtual Align32 {};
22
23struct A : virtual B0, virtual B1 {
24 int a;
25 A() : a(0xf000000A) {}
26 virtual void f() { printf("A"); }
27 virtual void g() { printf("A"); }
28};
29
30// CHECK: *** Dumping AST Record Layout
31// CHECK: 0 | struct A
32// CHECK: 0 | (A vftable pointer)
33// CHECK: 4 | (A vbtable pointer)
34// CHECK: 8 | int a
35// CHECK: 16 | (vtordisp for vbase B0)
36// CHECK: 20 | struct B0 (virtual base)
37// CHECK: 20 | (B0 vftable pointer)
38// CHECK: 24 | int a
39// CHECK: 44 | (vtordisp for vbase B1)
40// CHECK: 48 | struct B1 (virtual base)
41// CHECK: 48 | (B1 vftable pointer)
42// CHECK: 52 | int a
43// CHECK: | [sizeof=64, align=16
44// CHECK: | nvsize=12, nvalign=4]
45
46struct C : virtual B0, virtual B1, VAlign32 {
47 int a;
48 C() : a(0xf000000C) {}
49 virtual void f() { printf("C"); }
50 virtual void g() { printf("C"); }
51};
52
53// CHECK: *** Dumping AST Record Layout
54// CHECK: 0 | struct C
55// CHECK: 0 | (C vftable pointer)
56// CHECK: 32 | struct VAlign32 (base)
57// CHECK: 32 | (VAlign32 vbtable pointer)
58// CHECK: 36 | int a
59// CHECK: 64 | (vtordisp for vbase B0)
60// CHECK: 68 | struct B0 (virtual base)
61// CHECK: 68 | (B0 vftable pointer)
62// CHECK: 72 | int a
63// CHECK: 108 | (vtordisp for vbase B1)
64// CHECK: 112 | struct B1 (virtual base)
65// CHECK: 112 | (B1 vftable pointer)
66// CHECK: 116 | int a
67// CHECK: 128 | struct Align32 (virtual base) (empty)
68// CHECK: | [sizeof=128, align=32
69// CHECK: | nvsize=64, nvalign=32]
70
71struct __declspec(align(32)) D : virtual B0, virtual B1 {
72 int a;
73 D() : a(0xf000000D) {}
74 virtual void f() { printf("D"); }
75 virtual void g() { printf("D"); }
76};
77
78// CHECK: *** Dumping AST Record Layout
79// CHECK: 0 | struct D
80// CHECK: 0 | (D vftable pointer)
81// CHECK: 4 | (D vbtable pointer)
82// CHECK: 8 | int a
83// CHECK: 32 | (vtordisp for vbase B0)
84// CHECK: 36 | struct B0 (virtual base)
85// CHECK: 36 | (B0 vftable pointer)
86// CHECK: 40 | int a
87// CHECK: 76 | (vtordisp for vbase B1)
88// CHECK: 80 | struct B1 (virtual base)
89// CHECK: 80 | (B1 vftable pointer)
90// CHECK: 84 | int a
91// CHECK: | [sizeof=96, align=32
92// CHECK: | nvsize=12, nvalign=4]
93
94int a[
95sizeof(A)+
96sizeof(C)+
97sizeof(D)];