1// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only %s 2>&1 \
2// RUN:            | FileCheck %s
3// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fdump-record-layouts -fsyntax-only %s 2>/dev/null \
4// RUN:            | FileCheck %s -check-prefix CHECK-X64
5
6struct B0 { int a; };
7struct B1 { int a; };
8
9struct A : virtual B0 { char a : 1; };
10
11// CHECK: *** Dumping AST Record Layout
12// CHECK: *** Dumping AST Record Layout
13// CHECK-NEXT:    0 | struct A
14// CHECK-NEXT:    0 |   (A vbtable pointer)
15// CHECK-NEXT:    4 |   char a
16// CHECK-NEXT:    8 |   struct B0 (virtual base)
17// CHECK-NEXT:    8 |     int a
18// CHECK-NEXT:      | [sizeof=12, align=4
19// CHECK-NEXT:      |  nvsize=8, nvalign=4]
20// CHECK-X64: *** Dumping AST Record Layout
21// CHECK-X64: *** Dumping AST Record Layout
22// CHECK-X64-NEXT:    0 | struct A
23// CHECK-X64-NEXT:    0 |   (A vbtable pointer)
24// CHECK-X64-NEXT:    8 |   char a
25// CHECK-X64-NEXT:   16 |   struct B0 (virtual base)
26// CHECK-X64-NEXT:   16 |     int a
27// CHECK-X64-NEXT:      | [sizeof=24, align=8
28// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
29
30struct B : virtual B0 { short a : 1; };
31
32// CHECK: *** Dumping AST Record Layout
33// CHECK-NEXT:    0 | struct B
34// CHECK-NEXT:    0 |   (B vbtable pointer)
35// CHECK-NEXT:    4 |   short a
36// CHECK-NEXT:    8 |   struct B0 (virtual base)
37// CHECK-NEXT:    8 |     int a
38// CHECK-NEXT:      | [sizeof=12, align=4
39// CHECK-NEXT:      |  nvsize=8, nvalign=4]
40// CHECK-X64: *** Dumping AST Record Layout
41// CHECK-X64-NEXT:    0 | struct B
42// CHECK-X64-NEXT:    0 |   (B vbtable pointer)
43// CHECK-X64-NEXT:    8 |   short a
44// CHECK-X64-NEXT:   16 |   struct B0 (virtual base)
45// CHECK-X64-NEXT:   16 |     int a
46// CHECK-X64-NEXT:      | [sizeof=24, align=8
47// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
48
49struct C : virtual B0 { char a : 1; char : 0; };
50
51// CHECK: *** Dumping AST Record Layout
52// CHECK-NEXT:    0 | struct C
53// CHECK-NEXT:    0 |   (C vbtable pointer)
54// CHECK-NEXT:    4 |   char a
55// CHECK-NEXT:    5 |   char
56// CHECK-NEXT:    8 |   struct B0 (virtual base)
57// CHECK-NEXT:    8 |     int a
58// CHECK-NEXT:      | [sizeof=12, align=4
59// CHECK-NEXT:      |  nvsize=8, nvalign=4]
60// CHECK-X64: *** Dumping AST Record Layout
61// CHECK-X64-NEXT:    0 | struct C
62// CHECK-X64-NEXT:    0 |   (C vbtable pointer)
63// CHECK-X64-NEXT:    8 |   char a
64// CHECK-X64-NEXT:    9 |   char
65// CHECK-X64-NEXT:   16 |   struct B0 (virtual base)
66// CHECK-X64-NEXT:   16 |     int a
67// CHECK-X64-NEXT:      | [sizeof=24, align=8
68// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
69
70struct D : virtual B0 { char a : 1; char b; };
71
72// CHECK: *** Dumping AST Record Layout
73// CHECK-NEXT:    0 | struct D
74// CHECK-NEXT:    0 |   (D vbtable pointer)
75// CHECK-NEXT:    4 |   char a
76// CHECK-NEXT:    5 |   char b
77// CHECK-NEXT:    8 |   struct B0 (virtual base)
78// CHECK-NEXT:    8 |     int a
79// CHECK-NEXT:      | [sizeof=12, align=4
80// CHECK-NEXT:      |  nvsize=8, nvalign=4]
81// CHECK-X64: *** Dumping AST Record Layout
82// CHECK-X64-NEXT:    0 | struct D
83// CHECK-X64-NEXT:    0 |   (D vbtable pointer)
84// CHECK-X64-NEXT:    8 |   char a
85// CHECK-X64-NEXT:    9 |   char b
86// CHECK-X64-NEXT:   16 |   struct B0 (virtual base)
87// CHECK-X64-NEXT:   16 |     int a
88// CHECK-X64-NEXT:      | [sizeof=24, align=8
89// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
90
91struct E : virtual B0, virtual B1 { long long : 1; };
92// CHECK: *** Dumping AST Record Layout
93// CHECK: *** Dumping AST Record Layout
94// CHECK-NEXT:    0 | struct E
95// CHECK-NEXT:    0 |   (E vbtable pointer)
96// CHECK-NEXT:    8 |   long long
97// CHECK-NEXT:   16 |   struct B0 (virtual base)
98// CHECK-NEXT:   16 |     int a
99// CHECK-NEXT:   20 |   struct B1 (virtual base)
100// CHECK-NEXT:   20 |     int a
101// CHECK-NEXT:      | [sizeof=24, align=8
102// CHECK-NEXT:      |  nvsize=16, nvalign=8]
103// CHECK-X64: *** Dumping AST Record Layout
104// CHECK-X64: *** Dumping AST Record Layout
105// CHECK-X64-NEXT:    0 | struct E
106// CHECK-X64-NEXT:    0 |   (E vbtable pointer)
107// CHECK-X64-NEXT:    8 |   long long
108// CHECK-X64-NEXT:   16 |   struct B0 (virtual base)
109// CHECK-X64-NEXT:   16 |     int a
110// CHECK-X64-NEXT:   20 |   struct B1 (virtual base)
111// CHECK-X64-NEXT:   20 |     int a
112// CHECK-X64-NEXT:      | [sizeof=24, align=8
113// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
114
115int a[
116sizeof(A)+
117sizeof(B)+
118sizeof(C)+
119sizeof(D)+
120sizeof(E)];
121