summaryrefslogtreecommitdiffstats
path: root/test/CodeGen/ms_struct-pack.c
blob: 6382f3b90a350349581791b510d18163e95cf628 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
// RUN: %clang_cc1 -emit-llvm-only  -triple i386-apple-darwin9 -fdump-record-layouts %s | FileCheck %s
// rdar://8823265

#pragma pack(1)
struct _one_ms {
        short m:9;      // size is 2
        int q:27;       // size is 6
        short w:13;     // size is 8
        short e:3;      // size is 8
        char r:4;       // size is 9
        char t:7;       // size is 10
        short y:16;     // size is 12
        short u:1;      // size is 14
        char i:2;       // size is 15
        int a;          // size is 19
        char o:6;       // size is 20
        char s:2;       // size is 20
        short d:10;     // size is 22
        short f:4;      // size is 22
        char b;         // size is 23
        char g:1;       // size is 24
        short h:13;     // size is 26
        char j:8;       // size is 27
        char k:5;       // size is 28
        char c;         // size is 29
        int l:28;       // size is 33
        char z:7;       // size is 34
        int x:20;       // size is 38
} __attribute__((__ms_struct__));
typedef struct _one_ms one_ms;

static int a1[(sizeof(one_ms) == 38) - 1];

#pragma pack(2)
struct _two_ms {
        short m:9;      
        int q:27;       
        short w:13;     
        short e:3;      
        char r:4;       
        char t:7;       
        short y:16;     
        short u:1;      
        char i:2;       
        int a;          
        char o:6;       
        char s:2;       
        short d:10;     
        short f:4;      
        char b;         
        char g:1;       
        short h:13;     
        char j:8;       
        char k:5;       
        char c;         
        int l:28;       
        char z:7;       
        int x:20;       
} __attribute__((__ms_struct__));

typedef struct _two_ms two_ms;

static int a2[(sizeof(two_ms) == 42) - 1];

#pragma pack(4)
struct _four_ms {
        short m:9;      
        int q:27;       
        short w:13;     
        short e:3;      
        char r:4;       
        char t:7;       
        short y:16;     
        short u:1;      
        char i:2;       
        int a;          
        char o:6;       
        char s:2;       
        short d:10;     
        short f:4;      
        char b;         
        char g:1;       
        short h:13;     
        char j:8;       
        char k:5;       
        char c;         
        int l:28;       
        char z:7;       
        int x:20;       
} __attribute__((__ms_struct__));
typedef struct _four_ms four_ms;

static int a4[(sizeof(four_ms) == 48) - 1];

#pragma pack(8)
struct _eight_ms {
        short m:9;      
        int q:27;       
        short w:13;     
        short e:3;      
        char r:4;       
        char t:7;       
        short y:16;     
        short u:1;      
        char i:2;       
        int a;          
        char o:6;       
        char s:2;       
        short d:10;     
        short f:4;      
        char b;         
        char g:1;       
        short h:13;     
        char j:8;       
        char k:5;       
        char c;         
        int l:28;       
        char z:7;       
        int x:20;       
} __attribute__((__ms_struct__));

typedef struct _eight_ms eight_ms;

static int a8[(sizeof(eight_ms) == 48) - 1];

// rdar://15926990
#pragma pack(2)
struct test0 {
  unsigned long a : 8;
  unsigned long b : 8;
  unsigned long c : 8;
  unsigned long d : 10;
  unsigned long e : 1;
} __attribute__((__ms_struct__));

// CHECK:             0 | struct test0
// CHECK-NEXT:    0:0-7 |   unsigned long a
// CHECK-NEXT:    1:0-7 |   unsigned long b
// CHECK-NEXT:    2:0-7 |   unsigned long c
// CHECK-NEXT:    4:0-9 |   unsigned long d
// CHECK-NEXT:    5:2-2 |   unsigned long e
// CHECK-NEXT:          | [sizeof=8, align=2]

static int test0[(sizeof(struct test0) == 8) ? 1 : -1];