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