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: 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 typedef struct I {
    115 	short : 8;
    116 	__declspec(align(16)) short : 8;
    117 } I;
    118 
    119 // CHECK: Type: struct I
    120 // CHECK:   Size:16
    121 // CHECK:   Alignment:16
    122 // CHECK:   FieldOffsets: [0, 8]
    123 
    124 #pragma pack(push, 1)
    125 
    126 typedef struct A1 {
    127 	char x;
    128 	int a : 22;
    129 	int : 0;
    130 	int c : 10;
    131 	char b : 3;
    132 	char d: 4;
    133 	short y;
    134 } A1;
    135 
    136 // CHECK: Type: struct A1
    137 // CHECK:   Size:96
    138 // CHECK:   Alignment:8
    139 // CHECK:   FieldOffsets: [0, 8, 40, 40, 72, 75, 80]>
    140 
    141 typedef struct B1 {
    142 	char x;
    143 	int : 0;
    144 	short a : 4;
    145 	char y;
    146 } B1;
    147 
    148 // CHECK: Type: struct B1
    149 // CHECK:   Size:32
    150 // CHECK:   Alignment:8
    151 // CHECK:   FieldOffsets: [0, 8, 8, 24]>
    152 
    153 typedef struct C1 {
    154 	char x;
    155 	short a : 4;
    156 	int : 0;
    157 	char y;
    158 } C1;
    159 
    160 // CHECK: Type: struct C1
    161 // CHECK:   Size:32
    162 // CHECK:   Alignment:8
    163 // CHECK:   FieldOffsets: [0, 8, 24, 24]>
    164 
    165 typedef struct D1 {
    166 	char x;
    167 	short : 0;
    168 	int : 0;
    169 	char y;
    170 } D1;
    171 
    172 // CHECK: Type: struct D1
    173 // CHECK:   Size:16
    174 // CHECK:   Alignment:8
    175 // CHECK:   FieldOffsets: [0, 8, 8, 8]>
    176 
    177 typedef union E1 {
    178 	char x;
    179 	long long a : 3;
    180 	int b : 3;
    181 	long long : 0;
    182 	short y;
    183 } E1;
    184 
    185 // CHECK: Type: union E1
    186 // CHECK:   Size:64
    187 // CHECK:   Alignment:8
    188 // CHECK:   FieldOffsets: [0, 0, 0, 0, 0]>
    189 
    190 typedef struct F1 {
    191 	char x;
    192 	char a : 3;
    193 	char b : 3;
    194 	char c : 3;
    195 	short d : 6;
    196 	short e : 6;
    197 	short f : 6;
    198 	short g : 11;
    199 	short h : 11;
    200 	short i : 11;
    201 	short y;
    202 } F1;
    203 
    204 // CHECK: Type: struct F1
    205 // CHECK:   Size:120
    206 // CHECK:   Alignment:8
    207 // CHECK:   FieldOffsets: [0, 8, 11, 16, 24, 30, 40, 56, 72, 88, 104]>
    208 
    209 typedef union G1 {
    210 	char x;
    211 	int a : 3;
    212 	int : 0;
    213 	long long : 0;
    214 	short y;
    215 } G1;
    216 
    217 // CHECK: Type: union G1
    218 // CHECK:   Size:32
    219 // CHECK:   Alignment:8
    220 // CHECK:   FieldOffsets: [0, 0, 0, 0, 0]>
    221 
    222 typedef struct H1 {
    223 	unsigned long a : 1;
    224 	unsigned char : 0;
    225 	unsigned long : 0;
    226 	unsigned long c : 1;
    227 } H1;
    228 
    229 // CHECK: Type: struct H1
    230 // CHECK:   Size:64
    231 // CHECK:   Alignment:8
    232 // CHECK:   FieldOffsets: [0, 32, 32, 32]>
    233 
    234 typedef struct I1 {
    235 	short : 8;
    236 	__declspec(align(16)) short : 8;
    237 } I1;
    238 
    239 // CHECK: Type: struct I1
    240 // CHECK:   Size:16
    241 // CHECK:   Alignment:8
    242 // CHECK:   FieldOffsets: [0, 8]
    243 
    244 #pragma pack(pop)
    245 
    246 int x[
    247 sizeof(A ) +
    248 sizeof(B ) +
    249 sizeof(C ) +
    250 sizeof(D ) +
    251 sizeof(E ) +
    252 sizeof(F ) +
    253 sizeof(G ) +
    254 sizeof(H ) +
    255 sizeof(I ) +
    256 sizeof(A1) +
    257 sizeof(B1) +
    258 sizeof(C1) +
    259 sizeof(D1) +
    260 sizeof(E1) +
    261 sizeof(F1) +
    262 sizeof(G1) +
    263 sizeof(H1) +
    264 sizeof(I1) +
    265 0];
    266