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