blob: 7e975b0039e21334832aa9bdb7172f69388af35f [file] [log] [blame]
Stephen Hines651f13c2014-04-23 16:59:28 -07001// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts %s 2>/dev/null \
Warren Huntdc581802013-10-14 19:08:58 +00002// RUN: | FileCheck %s
Stephen Hines651f13c2014-04-23 16:59:28 -07003// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fdump-record-layouts %s 2>/dev/null \
Warren Hunt7967c952013-10-23 23:53:07 +00004// RUN: | FileCheck %s -check-prefix CHECK-X64
Warren Huntdc581802013-10-14 19:08:58 +00005
6extern "C" int printf(const char *fmt, ...);
7
8struct B0 { char a; B0() : a(0xB0) {} };
9struct __declspec(align(1)) B1 {};
10
Warren Hunt2d2f6c22013-11-14 22:34:59 +000011struct A : virtual B0 {};
Warren Huntdc581802013-10-14 19:08:58 +000012
13// CHECK: *** Dumping AST Record Layout
Stephen Hines651f13c2014-04-23 16:59:28 -070014// CHECK: *** Dumping AST Record Layout
15// CHECK-NEXT: 0 | struct A
16// CHECK-NEXT: 0 | (A vbtable pointer)
17// CHECK-NEXT: 4 | struct B0 (virtual base)
18// CHECK-NEXT: 4 | char a
19// CHECK-NEXT: | [sizeof=5, align=4
20// CHECK-NEXT: | nvsize=4, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +000021// CHECK-X64: *** Dumping AST Record Layout
Stephen Hines651f13c2014-04-23 16:59:28 -070022// CHECK-X64: *** Dumping AST Record Layout
23// CHECK-X64-NEXT: 0 | struct A
24// CHECK-X64-NEXT: 0 | (A vbtable pointer)
25// CHECK-X64-NEXT: 8 | struct B0 (virtual base)
26// CHECK-X64-NEXT: 8 | char a
27// CHECK-X64-NEXT: | [sizeof=16, align=8
28// CHECK-X64-NEXT: | nvsize=8, nvalign=8]
Warren Huntdc581802013-10-14 19:08:58 +000029
30struct __declspec(align(1)) B : virtual B0 {};
31
32// CHECK: *** Dumping AST Record Layout
Stephen Hines651f13c2014-04-23 16:59:28 -070033// CHECK-NEXT: 0 | struct B
34// CHECK-NEXT: 0 | (B vbtable pointer)
35// CHECK-NEXT: 4 | struct B0 (virtual base)
36// CHECK-NEXT: 4 | char a
37// CHECK-NEXT: | [sizeof=8, align=4
38// CHECK-NEXT: | nvsize=4, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +000039// CHECK-X64: *** Dumping AST Record Layout
Stephen Hines651f13c2014-04-23 16:59:28 -070040// CHECK-X64-NEXT: 0 | struct B
41// CHECK-X64-NEXT: 0 | (B vbtable pointer)
42// CHECK-X64-NEXT: 8 | struct B0 (virtual base)
43// CHECK-X64-NEXT: 8 | char a
44// CHECK-X64-NEXT: | [sizeof=16, align=8
45// CHECK-X64-NEXT: | nvsize=8, nvalign=8]
Warren Huntdc581802013-10-14 19:08:58 +000046
47struct C : virtual B0 { int a; C() : a(0xC) {} };
48
49// CHECK: *** Dumping AST Record Layout
Stephen Hines651f13c2014-04-23 16:59:28 -070050// CHECK-NEXT: 0 | struct C
51// CHECK-NEXT: 0 | (C vbtable pointer)
52// CHECK-NEXT: 4 | int a
53// CHECK-NEXT: 8 | struct B0 (virtual base)
54// CHECK-NEXT: 8 | char a
55// CHECK-NEXT: | [sizeof=9, align=4
56// CHECK-NEXT: | nvsize=8, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +000057// CHECK-X64: *** Dumping AST Record Layout
Stephen Hines651f13c2014-04-23 16:59:28 -070058// CHECK-X64-NEXT: 0 | struct C
59// CHECK-X64-NEXT: 0 | (C vbtable pointer)
60// CHECK-X64-NEXT: 8 | int a
61// CHECK-X64-NEXT: 16 | struct B0 (virtual base)
62// CHECK-X64-NEXT: 16 | char a
63// CHECK-X64-NEXT: | [sizeof=24, align=8
64// CHECK-X64-NEXT: | nvsize=16, nvalign=8]
Warren Huntdc581802013-10-14 19:08:58 +000065
66struct D : virtual B0 { __declspec(align(1)) int a; D() : a(0xD) {} };
67
68// CHECK: *** Dumping AST Record Layout
Stephen Hines651f13c2014-04-23 16:59:28 -070069// CHECK-NEXT: 0 | struct D
70// CHECK-NEXT: 0 | (D vbtable pointer)
71// CHECK-NEXT: 4 | int a
72// CHECK-NEXT: 8 | struct B0 (virtual base)
73// CHECK-NEXT: 8 | char a
74// CHECK-NEXT: | [sizeof=12, align=4
75// CHECK-NEXT: | nvsize=8, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +000076// CHECK-X64: *** Dumping AST Record Layout
Stephen Hines651f13c2014-04-23 16:59:28 -070077// CHECK-X64-NEXT: 0 | struct D
78// CHECK-X64-NEXT: 0 | (D vbtable pointer)
79// CHECK-X64-NEXT: 8 | int a
80// CHECK-X64-NEXT: 16 | struct B0 (virtual base)
81// CHECK-X64-NEXT: 16 | char a
82// CHECK-X64-NEXT: | [sizeof=24, align=8
83// CHECK-X64-NEXT: | nvsize=16, nvalign=8]
Warren Huntdc581802013-10-14 19:08:58 +000084
85struct E : virtual B0, virtual B1 {};
86
87// CHECK: *** Dumping AST Record Layout
Stephen Hines651f13c2014-04-23 16:59:28 -070088// CHECK: *** Dumping AST Record Layout
89// CHECK-NEXT: 0 | struct E
90// CHECK-NEXT: 0 | (E vbtable pointer)
91// CHECK-NEXT: 4 | struct B0 (virtual base)
92// CHECK-NEXT: 4 | char a
93// CHECK-NEXT: 5 | struct B1 (virtual base) (empty)
94// CHECK-NEXT: | [sizeof=8, align=4
95// CHECK-NEXT: | nvsize=4, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +000096// CHECK-X64: *** Dumping AST Record Layout
Stephen Hines651f13c2014-04-23 16:59:28 -070097// CHECK-X64: *** Dumping AST Record Layout
98// CHECK-X64-NEXT: 0 | struct E
99// CHECK-X64-NEXT: 0 | (E vbtable pointer)
100// CHECK-X64-NEXT: 8 | struct B0 (virtual base)
101// CHECK-X64-NEXT: 8 | char a
102// CHECK-X64-NEXT: 9 | struct B1 (virtual base) (empty)
103// CHECK-X64-NEXT: | [sizeof=16, align=8
104// CHECK-X64-NEXT: | nvsize=8, nvalign=8]
Reid Klecknera7dec292013-10-14 21:14:05 +0000105
106struct F { char a; virtual ~F(); };
107
108// CHECK: *** Dumping AST Record Layout
Stephen Hines651f13c2014-04-23 16:59:28 -0700109// CHECK-NEXT: 0 | struct F
110// CHECK-NEXT: 0 | (F vftable pointer)
111// CHECK-NEXT: 4 | char a
112// CHECK-NEXT: | [sizeof=8, align=4
113// CHECK-NEXT: | nvsize=8, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +0000114// CHECK-X64: *** Dumping AST Record Layout
Stephen Hines651f13c2014-04-23 16:59:28 -0700115// CHECK-X64-NEXT: 0 | struct F
116// CHECK-X64-NEXT: 0 | (F vftable pointer)
117// CHECK-X64-NEXT: 8 | char a
118// CHECK-X64-NEXT: | [sizeof=16, align=8
119// CHECK-X64-NEXT: | nvsize=16, nvalign=8]
Reid Klecknera7dec292013-10-14 21:14:05 +0000120
Warren Huntdc581802013-10-14 19:08:58 +0000121int a[
122sizeof(A)+
123sizeof(B)+
124sizeof(C)+
125sizeof(D)+
Reid Klecknera7dec292013-10-14 21:14:05 +0000126sizeof(E)+
127sizeof(F)];