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