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