1 // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -cxx-abi microsoft -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 -cxx-abi microsoft -fdump-record-layouts %s 2>/dev/null \ 4 // RUN: | FileCheck %s 5 6 typedef struct A { 7 char x; 8 int a : 22; 9 int : 0; 10 int c : 10; 11 char b : 3; 12 char d: 4; 13 short y; 14 } A; 15 16 // CHECK: Type: struct A 17 // CHECK: Size:128 18 // CHECK: Alignment:32 19 // CHECK: FieldOffsets: [0, 32, 64, 64, 96, 99, 112]> 20 21 typedef struct B { 22 char x; 23 int : 0; 24 short a : 4; 25 char y; 26 } B; 27 28 // CHECK: Type: struct B 29 // CHECK: Size:48 30 // CHECK: Alignment:16 31 // CHECK: FieldOffsets: [0, 8, 16, 32]> 32 33 typedef struct C { 34 char x; 35 short a : 4; 36 int : 0; 37 char y; 38 } C; 39 40 // CHECK: Type: struct C 41 // CHECK: Size:64 42 // CHECK: Alignment:32 43 // CHECK: FieldOffsets: [0, 16, 32, 32]> 44 45 typedef struct D { 46 char x; 47 short : 0; 48 int : 0; 49 char y; 50 } D; 51 52 // CHECK: Type: struct D 53 // CHECK: Size:16 54 // CHECK: Alignment:8 55 // CHECK: FieldOffsets: [0, 8, 8, 8]> 56 57 typedef union E { 58 char x; 59 long long a : 3; 60 int b : 3; 61 long long : 0; 62 short y; 63 } E; 64 65 // CHECK: Type: union E 66 // CHECK: Size:64 67 // CHECK: Alignment:16 68 // CHECK: FieldOffsets: [0, 0, 0, 0, 0]> 69 70 typedef struct F { 71 char x; 72 char a : 3; 73 char b : 3; 74 char c : 3; 75 short d : 6; 76 short e : 6; 77 short f : 6; 78 short g : 11; 79 short h : 11; 80 short i : 11; 81 short y; 82 } F; 83 84 // CHECK: Type: struct F 85 // CHECK: Size:128 86 // CHECK: Alignment:16 87 // CHECK: FieldOffsets: [0, 8, 11, 16, 32, 38, 48, 64, 80, 96, 112]> 88 89 typedef union G { 90 char x; 91 int a : 3; 92 int : 0; 93 long long : 0; 94 short y; 95 } G; 96 97 // CHECK: Type: union G 98 // CHECK: Size:32 99 // CHECK: Alignment:16 100 // CHECK: FieldOffsets: [0, 0, 0, 0, 0]> 101 102 typedef struct H { 103 unsigned short a : 1; 104 unsigned char : 0; 105 unsigned long : 0; 106 unsigned short c : 1; 107 } H; 108 109 // CHECK: Type: struct H 110 // CHECK: Size:32 111 // CHECK: Alignment:16 112 // CHECK: FieldOffsets: [0, 16, 16, 16]> 113 114 #pragma pack(push, 1) 115 116 typedef struct A1 { 117 char x; 118 int a : 22; 119 int : 0; 120 int c : 10; 121 char b : 3; 122 char d: 4; 123 short y; 124 } A1; 125 126 // CHECK: Type: struct A1 127 // CHECK: Size:96 128 // CHECK: Alignment:8 129 // CHECK: FieldOffsets: [0, 8, 40, 40, 72, 75, 80]> 130 131 typedef struct B1 { 132 char x; 133 int : 0; 134 short a : 4; 135 char y; 136 } B1; 137 138 // CHECK: Type: struct B1 139 // CHECK: Size:32 140 // CHECK: Alignment:8 141 // CHECK: FieldOffsets: [0, 8, 8, 24]> 142 143 typedef struct C1 { 144 char x; 145 short a : 4; 146 int : 0; 147 char y; 148 } C1; 149 150 // CHECK: Type: struct C1 151 // CHECK: Size:32 152 // CHECK: Alignment:8 153 // CHECK: FieldOffsets: [0, 8, 24, 24]> 154 155 typedef struct D1 { 156 char x; 157 short : 0; 158 int : 0; 159 char y; 160 } D1; 161 162 // CHECK: Type: struct D1 163 // CHECK: Size:16 164 // CHECK: Alignment:8 165 // CHECK: FieldOffsets: [0, 8, 8, 8]> 166 167 typedef union E1 { 168 char x; 169 long long a : 3; 170 int b : 3; 171 long long : 0; 172 short y; 173 } E1; 174 175 // CHECK: Type: union E1 176 // CHECK: Size:64 177 // CHECK: Alignment:8 178 // CHECK: FieldOffsets: [0, 0, 0, 0, 0]> 179 180 typedef struct F1 { 181 char x; 182 char a : 3; 183 char b : 3; 184 char c : 3; 185 short d : 6; 186 short e : 6; 187 short f : 6; 188 short g : 11; 189 short h : 11; 190 short i : 11; 191 short y; 192 } F1; 193 194 // CHECK: Type: struct F1 195 // CHECK: Size:120 196 // CHECK: Alignment:8 197 // CHECK: FieldOffsets: [0, 8, 11, 16, 24, 30, 40, 56, 72, 88, 104]> 198 199 typedef union G1 { 200 char x; 201 int a : 3; 202 int : 0; 203 long long : 0; 204 short y; 205 } G1; 206 207 // CHECK: Type: union G1 208 // CHECK: Size:32 209 // CHECK: Alignment:8 210 // CHECK: FieldOffsets: [0, 0, 0, 0, 0]> 211 212 typedef struct H1 { 213 unsigned long a : 1; 214 unsigned char : 0; 215 unsigned long : 0; 216 unsigned long c : 1; 217 } H1; 218 219 // CHECK: Type: struct H1 220 // CHECK: Size:64 221 // CHECK: Alignment:8 222 // CHECK: FieldOffsets: [0, 32, 32, 32]> 223 224 #pragma pack(pop) 225 226 int x[ 227 sizeof(A ) + 228 sizeof(B ) + 229 sizeof(C ) + 230 sizeof(D ) + 231 sizeof(E ) + 232 sizeof(F ) + 233 sizeof(G ) + 234 sizeof(H ) + 235 sizeof(A1) + 236 sizeof(B1) + 237 sizeof(C1) + 238 sizeof(D1) + 239 sizeof(E1) + 240 sizeof(F1) + 241 sizeof(G1) + 242 sizeof(H1) + 243 0]; 244