Home | History | Annotate | Download | only in Sema
      1 // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fms-extensions -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 -fms-extensions -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:*** Dumping AST Record Layout
     17 // CHECK-NEXT:      0 | struct A
     18 // CHECK-NEXT:      0 |   char x
     19 // CHECK-NEXT: 4:0-21 |   int a
     20 // CHECK-NEXT:    8:- |   int
     21 // CHECK-NEXT:  8:0-9 |   int c
     22 // CHECK-NEXT: 12:0-2 |   char b
     23 // CHECK-NEXT: 12:3-6 |   char d
     24 // CHECK-NEXT:     14 |   short y
     25 // CHECK-NEXT:        | [sizeof=16, align=4]
     26 
     27 typedef struct B {
     28 	char x;
     29 	int : 0;
     30 	short a : 4;
     31 	char y;
     32 } B;
     33 
     34 // CHECK:*** Dumping AST Record Layout
     35 // CHECK-NEXT:      0 | struct B
     36 // CHECK-NEXT:      0 |   char x
     37 // CHECK-NEXT:    1:- |   int
     38 // CHECK-NEXT:  2:0-3 |   short a
     39 // CHECK-NEXT:      4 |   char y
     40 // CHECK-NEXT:        | [sizeof=6, align=2]
     41 
     42 typedef struct C {
     43 	char x;
     44 	short a : 4;
     45 	int : 0;
     46 	char y;
     47 } C;
     48 
     49 // CHECK:*** Dumping AST Record Layout
     50 // CHECK-NEXT:      0 | struct C
     51 // CHECK-NEXT:      0 |   char x
     52 // CHECK-NEXT:  2:0-3 |   short a
     53 // CHECK-NEXT:    4:- |   int
     54 // CHECK-NEXT:      4 |   char y
     55 // CHECK-NEXT:        | [sizeof=8, align=4]
     56 
     57 typedef struct D {
     58 	char x;
     59 	short : 0;
     60 	int : 0;
     61 	char y;
     62 } D;
     63 
     64 // CHECK:*** Dumping AST Record Layout
     65 // CHECK-NEXT:      0 | struct D
     66 // CHECK-NEXT:      0 |   char x
     67 // CHECK-NEXT:    1:- |   short
     68 // CHECK-NEXT:    1:- |   int
     69 // CHECK-NEXT:      1 |   char y
     70 // CHECK-NEXT:        | [sizeof=2, align=1]
     71 
     72 typedef union E {
     73 	char x;
     74 	long long a : 3;
     75 	int b : 3;
     76 	long long : 0;
     77 	short y;
     78 } E;
     79 
     80 
     81 // CHECK:*** Dumping AST Record Layout
     82 // CHECK-NEXT:      0 | union E
     83 // CHECK-NEXT:      0 |   char x
     84 // CHECK-NEXT:  0:0-2 |   long long a
     85 // CHECK-NEXT:  0:0-2 |   int b
     86 // CHECK-NEXT:    0:- |   long long
     87 // CHECK-NEXT:      0 |   short
     88 // CHECK-NEXT:        | [sizeof=8, align=2]
     89 
     90 typedef struct F {
     91 	char x;
     92 	char a : 3;
     93 	char b : 3;
     94 	char c : 3;
     95 	short d : 6;
     96 	short e : 6;
     97 	short f : 6;
     98 	short g : 11;
     99 	short h : 11;
    100 	short i : 11;
    101 	short y;
    102 } F;
    103 
    104 // CHECK:*** Dumping AST Record Layout
    105 // CHECK-NEXT:      0 | struct F
    106 // CHECK-NEXT:      0 |   char x
    107 // CHECK-NEXT:  1:0-2 |   char a
    108 // CHECK-NEXT:  1:3-5 |   char b
    109 // CHECK-NEXT:  2:0-2 |   char c
    110 // CHECK-NEXT:  4:0-5 |   short d
    111 // CHECK-NEXT: 4:6-11 |   short e
    112 // CHECK-NEXT:  6:0-5 |   short f
    113 // CHECK-NEXT: 8:0-10 |   short g
    114 // CHECK-NEXT:10:0-10 |   short h
    115 // CHECK-NEXT:12:0-10 |   short i
    116 // CHECK-NEXT:     14 |   short y
    117 // CHECK-NEXT:        | [sizeof=16, align=2]
    118 
    119 typedef union G {
    120 	char x;
    121 	int a : 3;
    122 	int : 0;
    123 	long long : 0;
    124 	short y;
    125 } G;
    126 
    127 // CHECK:*** Dumping AST Record Layout
    128 // CHECK-NEXT:      0 | union G
    129 // CHECK-NEXT:      0 |   char x
    130 // CHECK-NEXT:  0:0-2 |   int a
    131 // CHECK-NEXT:    0:- |   int
    132 // CHECK-NEXT:    0:- |   long long
    133 // CHECK-NEXT:      0 |   short y
    134 // CHECK-NEXT:        | [sizeof=4, align=2]
    135 
    136 typedef struct H {
    137 	unsigned short a : 1;
    138 	unsigned char : 0;
    139 	unsigned long : 0;
    140 	unsigned short c : 1;
    141 } H;
    142 
    143 // CHECK:*** Dumping AST Record Layout
    144 // CHECK-NEXT:      0 | struct H
    145 // CHECK-NEXT:  0:0-0 |   unsigned short a
    146 // CHECK-NEXT:    2:- |   unsigned char
    147 // CHECK-NEXT:    2:- |   unsigned long
    148 // CHECK-NEXT:  2:0-0 |   unsigned short c
    149 // CHECK-NEXT:        | [sizeof=4, align=2]
    150 
    151 typedef struct I {
    152 	short : 8;
    153 	__declspec(align(16)) short : 8;
    154 } I;
    155 
    156 
    157 // CHECK:*** Dumping AST Record Layout
    158 // CHECK-NEXT:      0 | struct I
    159 // CHECK-NEXT:  0:0-7 |   short
    160 // CHECK-NEXT:  1:0-7 |   short
    161 // CHECK-NEXT:        | [sizeof=2, align=2]
    162 
    163 #pragma pack(push, 1)
    164 
    165 typedef struct A1 {
    166 	char x;
    167 	int a : 22;
    168 	int : 0;
    169 	int c : 10;
    170 	char b : 3;
    171 	char d: 4;
    172 	short y;
    173 } A1;
    174 
    175 // CHECK:*** Dumping AST Record Layout
    176 // CHECK-NEXT:      0 | struct A1
    177 // CHECK-NEXT:      0 |   char x
    178 // CHECK-NEXT: 1:0-21 |   int a
    179 // CHECK-NEXT:    5:- |   int
    180 // CHECK-NEXT:  5:0-9 |   int c
    181 // CHECK-NEXT:  9:0-2 |   char b
    182 // CHECK-NEXT:  9:3-6 |   char d
    183 // CHECK-NEXT:     10 |   short y
    184 // CHECK-NEXT:        | [sizeof=12, align=1]
    185 
    186 typedef struct B1 {
    187 	char x;
    188 	int : 0;
    189 	short a : 4;
    190 	char y;
    191 } B1;
    192 
    193 // CHECK:*** Dumping AST Record Layout
    194 // CHECK-NEXT:      0 | struct B1
    195 // CHECK-NEXT:      0 |   char x
    196 // CHECK-NEXT:    1:- |   int
    197 // CHECK-NEXT:  1:0-3 |   short
    198 // CHECK-NEXT:      3 |   char y
    199 // CHECK-NEXT:        | [sizeof=4, align=1]
    200 
    201 typedef struct C1 {
    202 	char x;
    203 	short a : 4;
    204 	int : 0;
    205 	char y;
    206 } C1;
    207 
    208 // CHECK:*** Dumping AST Record Layout
    209 // CHECK-NEXT:      0 | struct C1
    210 // CHECK-NEXT:      0 |   char x
    211 // CHECK-NEXT:  1:0-3 |   short
    212 // CHECK-NEXT:    3:- |   int
    213 // CHECK-NEXT:      3 |   char y
    214 // CHECK-NEXT:        | [sizeof=4, align=1]
    215 
    216 typedef struct D1 {
    217 	char x;
    218 	short : 0;
    219 	int : 0;
    220 	char y;
    221 } D1;
    222 
    223 // CHECK:*** Dumping AST Record Layout
    224 // CHECK-NEXT:      0 | struct D1
    225 // CHECK-NEXT:      0 |   char x
    226 // CHECK-NEXT:    1:- |   short
    227 // CHECK-NEXT:    1:- |   int
    228 // CHECK-NEXT:      1 |   char y
    229 // CHECK-NEXT:        | [sizeof=2, align=1]
    230 
    231 typedef union E1 {
    232 	char x;
    233 	long long a : 3;
    234 	int b : 3;
    235 	long long : 0;
    236 	short y;
    237 } E1;
    238 
    239 // CHECK:*** Dumping AST Record Layout
    240 // CHECK-NEXT:      0 | union E1
    241 // CHECK-NEXT:      0 |   char x
    242 // CHECK-NEXT:  0:0-2 |   long long a
    243 // CHECK-NEXT:  0:0-2 |   int b
    244 // CHECK-NEXT:    0:- |   long long
    245 // CHECK-NEXT:      0 |   short y
    246 // CHECK-NEXT:        | [sizeof=8, align=1]
    247 
    248 typedef struct F1 {
    249 	char x;
    250 	char a : 3;
    251 	char b : 3;
    252 	char c : 3;
    253 	short d : 6;
    254 	short e : 6;
    255 	short f : 6;
    256 	short g : 11;
    257 	short h : 11;
    258 	short i : 11;
    259 	short y;
    260 } F1;
    261 
    262 // CHECK:*** Dumping AST Record Layout
    263 // CHECK-NEXT:      0 | struct F1
    264 // CHECK-NEXT:      0 |   char x
    265 // CHECK-NEXT:  1:0-2 |   char a
    266 // CHECK-NEXT:  1:3-5 |   char b
    267 // CHECK-NEXT:  2:0-2 |   char c
    268 // CHECK-NEXT:  3:0-5 |   short d
    269 // CHECK-NEXT: 3:6-11 |   short e
    270 // CHECK-NEXT:  5:0-5 |   short f
    271 // CHECK-NEXT: 7:0-10 |   short g
    272 // CHECK-NEXT: 9:0-10 |   short h
    273 // CHECK-NEXT:11:0-10 |   short i
    274 // CHECK-NEXT:     13 |   short y
    275 // CHECK-NEXT:        | [sizeof=15, align=1]
    276 
    277 typedef union G1 {
    278 	char x;
    279 	int a : 3;
    280 	int : 0;
    281 	long long : 0;
    282 	short y;
    283 } G1;
    284 
    285 // CHECK:*** Dumping AST Record Layout
    286 // CHECK-NEXT:      0 | union G1
    287 // CHECK-NEXT:      0 |   char x
    288 // CHECK-NEXT:  0:0-2 |   int a
    289 // CHECK-NEXT:    0:- |   int
    290 // CHECK-NEXT:    0:- |   long long
    291 // CHECK-NEXT:      0 |   short y
    292 // CHECK-NEXT:        | [sizeof=4, align=1]
    293 
    294 typedef struct H1 {
    295 	unsigned long a : 1;
    296 	unsigned char : 0;
    297 	unsigned long : 0;
    298 	unsigned long c : 1;
    299 } H1;
    300 
    301 // CHECK:*** Dumping AST Record Layout
    302 // CHECK-NEXT:      0 | struct H1
    303 // CHECK-NEXT:  0:0-0 |   unsigned long a
    304 // CHECK-NEXT:    4:- |   unsigned char
    305 // CHECK-NEXT:    4:- |   unsigned long
    306 // CHECK-NEXT:  4:0-0 |   unsigned long c
    307 // CHECK-NEXT:        | [sizeof=8, align=1]
    308 
    309 typedef struct I1 {
    310 	short : 8;
    311 	__declspec(align(16)) short : 8;
    312 } I1;
    313 
    314 // CHECK:*** Dumping AST Record Layout
    315 // CHECK-NEXT:      0 | struct I1
    316 // CHECK-NEXT:  0:0-7 |   short
    317 // CHECK-NEXT:  1:0-7 |   short
    318 // CHECK-NEXT:        | [sizeof=2, align=1]
    319 
    320 #pragma pack(pop)
    321 
    322 int x[
    323 sizeof(A ) +
    324 sizeof(B ) +
    325 sizeof(C ) +
    326 sizeof(D ) +
    327 sizeof(E ) +
    328 sizeof(F ) +
    329 sizeof(G ) +
    330 sizeof(H ) +
    331 sizeof(I ) +
    332 sizeof(A1) +
    333 sizeof(B1) +
    334 sizeof(C1) +
    335 sizeof(D1) +
    336 sizeof(E1) +
    337 sizeof(F1) +
    338 sizeof(G1) +
    339 sizeof(H1) +
    340 sizeof(I1) +
    341 0];
    342