1*0a6a1f1dSLionel Sambuc // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts %s 2>/dev/null \ 2f4a2713aSLionel Sambuc // RUN: | FileCheck %s 3*0a6a1f1dSLionel Sambuc // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fdump-record-layouts %s 2>/dev/null \ 4f4a2713aSLionel Sambuc // RUN: | FileCheck %s -check-prefix CHECK-X64 5f4a2713aSLionel Sambuc 6f4a2713aSLionel Sambuc 7f4a2713aSLionel Sambuc struct U { char a; }; 8f4a2713aSLionel Sambuc struct V { }; 9f4a2713aSLionel Sambuc struct W { }; 10f4a2713aSLionel Sambuc struct X : virtual V { char a; }; 11f4a2713aSLionel Sambuc struct Y : virtual V { char a; }; 12f4a2713aSLionel Sambuc struct Z : Y { }; 13f4a2713aSLionel Sambuc 14f4a2713aSLionel Sambuc struct A : X, W { char a; }; 15f4a2713aSLionel Sambuc 16f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout 17*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout 18*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout 19*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout 20*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 0 | struct A 21*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 0 | struct X (base) 22*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 0 | (X vbtable pointer) 23*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 4 | char a 24*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 9 | struct W (base) (empty) 25*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 9 | char a 26*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 12 | struct V (virtual base) (empty) 27*0a6a1f1dSLionel Sambuc // CHECK-NEXT: | [sizeof=12, align=4 28*0a6a1f1dSLionel Sambuc // CHECK-NEXT: | nvsize=12, nvalign=4] 29f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout 30*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout 31*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout 32*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout 33*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 0 | struct A 34*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 0 | struct X (base) 35*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 0 | (X vbtable pointer) 36*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 8 | char a 37*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 17 | struct W (base) (empty) 38*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 17 | char a 39*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 24 | struct V (virtual base) (empty) 40*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: | [sizeof=24, align=8 41*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: | nvsize=24, nvalign=8] 42f4a2713aSLionel Sambuc 43f4a2713aSLionel Sambuc struct B : X, U, W { char a; }; 44f4a2713aSLionel Sambuc 45f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout 46*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout 47*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 0 | struct B 48*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 0 | struct X (base) 49*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 0 | (X vbtable pointer) 50*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 4 | char a 51*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 8 | struct U (base) 52*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 8 | char a 53*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 9 | struct W (base) (empty) 54*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 9 | char a 55*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 12 | struct V (virtual base) (empty) 56*0a6a1f1dSLionel Sambuc // CHECK-NEXT: | [sizeof=12, align=4 57*0a6a1f1dSLionel Sambuc // CHECK-NEXT: | nvsize=12, nvalign=4] 58f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout 59*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout 60*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 0 | struct B 61*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 0 | struct X (base) 62*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 0 | (X vbtable pointer) 63*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 8 | char a 64*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 16 | struct U (base) 65*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 16 | char a 66*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 17 | struct W (base) (empty) 67*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 17 | char a 68*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 24 | struct V (virtual base) (empty) 69*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: | [sizeof=24, align=8 70*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: | nvsize=24, nvalign=8] 71f4a2713aSLionel Sambuc 72f4a2713aSLionel Sambuc struct C : X, V, W { char a; }; 73f4a2713aSLionel Sambuc 74f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout 75*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 0 | struct C 76*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 0 | struct X (base) 77*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 0 | (X vbtable pointer) 78*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 4 | char a 79*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 9 | struct V (base) (empty) 80*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 10 | struct W (base) (empty) 81*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 10 | char a 82*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 12 | struct V (virtual base) (empty) 83*0a6a1f1dSLionel Sambuc // CHECK-NEXT: | [sizeof=12, align=4 84*0a6a1f1dSLionel Sambuc // CHECK-NEXT: | nvsize=12, nvalign=4] 85f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout 86*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 0 | struct C 87*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 0 | struct X (base) 88*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 0 | (X vbtable pointer) 89*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 8 | char a 90*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 17 | struct V (base) (empty) 91*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 18 | struct W (base) (empty) 92*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 18 | char a 93*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 24 | struct V (virtual base) (empty) 94*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: | [sizeof=24, align=8 95*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: | nvsize=24, nvalign=8] 96f4a2713aSLionel Sambuc 97f4a2713aSLionel Sambuc struct D : X, U, V, W { char a; }; 98f4a2713aSLionel Sambuc 99f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout 100*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 0 | struct D 101*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 0 | struct X (base) 102*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 0 | (X vbtable pointer) 103*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 4 | char a 104*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 8 | struct U (base) 105*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 8 | char a 106*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 9 | struct V (base) (empty) 107*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 10 | struct W (base) (empty) 108*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 10 | char a 109*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 12 | struct V (virtual base) (empty) 110*0a6a1f1dSLionel Sambuc // CHECK-NEXT: | [sizeof=12, align=4 111*0a6a1f1dSLionel Sambuc // CHECK-NEXT: | nvsize=12, nvalign=4] 112f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout 113*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 0 | struct D 114*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 0 | struct X (base) 115*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 0 | (X vbtable pointer) 116*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 8 | char a 117*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 16 | struct U (base) 118*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 16 | char a 119*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 17 | struct V (base) (empty) 120*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 18 | struct W (base) (empty) 121*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 18 | char a 122*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 24 | struct V (virtual base) (empty) 123*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: | [sizeof=24, align=8 124*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: | nvsize=24, nvalign=8] 125f4a2713aSLionel Sambuc 126f4a2713aSLionel Sambuc struct E : X, U, Y, V, W { char a; }; 127f4a2713aSLionel Sambuc 128f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout 129*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout 130*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 0 | struct E 131*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 0 | struct X (base) 132*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 0 | (X vbtable pointer) 133*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 4 | char a 134*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 8 | struct U (base) 135*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 8 | char a 136*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 12 | struct Y (base) 137*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 12 | (Y vbtable pointer) 138*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 16 | char a 139*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 21 | struct V (base) (empty) 140*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 22 | struct W (base) (empty) 141*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 22 | char a 142*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 24 | struct V (virtual base) (empty) 143*0a6a1f1dSLionel Sambuc // CHECK-NEXT: | [sizeof=24, align=4 144*0a6a1f1dSLionel Sambuc // CHECK-NEXT: | nvsize=24, nvalign=4] 145f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout 146*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout 147*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 0 | struct E 148*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 0 | struct X (base) 149*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 0 | (X vbtable pointer) 150*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 8 | char a 151*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 16 | struct U (base) 152*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 16 | char a 153*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 24 | struct Y (base) 154*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 24 | (Y vbtable pointer) 155*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 32 | char a 156*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 41 | struct V (base) (empty) 157*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 42 | struct W (base) (empty) 158*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 42 | char a 159*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 48 | struct V (virtual base) (empty) 160*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: | [sizeof=48, align=8 161*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: | nvsize=48, nvalign=8] 162f4a2713aSLionel Sambuc 163f4a2713aSLionel Sambuc struct F : Z, W { char a; }; 164f4a2713aSLionel Sambuc 165f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout 166*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout 167*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 0 | struct F 168*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 0 | struct Z (base) 169*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 0 | struct Y (base) 170*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 0 | (Y vbtable pointer) 171*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 4 | char a 172*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 9 | struct W (base) (empty) 173*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 9 | char a 174*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 12 | struct V (virtual base) (empty) 175*0a6a1f1dSLionel Sambuc // CHECK-NEXT: | [sizeof=12, align=4 176*0a6a1f1dSLionel Sambuc // CHECK-NEXT: | nvsize=12, nvalign=4] 177f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout 178*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout 179*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 0 | struct F 180*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 0 | struct Z (base) 181*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 0 | struct Y (base) 182*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 0 | (Y vbtable pointer) 183*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 8 | char a 184*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 17 | struct W (base) (empty) 185*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 17 | char a 186*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 24 | struct V (virtual base) (empty) 187*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: | [sizeof=24, align=8 188*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: | nvsize=24, nvalign=8] 189f4a2713aSLionel Sambuc 190f4a2713aSLionel Sambuc struct G : X, W, Y, V { char a; }; 191f4a2713aSLionel Sambuc 192f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout 193*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 0 | struct G 194*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 0 | struct X (base) 195*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 0 | (X vbtable pointer) 196*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 4 | char a 197*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 9 | struct W (base) (empty) 198*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 12 | struct Y (base) 199*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 12 | (Y vbtable pointer) 200*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 16 | char a 201*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 21 | struct V (base) (empty) 202*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 21 | char a 203*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 24 | struct V (virtual base) (empty) 204*0a6a1f1dSLionel Sambuc // CHECK-NEXT: | [sizeof=24, align=4 205*0a6a1f1dSLionel Sambuc // CHECK-NEXT: | nvsize=24, nvalign=4] 206f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout 207*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 0 | struct G 208*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 0 | struct X (base) 209*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 0 | (X vbtable pointer) 210*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 8 | char a 211*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 17 | struct W (base) (empty) 212*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 24 | struct Y (base) 213*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 24 | (Y vbtable pointer) 214*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 32 | char a 215*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 41 | struct V (base) (empty) 216*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 41 | char a 217*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: 48 | struct V (virtual base) (empty) 218*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: | [sizeof=48, align=8 219*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT: | nvsize=48, nvalign=8] 220f4a2713aSLionel Sambuc 221f4a2713aSLionel Sambuc int a[ 222f4a2713aSLionel Sambuc sizeof(A)+ 223f4a2713aSLionel Sambuc sizeof(B)+ 224f4a2713aSLionel Sambuc sizeof(C)+ 225f4a2713aSLionel Sambuc sizeof(D)+ 226f4a2713aSLionel Sambuc sizeof(E)+ 227f4a2713aSLionel Sambuc sizeof(F)+ 228f4a2713aSLionel Sambuc sizeof(G)]; 229