1*67e74705SXin Li // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only -Wno-inaccessible-base %s 2>&1 \ 2*67e74705SXin Li // RUN: | FileCheck %s 3*67e74705SXin Li // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only -Wno-inaccessible-base %s 2>/dev/null \ 4*67e74705SXin Li // RUN: | FileCheck %s -check-prefix CHECK-X64 5*67e74705SXin Li 6*67e74705SXin Li extern "C" int printf(const char *fmt, ...); 7*67e74705SXin Li char buffer[419430400]; 8*67e74705SXin Li 9*67e74705SXin Li struct A { 10*67e74705SXin Li char a; AA11*67e74705SXin Li A() { 12*67e74705SXin Li printf("A = %d\n", (int)((char*)this - buffer)); 13*67e74705SXin Li printf("A.a = %d\n", (int)((char*)&a - buffer)); 14*67e74705SXin Li } 15*67e74705SXin Li }; 16*67e74705SXin Li 17*67e74705SXin Li struct B { 18*67e74705SXin Li __declspec(align(4)) long long a; BB19*67e74705SXin Li B() { 20*67e74705SXin Li printf("B = %d\n", (int)((char*)this - buffer)); 21*67e74705SXin Li printf("B.a = %d\n", (int)((char*)&a - buffer)); 22*67e74705SXin Li } 23*67e74705SXin Li }; 24*67e74705SXin Li 25*67e74705SXin Li #pragma pack(push, 2) 26*67e74705SXin Li struct X { 27*67e74705SXin Li B a; 28*67e74705SXin Li char b; 29*67e74705SXin Li int c; XX30*67e74705SXin Li X() { 31*67e74705SXin Li printf("X = %d\n", (int)((char*)this - buffer)); 32*67e74705SXin Li printf("X.a = %d\n", (int)((char*)&a - buffer)); 33*67e74705SXin Li printf("X.b = %d\n", (int)((char*)&b - buffer)); 34*67e74705SXin Li printf("X.c = %d\n", (int)((char*)&c - buffer)); 35*67e74705SXin Li } 36*67e74705SXin Li }; 37*67e74705SXin Li 38*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 39*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 40*67e74705SXin Li // CHECK-NEXT: 0 | struct X 41*67e74705SXin Li // CHECK-NEXT: 0 | struct B a 42*67e74705SXin Li // CHECK-NEXT: 0 | long long a 43*67e74705SXin Li // CHECK-NEXT: 8 | char b 44*67e74705SXin Li // CHECK-NEXT: 10 | int c 45*67e74705SXin Li // CHECK-NEXT: | [sizeof=16, align=4 46*67e74705SXin Li // CHECK-NEXT: | nvsize=14, nvalign=4] 47*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 48*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 49*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct X 50*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct B a 51*67e74705SXin Li // CHECK-X64-NEXT: 0 | long long a 52*67e74705SXin Li // CHECK-X64-NEXT: 8 | char b 53*67e74705SXin Li // CHECK-X64-NEXT: 10 | int c 54*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=16, align=4 55*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=14, nvalign=4] 56*67e74705SXin Li 57*67e74705SXin Li struct Y : A, B { 58*67e74705SXin Li char a; 59*67e74705SXin Li int b; YY60*67e74705SXin Li Y() { 61*67e74705SXin Li printf("Y = %d\n", (int)((char*)this - buffer)); 62*67e74705SXin Li printf("Y.a = %d\n", (int)((char*)&a - buffer)); 63*67e74705SXin Li printf("Y.b = %d\n", (int)((char*)&b - buffer)); 64*67e74705SXin Li } 65*67e74705SXin Li }; 66*67e74705SXin Li 67*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 68*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 69*67e74705SXin Li // CHECK-NEXT: 0 | struct Y 70*67e74705SXin Li // CHECK-NEXT: 0 | struct A (base) 71*67e74705SXin Li // CHECK-NEXT: 0 | char a 72*67e74705SXin Li // CHECK-NEXT: 4 | struct B (base) 73*67e74705SXin Li // CHECK-NEXT: 4 | long long a 74*67e74705SXin Li // CHECK-NEXT: 12 | char a 75*67e74705SXin Li // CHECK-NEXT: 14 | int b 76*67e74705SXin Li // CHECK-NEXT: | [sizeof=20, align=4 77*67e74705SXin Li // CHECK-NEXT: | nvsize=18, nvalign=4] 78*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 79*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 80*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct Y 81*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct A (base) 82*67e74705SXin Li // CHECK-X64-NEXT: 0 | char a 83*67e74705SXin Li // CHECK-X64-NEXT: 4 | struct B (base) 84*67e74705SXin Li // CHECK-X64-NEXT: 4 | long long a 85*67e74705SXin Li // CHECK-X64-NEXT: 12 | char a 86*67e74705SXin Li // CHECK-X64-NEXT: 14 | int b 87*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=20, align=4 88*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=18, nvalign=4] 89*67e74705SXin Li 90*67e74705SXin Li struct Z : virtual B { 91*67e74705SXin Li char a; 92*67e74705SXin Li int b; ZZ93*67e74705SXin Li Z() { 94*67e74705SXin Li printf("Z = %d\n", (int)((char*)this - buffer)); 95*67e74705SXin Li printf("Z.a = %d\n", (int)((char*)&a - buffer)); 96*67e74705SXin Li printf("Z.b = %d\n", (int)((char*)&b - buffer)); 97*67e74705SXin Li } 98*67e74705SXin Li }; 99*67e74705SXin Li 100*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 101*67e74705SXin Li // CHECK-NEXT: 0 | struct Z 102*67e74705SXin Li // CHECK-NEXT: 0 | (Z vbtable pointer) 103*67e74705SXin Li // CHECK-NEXT: 4 | char a 104*67e74705SXin Li // CHECK-NEXT: 6 | int b 105*67e74705SXin Li // CHECK-NEXT: 12 | struct B (virtual base) 106*67e74705SXin Li // CHECK-NEXT: 12 | long long a 107*67e74705SXin Li // CHECK-NEXT: | [sizeof=20, align=4 108*67e74705SXin Li // CHECK-NEXT: | nvsize=10, nvalign=4] 109*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 110*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct Z 111*67e74705SXin Li // CHECK-X64-NEXT: 0 | (Z vbtable pointer) 112*67e74705SXin Li // CHECK-X64-NEXT: 8 | char a 113*67e74705SXin Li // CHECK-X64-NEXT: 10 | int b 114*67e74705SXin Li // CHECK-X64-NEXT: 16 | struct B (virtual base) 115*67e74705SXin Li // CHECK-X64-NEXT: 16 | long long a 116*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=24, align=4 117*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=14, nvalign=4] 118*67e74705SXin Li 119*67e74705SXin Li #pragma pack(pop) 120*67e74705SXin Li 121*67e74705SXin Li struct A1 { long long a; }; 122*67e74705SXin Li #pragma pack(push, 1) 123*67e74705SXin Li struct B1 : virtual A1 { char a; }; 124*67e74705SXin Li #pragma pack(pop) 125*67e74705SXin Li struct C1 : B1 {}; 126*67e74705SXin Li 127*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 128*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 129*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 130*67e74705SXin Li // CHECK-NEXT: 0 | struct C1 131*67e74705SXin Li // CHECK-NEXT: 0 | struct B1 (base) 132*67e74705SXin Li // CHECK-NEXT: 0 | (B1 vbtable pointer) 133*67e74705SXin Li // CHECK-NEXT: 4 | char a 134*67e74705SXin Li // CHECK-NEXT: 8 | struct A1 (virtual base) 135*67e74705SXin Li // CHECK-NEXT: 8 | long long a 136*67e74705SXin Li // CHECK-NEXT: | [sizeof=16, align=8 137*67e74705SXin Li // CHECK-NEXT: | nvsize=5, nvalign=8] 138*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 139*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 140*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 141*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct C1 142*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct B1 (base) 143*67e74705SXin Li // CHECK-X64-NEXT: 0 | (B1 vbtable pointer) 144*67e74705SXin Li // CHECK-X64-NEXT: 8 | char a 145*67e74705SXin Li // CHECK-X64-NEXT: 16 | struct A1 (virtual base) 146*67e74705SXin Li // CHECK-X64-NEXT: 16 | long long a 147*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=24, align=8 148*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=9, nvalign=8] 149*67e74705SXin Li 150*67e74705SXin Li struct CA0 { CA0CA0151*67e74705SXin Li CA0() {} 152*67e74705SXin Li }; 153*67e74705SXin Li struct CA1 : virtual CA0 { CA1CA1154*67e74705SXin Li CA1() {} 155*67e74705SXin Li }; 156*67e74705SXin Li #pragma pack(push, 1) 157*67e74705SXin Li struct CA2 : public CA1, public CA0 { CA2MethodCA2158*67e74705SXin Li virtual void CA2Method() {} CA2CA2159*67e74705SXin Li CA2() {} 160*67e74705SXin Li }; 161*67e74705SXin Li #pragma pack(pop) 162*67e74705SXin Li 163*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 164*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 165*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 166*67e74705SXin Li // CHECK-NEXT: 0 | struct CA2 167*67e74705SXin Li // CHECK-NEXT: 0 | (CA2 vftable pointer) 168*67e74705SXin Li // CHECK-NEXT: 4 | struct CA1 (base) 169*67e74705SXin Li // CHECK-NEXT: 4 | (CA1 vbtable pointer) 170*67e74705SXin Li // CHECK-NEXT: 9 | struct CA0 (base) (empty) 171*67e74705SXin Li // CHECK-NEXT: 9 | struct CA0 (virtual base) (empty) 172*67e74705SXin Li // CHECK-NEXT: | [sizeof=9, align=1 173*67e74705SXin Li // CHECK-NEXT: | nvsize=9, nvalign=1] 174*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 175*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 176*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 177*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct CA2 178*67e74705SXin Li // CHECK-X64-NEXT: 0 | (CA2 vftable pointer) 179*67e74705SXin Li // CHECK-X64-NEXT: 8 | struct CA1 (base) 180*67e74705SXin Li // CHECK-X64-NEXT: 8 | (CA1 vbtable pointer) 181*67e74705SXin Li // CHECK-X64-NEXT: 17 | struct CA0 (base) (empty) 182*67e74705SXin Li // CHECK-X64-NEXT: 17 | struct CA0 (virtual base) (empty) 183*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=17, align=1 184*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=17, nvalign=1] 185*67e74705SXin Li 186*67e74705SXin Li #pragma pack(16) 187*67e74705SXin Li struct YA { 188*67e74705SXin Li __declspec(align(32)) char : 1; 189*67e74705SXin Li }; 190*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 191*67e74705SXin Li // CHECK-NEXT: 0 | struct YA (empty) 192*67e74705SXin Li // CHECK-NEXT:0:0-0 | char 193*67e74705SXin Li // CHECK-NEXT: | [sizeof=32, align=32 194*67e74705SXin Li // CHECK-NEXT: | nvsize=32, nvalign=32] 195*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 196*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct YA (empty) 197*67e74705SXin Li // CHECK-X64-NEXT:0:0-0 | char 198*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=32, align=32 199*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=32, nvalign=32] 200*67e74705SXin Li 201*67e74705SXin Li #pragma pack(1) 202*67e74705SXin Li struct YB { 203*67e74705SXin Li char a; 204*67e74705SXin Li YA b; 205*67e74705SXin Li }; 206*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 207*67e74705SXin Li // CHECK-NEXT: 0 | struct YB 208*67e74705SXin Li // CHECK-NEXT: 0 | char a 209*67e74705SXin Li // CHECK-NEXT: 1 | struct YA b (empty) 210*67e74705SXin Li // CHECK-NEXT:1:0-0 | char 211*67e74705SXin Li // CHECK-NEXT: | [sizeof=33, align=1 212*67e74705SXin Li // CHECK-NEXT: | nvsize=33, nvalign=1] 213*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 214*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct YB 215*67e74705SXin Li // CHECK-X64-NEXT: 0 | char a 216*67e74705SXin Li // CHECK-X64-NEXT: 1 | struct YA b (empty) 217*67e74705SXin Li // CHECK-X64-NEXT:1:0-0 | char 218*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=33, align=1 219*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=33, nvalign=1] 220*67e74705SXin Li 221*67e74705SXin Li #pragma pack(8) 222*67e74705SXin Li struct YC { 223*67e74705SXin Li __declspec(align(32)) char : 1; 224*67e74705SXin Li }; 225*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 226*67e74705SXin Li // CHECK-NEXT: 0 | struct YC (empty) 227*67e74705SXin Li // CHECK-NEXT:0:0-0 | char 228*67e74705SXin Li // CHECK-NEXT: | [sizeof=32, align=32 229*67e74705SXin Li // CHECK-NEXT: | nvsize=32, nvalign=32] 230*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 231*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct YC (empty) 232*67e74705SXin Li // CHECK-X64-NEXT: 0:0-0 | char 233*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=8, align=32 234*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=8, nvalign=32] 235*67e74705SXin Li 236*67e74705SXin Li #pragma pack(1) 237*67e74705SXin Li struct YD { 238*67e74705SXin Li char a; 239*67e74705SXin Li YC b; 240*67e74705SXin Li }; 241*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 242*67e74705SXin Li // CHECK-NEXT: 0 | struct YD 243*67e74705SXin Li // CHECK-NEXT: 0 | char a 244*67e74705SXin Li // CHECK-NEXT: 1 | struct YC b (empty) 245*67e74705SXin Li // CHECK-NEXT:1:0-0 | char 246*67e74705SXin Li // CHECK-NEXT: | [sizeof=33, align=1 247*67e74705SXin Li // CHECK-NEXT: | nvsize=33, nvalign=1] 248*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 249*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct YD 250*67e74705SXin Li // CHECK-X64-NEXT: 0 | char a 251*67e74705SXin Li // CHECK-X64-NEXT: 1 | struct YC b (empty) 252*67e74705SXin Li // CHECK-X64-NEXT:1:0-0 | char 253*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=9, align=1 254*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=9, nvalign=1] 255*67e74705SXin Li 256*67e74705SXin Li #pragma pack(4) 257*67e74705SXin Li struct YE { 258*67e74705SXin Li __declspec(align(32)) char : 1; 259*67e74705SXin Li }; 260*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 261*67e74705SXin Li // CHECK-NEXT: 0 | struct YE (empty) 262*67e74705SXin Li // CHECK-NEXT: 0:0-0 | char 263*67e74705SXin Li // CHECK-NEXT: | [sizeof=4, align=32 264*67e74705SXin Li // CHECK-NEXT: | nvsize=4, nvalign=32] 265*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 266*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct YE (empty) 267*67e74705SXin Li // CHECK-X64-NEXT: 0:0-0 | char 268*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=4, align=32 269*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=4, nvalign=32] 270*67e74705SXin Li 271*67e74705SXin Li #pragma pack(1) 272*67e74705SXin Li struct YF { 273*67e74705SXin Li char a; 274*67e74705SXin Li YE b; 275*67e74705SXin Li }; 276*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 277*67e74705SXin Li // CHECK-NEXT: 0 | struct YF 278*67e74705SXin Li // CHECK-NEXT: 0 | char a 279*67e74705SXin Li // CHECK-NEXT: 1 | struct YE b (empty) 280*67e74705SXin Li // CHECK-NEXT:1:0-0 | char 281*67e74705SXin Li // CHECK-NEXT: | [sizeof=5, align=1 282*67e74705SXin Li // CHECK-NEXT: | nvsize=5, nvalign=1] 283*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 284*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct YF 285*67e74705SXin Li // CHECK-X64-NEXT: 0 | char a 286*67e74705SXin Li // CHECK-X64-NEXT: 1 | struct YE b (empty) 287*67e74705SXin Li // CHECK-X64-NEXT:1:0-0 | char 288*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=5, align=1 289*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=5, nvalign=1] 290*67e74705SXin Li 291*67e74705SXin Li #pragma pack(16) 292*67e74705SXin Li struct __declspec(align(16)) D0 { char a; }; 293*67e74705SXin Li #pragma pack(1) 294*67e74705SXin Li struct D1 : public D0 { char a; }; 295*67e74705SXin Li #pragma pack(16) 296*67e74705SXin Li struct D2 : D1 { char a; }; 297*67e74705SXin Li 298*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 299*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 300*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 301*67e74705SXin Li // CHECK-NEXT: 0 | struct D2 302*67e74705SXin Li // CHECK-NEXT: 0 | struct D1 (base) 303*67e74705SXin Li // CHECK-NEXT: 0 | struct D0 (base) 304*67e74705SXin Li // CHECK-NEXT: 0 | char a 305*67e74705SXin Li // CHECK-NEXT: 1 | char a 306*67e74705SXin Li // CHECK-NEXT: 2 | char a 307*67e74705SXin Li // CHECK-NEXT: | [sizeof=16, align=16 308*67e74705SXin Li // CHECK-NEXT: | nvsize=16, nvalign=16] 309*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 310*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 311*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 312*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct D2 313*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct D1 (base) 314*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct D0 (base) 315*67e74705SXin Li // CHECK-X64-NEXT: 0 | char a 316*67e74705SXin Li // CHECK-X64-NEXT: 1 | char a 317*67e74705SXin Li // CHECK-X64-NEXT: 2 | char a 318*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=16, align=16 319*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=16, nvalign=16] 320*67e74705SXin Li 321*67e74705SXin Li #pragma pack() 322*67e74705SXin Li struct JA { char a; }; 323*67e74705SXin Li #pragma pack(1) 324*67e74705SXin Li struct JB { __declspec(align(4)) char a; }; 325*67e74705SXin Li #pragma pack() 326*67e74705SXin Li struct JC : JB, JA { }; 327*67e74705SXin Li 328*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 329*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 330*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 331*67e74705SXin Li // CHECK-NEXT: 0 | struct JC 332*67e74705SXin Li // CHECK-NEXT: 0 | struct JB (base) 333*67e74705SXin Li // CHECK-NEXT: 0 | char a 334*67e74705SXin Li // CHECK-NEXT: 1 | struct JA (base) 335*67e74705SXin Li // CHECK-NEXT: 1 | char a 336*67e74705SXin Li // CHECK-NEXT: | [sizeof=4, align=4 337*67e74705SXin Li // CHECK-NEXT: | nvsize=4, nvalign=4] 338*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 339*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 340*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 341*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct JC 342*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct JB (base) 343*67e74705SXin Li // CHECK-X64-NEXT: 0 | char a 344*67e74705SXin Li // CHECK-X64-NEXT: 1 | struct JA (base) 345*67e74705SXin Li // CHECK-X64-NEXT: 1 | char a 346*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=4, align=4 347*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=4, nvalign=4] 348*67e74705SXin Li 349*67e74705SXin Li #pragma pack() 350*67e74705SXin Li struct KA { char a; }; 351*67e74705SXin Li #pragma pack(1) 352*67e74705SXin Li struct KB : KA { __declspec(align(2)) char a; }; 353*67e74705SXin Li 354*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 355*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 356*67e74705SXin Li // CHECK-NEXT: 0 | struct KB 357*67e74705SXin Li // CHECK-NEXT: 0 | struct KA (base) 358*67e74705SXin Li // CHECK-NEXT: 0 | char a 359*67e74705SXin Li // CHECK-NEXT: 2 | char a 360*67e74705SXin Li // CHECK-NEXT: | [sizeof=4, align=2 361*67e74705SXin Li // CHECK-NEXT: | nvsize=3, nvalign=2] 362*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 363*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 364*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct KB 365*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct KA (base) 366*67e74705SXin Li // CHECK-X64-NEXT: 0 | char a 367*67e74705SXin Li // CHECK-X64-NEXT: 2 | char a 368*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=4, align=2 369*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=3, nvalign=2] 370*67e74705SXin Li 371*67e74705SXin Li #pragma pack(1) 372*67e74705SXin Li struct L { funL373*67e74705SXin Li virtual void fun() {} 374*67e74705SXin Li __declspec(align(256)) int Field; 375*67e74705SXin Li }; 376*67e74705SXin Li 377*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 378*67e74705SXin Li // CHECK-NEXT: 0 | struct L 379*67e74705SXin Li // CHECK-NEXT: 0 | (L vftable pointer) 380*67e74705SXin Li // CHECK-NEXT: 256 | int Field 381*67e74705SXin Li // CHECK-NEXT: | [sizeof=512, align=256 382*67e74705SXin Li // CHECK-NEXT: | nvsize=260, nvalign=256] 383*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 384*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct L 385*67e74705SXin Li // CHECK-X64-NEXT: 0 | (L vftable pointer) 386*67e74705SXin Li // CHECK-X64-NEXT: 256 | int Field 387*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=512, align=256 388*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=260, nvalign=256] 389*67e74705SXin Li 390*67e74705SXin Li #pragma pack() 391*67e74705SXin Li struct MA {}; 392*67e74705SXin Li #pragma pack(1) 393*67e74705SXin Li struct MB : virtual MA { 394*67e74705SXin Li __declspec(align(256)) int Field; 395*67e74705SXin Li }; 396*67e74705SXin Li 397*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 398*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 399*67e74705SXin Li // CHECK-NEXT: 0 | struct MB 400*67e74705SXin Li // CHECK-NEXT: 0 | (MB vbtable pointer) 401*67e74705SXin Li // CHECK-NEXT: 256 | int Field 402*67e74705SXin Li // CHECK-NEXT: 260 | struct MA (virtual base) (empty) 403*67e74705SXin Li // CHECK-NEXT: | [sizeof=512, align=256 404*67e74705SXin Li // CHECK-NEXT: | nvsize=260, nvalign=256] 405*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 406*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 407*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct MB 408*67e74705SXin Li // CHECK-X64-NEXT: 0 | (MB vbtable pointer) 409*67e74705SXin Li // CHECK-X64-NEXT: 256 | int Field 410*67e74705SXin Li // CHECK-X64-NEXT: 260 | struct MA (virtual base) (empty) 411*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=512, align=256 412*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=260, nvalign=256] 413*67e74705SXin Li 414*67e74705SXin Li struct RA {}; 415*67e74705SXin Li #pragma pack(1) 416*67e74705SXin Li struct __declspec(align(8)) RB0 { 417*67e74705SXin Li __declspec(align(1024)) int b : 3; 418*67e74705SXin Li }; 419*67e74705SXin Li 420*67e74705SXin Li struct __declspec(align(8)) RB1 { 421*67e74705SXin Li __declspec(align(1024)) int b : 3; fRB1422*67e74705SXin Li virtual void f() {} 423*67e74705SXin Li }; 424*67e74705SXin Li 425*67e74705SXin Li struct __declspec(align(8)) RB2 : virtual RA { 426*67e74705SXin Li __declspec(align(1024)) int b : 3; 427*67e74705SXin Li }; 428*67e74705SXin Li 429*67e74705SXin Li struct __declspec(align(8)) RB3 : virtual RA { 430*67e74705SXin Li __declspec(align(1024)) int b : 3; fRB3431*67e74705SXin Li virtual void f() {} 432*67e74705SXin Li }; 433*67e74705SXin Li 434*67e74705SXin Li struct RC { 435*67e74705SXin Li char _; 436*67e74705SXin Li __declspec(align(1024)) int c : 3; 437*67e74705SXin Li }; 438*67e74705SXin Li struct RE { 439*67e74705SXin Li char _; 440*67e74705SXin Li RC c; 441*67e74705SXin Li }; 442*67e74705SXin Li #pragma pack() 443*67e74705SXin Li 444*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 445*67e74705SXin Li // CHECK-NEXT: 0 | struct RB0 446*67e74705SXin Li // CHECK-NEXT:0:0-2 | int b 447*67e74705SXin Li // CHECK-NEXT: | [sizeof=8, align=1024 448*67e74705SXin Li // CHECK-NEXT: | nvsize=4, nvalign=1024] 449*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 450*67e74705SXin Li // CHECK-NEXT: 0 | struct RB1 451*67e74705SXin Li // CHECK-NEXT: 0 | (RB1 vftable pointer) 452*67e74705SXin Li // CHECK-NEXT: 1024:0-2 | int b 453*67e74705SXin Li // CHECK-NEXT: | [sizeof=1032, align=1024 454*67e74705SXin Li // CHECK-NEXT: | nvsize=1028, nvalign=1024] 455*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 456*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 457*67e74705SXin Li // CHECK-NEXT: 0 | struct RB2 458*67e74705SXin Li // CHECK-NEXT: 0 | (RB2 vbtable pointer) 459*67e74705SXin Li // CHECK-NEXT: 1024:0-2 | int b 460*67e74705SXin Li // CHECK-NEXT: 1028 | struct RA (virtual base) (empty) 461*67e74705SXin Li // CHECK-NEXT: | [sizeof=1032, align=1024 462*67e74705SXin Li // CHECK-NEXT: | nvsize=1028, nvalign=1024] 463*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 464*67e74705SXin Li // CHECK-NEXT: 0 | struct RB3 465*67e74705SXin Li // CHECK-NEXT: 0 | (RB3 vftable pointer) 466*67e74705SXin Li // CHECK-NEXT: 1024 | (RB3 vbtable pointer) 467*67e74705SXin Li // CHECK-NEXT: 2048:0-2 | int b 468*67e74705SXin Li // CHECK-NEXT: 2052 | struct RA (virtual base) (empty) 469*67e74705SXin Li // CHECK-NEXT: | [sizeof=2056, align=1024 470*67e74705SXin Li // CHECK-NEXT: | nvsize=2052, nvalign=1024] 471*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 472*67e74705SXin Li // CHECK-NEXT: 0 | struct RC 473*67e74705SXin Li // CHECK-NEXT: 0 | char _ 474*67e74705SXin Li // CHECK-NEXT: 1024:0-2 | int c 475*67e74705SXin Li // CHECK-NEXT: | [sizeof=1028, align=1024 476*67e74705SXin Li // CHECK-NEXT: | nvsize=1028, nvalign=1024] 477*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 478*67e74705SXin Li // CHECK-NEXT: 0 | struct RE 479*67e74705SXin Li // CHECK-NEXT: 0 | char _ 480*67e74705SXin Li // CHECK-NEXT: 1 | struct RC c 481*67e74705SXin Li // CHECK-NEXT: 1 | char _ 482*67e74705SXin Li // CHECK-NEXT: 1025:0-2 | int c 483*67e74705SXin Li // CHECK-NEXT: | [sizeof=1029, align=1 484*67e74705SXin Li // CHECK-NEXT: | nvsize=1029, nvalign=1] 485*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 486*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RB0 487*67e74705SXin Li // CHECK-X64-NEXT: 0:0-2 | int b 488*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=8, align=1024 489*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=4, nvalign=1024] 490*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 491*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RB1 492*67e74705SXin Li // CHECK-X64-NEXT: 0 | (RB1 vftable pointer) 493*67e74705SXin Li // CHECK-X64-NEXT: 1024:0-2 | int b 494*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=1032, align=1024 495*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=1028, nvalign=1024] 496*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 497*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 498*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RB2 499*67e74705SXin Li // CHECK-X64-NEXT: 0 | (RB2 vbtable pointer) 500*67e74705SXin Li // CHECK-X64-NEXT: 1024:0-2 | int b 501*67e74705SXin Li // CHECK-X64-NEXT: 1028 | struct RA (virtual base) (empty) 502*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=1032, align=1024 503*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=1028, nvalign=1024] 504*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 505*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RB3 506*67e74705SXin Li // CHECK-X64-NEXT: 0 | (RB3 vftable pointer) 507*67e74705SXin Li // CHECK-X64-NEXT: 1024 | (RB3 vbtable pointer) 508*67e74705SXin Li // CHECK-X64-NEXT: 2048:0-2 | int b 509*67e74705SXin Li // CHECK-X64-NEXT: 2052 | struct RA (virtual base) (empty) 510*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=2056, align=1024 511*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=2052, nvalign=1024] 512*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 513*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RC 514*67e74705SXin Li // CHECK-X64-NEXT: 0 | char _ 515*67e74705SXin Li // CHECK-X64-NEXT: 1024:0-2 | int c 516*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=1028, align=1024 517*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=1028, nvalign=1024] 518*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 519*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RE 520*67e74705SXin Li // CHECK-X64-NEXT: 0 | char _ 521*67e74705SXin Li // CHECK-X64-NEXT: 1 | struct RC c 522*67e74705SXin Li // CHECK-X64-NEXT: 1 | char _ 523*67e74705SXin Li // CHECK-X64-NEXT: 1025:0-2 | int c 524*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=1029, align=1 525*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=1029, nvalign=1] 526*67e74705SXin Li 527*67e74705SXin Li struct NA {}; 528*67e74705SXin Li struct NB {}; 529*67e74705SXin Li #pragma pack(push, 1) 530*67e74705SXin Li struct NC : virtual NA, virtual NB {}; 531*67e74705SXin Li #pragma pack(pop) 532*67e74705SXin Li struct ND : NC {}; 533*67e74705SXin Li 534*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 535*67e74705SXin Li // CHECK-NEXT: 0 | struct NA (empty) 536*67e74705SXin Li // CHECK-NEXT: | [sizeof=1, align=1 537*67e74705SXin Li // CHECK-NEXT: | nvsize=0, nvalign=1] 538*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 539*67e74705SXin Li // CHECK-NEXT: 0 | struct NB (empty) 540*67e74705SXin Li // CHECK-NEXT: | [sizeof=1, align=1 541*67e74705SXin Li // CHECK-NEXT: | nvsize=0, nvalign=1] 542*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 543*67e74705SXin Li // CHECK-NEXT: 0 | struct NC 544*67e74705SXin Li // CHECK-NEXT: 0 | (NC vbtable pointer) 545*67e74705SXin Li // CHECK-NEXT: 4 | struct NA (virtual base) (empty) 546*67e74705SXin Li // CHECK-NEXT: 8 | struct NB (virtual base) (empty) 547*67e74705SXin Li // CHECK-NEXT: | [sizeof=8, align=1 548*67e74705SXin Li // CHECK-NEXT: | nvsize=4, nvalign=1] 549*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 550*67e74705SXin Li // CHECK-NEXT: 0 | struct ND 551*67e74705SXin Li // CHECK-NEXT: 0 | struct NC (base) 552*67e74705SXin Li // CHECK-NEXT: 0 | (NC vbtable pointer) 553*67e74705SXin Li // CHECK-NEXT: 4 | struct NA (virtual base) (empty) 554*67e74705SXin Li // CHECK-NEXT: 8 | struct NB (virtual base) (empty) 555*67e74705SXin Li // CHECK-NEXT: | [sizeof=8, align=4 556*67e74705SXin Li // CHECK-NEXT: | nvsize=4, nvalign=4] 557*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 558*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct NA (empty) 559*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=1, align=1 560*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=0, nvalign=1] 561*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 562*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct NB (empty) 563*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=1, align=1 564*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=0, nvalign=1] 565*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 566*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct NC 567*67e74705SXin Li // CHECK-X64-NEXT: 0 | (NC vbtable pointer) 568*67e74705SXin Li // CHECK-X64-NEXT: 8 | struct NA (virtual base) (empty) 569*67e74705SXin Li // CHECK-X64-NEXT: 12 | struct NB (virtual base) (empty) 570*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=12, align=1 571*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=8, nvalign=1] 572*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 573*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct ND 574*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct NC (base) 575*67e74705SXin Li // CHECK-X64-NEXT: 0 | (NC vbtable pointer) 576*67e74705SXin Li // CHECK-X64-NEXT: 8 | struct NA (virtual base) (empty) 577*67e74705SXin Li // CHECK-X64-NEXT: 12 | struct NB (virtual base) (empty) 578*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=12, align=4 579*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=8, nvalign=4] 580*67e74705SXin Li 581*67e74705SXin Li struct OA {}; 582*67e74705SXin Li struct OB {}; 583*67e74705SXin Li struct OC : virtual OA, virtual OB {}; 584*67e74705SXin Li #pragma pack(push, 1) 585*67e74705SXin Li struct OD : OC {}; 586*67e74705SXin Li #pragma pack(pop) 587*67e74705SXin Li 588*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 589*67e74705SXin Li // CHECK-NEXT: 0 | struct OA (empty) 590*67e74705SXin Li // CHECK-NEXT: | [sizeof=1, align=1 591*67e74705SXin Li // CHECK-NEXT: | nvsize=0, nvalign=1] 592*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 593*67e74705SXin Li // CHECK-NEXT: 0 | struct OB (empty) 594*67e74705SXin Li // CHECK-NEXT: | [sizeof=1, align=1 595*67e74705SXin Li // CHECK-NEXT: | nvsize=0, nvalign=1] 596*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 597*67e74705SXin Li // CHECK-NEXT: 0 | struct OC 598*67e74705SXin Li // CHECK-NEXT: 0 | (OC vbtable pointer) 599*67e74705SXin Li // CHECK-NEXT: 4 | struct OA (virtual base) (empty) 600*67e74705SXin Li // CHECK-NEXT: 8 | struct OB (virtual base) (empty) 601*67e74705SXin Li // CHECK-NEXT: | [sizeof=8, align=4 602*67e74705SXin Li // CHECK-NEXT: | nvsize=4, nvalign=4] 603*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 604*67e74705SXin Li // CHECK-NEXT: 0 | struct OD 605*67e74705SXin Li // CHECK-NEXT: 0 | struct OC (base) 606*67e74705SXin Li // CHECK-NEXT: 0 | (OC vbtable pointer) 607*67e74705SXin Li // CHECK-NEXT: 4 | struct OA (virtual base) (empty) 608*67e74705SXin Li // CHECK-NEXT: 8 | struct OB (virtual base) (empty) 609*67e74705SXin Li // CHECK-NEXT: | [sizeof=8, align=1 610*67e74705SXin Li // CHECK-NEXT: | nvsize=4, nvalign=1] 611*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 612*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct OA (empty) 613*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=1, align=1 614*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=0, nvalign=1] 615*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 616*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct OB (empty) 617*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=1, align=1 618*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=0, nvalign=1] 619*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 620*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct OC 621*67e74705SXin Li // CHECK-X64-NEXT: 0 | (OC vbtable pointer) 622*67e74705SXin Li // CHECK-X64-NEXT: 8 | struct OA (virtual base) (empty) 623*67e74705SXin Li // CHECK-X64-NEXT: 12 | struct OB (virtual base) (empty) 624*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=16, align=8 625*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=8, nvalign=8] 626*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 627*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct OD 628*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct OC (base) 629*67e74705SXin Li // CHECK-X64-NEXT: 0 | (OC vbtable pointer) 630*67e74705SXin Li // CHECK-X64-NEXT: 8 | struct OA (virtual base) (empty) 631*67e74705SXin Li // CHECK-X64-NEXT: 12 | struct OB (virtual base) (empty) 632*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=12, align=1 633*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=8, nvalign=1] 634*67e74705SXin Li 635*67e74705SXin Li struct __declspec(align(4)) PA { 636*67e74705SXin Li int c; 637*67e74705SXin Li }; 638*67e74705SXin Li 639*67e74705SXin Li typedef __declspec(align(8)) PA PB; 640*67e74705SXin Li 641*67e74705SXin Li #pragma pack(push, 1) 642*67e74705SXin Li struct PC { 643*67e74705SXin Li char a; 644*67e74705SXin Li PB x; 645*67e74705SXin Li }; 646*67e74705SXin Li #pragma pack(pop) 647*67e74705SXin Li 648*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 649*67e74705SXin Li // CHECK: 0 | struct PC 650*67e74705SXin Li // CHECK-NEXT: 0 | char a 651*67e74705SXin Li // CHECK-NEXT: 8 | struct PA x 652*67e74705SXin Li // CHECK-NEXT: 8 | int c 653*67e74705SXin Li // CHECK-NEXT: | [sizeof=16, align=8 654*67e74705SXin Li // CHECK-NEXT: | nvsize=12, nvalign=8] 655*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 656*67e74705SXin Li // CHECK-X64: 0 | struct PC 657*67e74705SXin Li // CHECK-X64-NEXT: 0 | char a 658*67e74705SXin Li // CHECK-X64-NEXT: 8 | struct PA x 659*67e74705SXin Li // CHECK-X64-NEXT: 8 | int c 660*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=16, align=8 661*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=12, nvalign=8] 662*67e74705SXin Li 663*67e74705SXin Li typedef PB PD; 664*67e74705SXin Li 665*67e74705SXin Li #pragma pack(push, 1) 666*67e74705SXin Li struct PE { 667*67e74705SXin Li char a; 668*67e74705SXin Li PD x; 669*67e74705SXin Li }; 670*67e74705SXin Li #pragma pack(pop) 671*67e74705SXin Li 672*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 673*67e74705SXin Li // CHECK: 0 | struct PE 674*67e74705SXin Li // CHECK-NEXT: 0 | char a 675*67e74705SXin Li // CHECK-NEXT: 8 | struct PA x 676*67e74705SXin Li // CHECK-NEXT: 8 | int c 677*67e74705SXin Li // CHECK-NEXT: | [sizeof=16, align=8 678*67e74705SXin Li // CHECK-NEXT: | nvsize=12, nvalign=8] 679*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 680*67e74705SXin Li // CHECK-X64: 0 | struct PE 681*67e74705SXin Li // CHECK-X64-NEXT: 0 | char a 682*67e74705SXin Li // CHECK-X64-NEXT: 8 | struct PA x 683*67e74705SXin Li // CHECK-X64-NEXT: 8 | int c 684*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=16, align=8 685*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=12, nvalign=8] 686*67e74705SXin Li 687*67e74705SXin Li typedef int __declspec(align(2)) QA; 688*67e74705SXin Li #pragma pack(push, 1) 689*67e74705SXin Li struct QB { 690*67e74705SXin Li char a; 691*67e74705SXin Li QA b; 692*67e74705SXin Li }; 693*67e74705SXin Li #pragma pack(pop) 694*67e74705SXin Li 695*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 696*67e74705SXin Li // CHECK-NEXT: 0 | struct QB 697*67e74705SXin Li // CHECK-NEXT: 0 | char a 698*67e74705SXin Li // CHECK-NEXT: 2 | QA b 699*67e74705SXin Li // CHECK-NEXT: | [sizeof=6, align=2 700*67e74705SXin Li // CHECK-NEXT: | nvsize=6, nvalign=2] 701*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 702*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct QB 703*67e74705SXin Li // CHECK-X64-NEXT: 0 | char a 704*67e74705SXin Li // CHECK-X64-NEXT: 2 | QA b 705*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=6, align=2 706*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=6, nvalign=2] 707*67e74705SXin Li 708*67e74705SXin Li struct QC { 709*67e74705SXin Li char a; 710*67e74705SXin Li QA b; 711*67e74705SXin Li }; 712*67e74705SXin Li 713*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 714*67e74705SXin Li // CHECK-NEXT: 0 | struct QC 715*67e74705SXin Li // CHECK-NEXT: 0 | char a 716*67e74705SXin Li // CHECK-NEXT: 4 | QA b 717*67e74705SXin Li // CHECK-NEXT: | [sizeof=8, align=4 718*67e74705SXin Li // CHECK-NEXT: | nvsize=8, nvalign=4] 719*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 720*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct QC 721*67e74705SXin Li // CHECK-X64-NEXT: 0 | char a 722*67e74705SXin Li // CHECK-X64-NEXT: 4 | QA b 723*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=8, align=4 724*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=8, nvalign=4] 725*67e74705SXin Li 726*67e74705SXin Li struct QD { 727*67e74705SXin Li char a; 728*67e74705SXin Li QA b : 3; 729*67e74705SXin Li }; 730*67e74705SXin Li 731*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 732*67e74705SXin Li // CHECK-NEXT: 0 | struct QD 733*67e74705SXin Li // CHECK-NEXT: 0 | char a 734*67e74705SXin Li // CHECK-NEXT:4:0-2 | QA b 735*67e74705SXin Li // CHECK-NEXT: | [sizeof=8, align=4 736*67e74705SXin Li // CHECK-NEXT: | nvsize=8, nvalign=4] 737*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 738*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct QD 739*67e74705SXin Li // CHECK-X64-NEXT: 0 | char a 740*67e74705SXin Li // CHECK-X64-NEXT:4:0-2 | QA b 741*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=8, align=4 742*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=8, nvalign=4] 743*67e74705SXin Li 744*67e74705SXin Li struct __declspec(align(4)) EmptyAlignedLongLongMemb { 745*67e74705SXin Li long long FlexArrayMemb[0]; 746*67e74705SXin Li }; 747*67e74705SXin Li 748*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 749*67e74705SXin Li // CHECK-NEXT: 0 | struct EmptyAlignedLongLongMemb 750*67e74705SXin Li // CHECK-NEXT: 0 | long long [0] FlexArrayMemb 751*67e74705SXin Li // CHECK-NEXT: | [sizeof=8, align=8 752*67e74705SXin Li // CHECK-NEXT: | nvsize=0, nvalign=8] 753*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 754*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct EmptyAlignedLongLongMemb 755*67e74705SXin Li // CHECK-X64-NEXT: 0 | long long [0] FlexArrayMemb 756*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=8, align=8 757*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=0, nvalign=8] 758*67e74705SXin Li 759*67e74705SXin Li #pragma pack(1) 760*67e74705SXin Li struct __declspec(align(4)) EmptyPackedAlignedLongLongMemb { 761*67e74705SXin Li long long FlexArrayMemb[0]; 762*67e74705SXin Li }; 763*67e74705SXin Li #pragma pack() 764*67e74705SXin Li 765*67e74705SXin Li // CHECK: *** Dumping AST Record Layout 766*67e74705SXin Li // CHECK-NEXT: 0 | struct EmptyPackedAlignedLongLongMemb 767*67e74705SXin Li // CHECK-NEXT: 0 | long long [0] FlexArrayMemb 768*67e74705SXin Li // CHECK-NEXT: | [sizeof=4, align=4 769*67e74705SXin Li // CHECK-NEXT: | nvsize=0, nvalign=4] 770*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout 771*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct EmptyPackedAlignedLongLongMemb 772*67e74705SXin Li // CHECK-X64-NEXT: 0 | long long [0] FlexArrayMemb 773*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=4, align=4 774*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=0, nvalign=4] 775*67e74705SXin Li 776*67e74705SXin Li int a[ 777*67e74705SXin Li sizeof(X)+ 778*67e74705SXin Li sizeof(Y)+ 779*67e74705SXin Li sizeof(Z)+ 780*67e74705SXin Li sizeof(C1)+ 781*67e74705SXin Li sizeof(CA2)+ 782*67e74705SXin Li sizeof(YA)+ 783*67e74705SXin Li sizeof(YB)+ 784*67e74705SXin Li sizeof(YC)+ 785*67e74705SXin Li sizeof(YD)+ 786*67e74705SXin Li sizeof(YE)+ 787*67e74705SXin Li sizeof(YF)+ 788*67e74705SXin Li sizeof(YF)+ 789*67e74705SXin Li sizeof(D2)+ 790*67e74705SXin Li sizeof(JC)+ 791*67e74705SXin Li sizeof(KB)+ 792*67e74705SXin Li sizeof(L)+ 793*67e74705SXin Li sizeof(MB)+ 794*67e74705SXin Li sizeof(RB0)+ 795*67e74705SXin Li sizeof(RB1)+ 796*67e74705SXin Li sizeof(RB2)+ 797*67e74705SXin Li sizeof(RB3)+ 798*67e74705SXin Li sizeof(RC)+ 799*67e74705SXin Li sizeof(RE)+ 800*67e74705SXin Li sizeof(ND)+ 801*67e74705SXin Li sizeof(OD)+ 802*67e74705SXin Li sizeof(PC)+ 803*67e74705SXin Li sizeof(PE)+ 804*67e74705SXin Li sizeof(QB)+ 805*67e74705SXin Li sizeof(QC)+ 806*67e74705SXin Li sizeof(QD)+ 807*67e74705SXin Li sizeof(EmptyAlignedLongLongMemb)+ 808*67e74705SXin Li sizeof(EmptyPackedAlignedLongLongMemb)+ 809*67e74705SXin Li 0]; 810