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