Clang Project

clang_source_code/test/Sema/address-packed.c
1// RUN: %clang_cc1 -fsyntax-only -verify %s
2
3#include <stdint.h>
4
5extern void f1(int *);
6extern void f2(char *);
7
8struct Ok {
9  char c;
10  int x;
11};
12
13struct __attribute__((packed)) Arguable {
14  char c0;
15  int x;
16  char c1;
17};
18
19union __attribute__((packed)) UnionArguable {
20  char c;
21  int x;
22};
23
24typedef struct Arguable ArguableT;
25
26struct Arguable *get_arguable();
27
28void to_void(void *);
29void to_intptr(intptr_t);
30
31void g0(void) {
32  {
33    struct Ok ok;
34    f1(&ok.x); // no-warning
35    f2(&ok.c); // no-warning
36  }
37  {
38    struct Arguable arguable;
39    f2(&arguable.c0); // no-warning
40    f1(&arguable.x);  // expected-warning {{packed member 'x' of class or structure 'Arguable'}}
41    f2(&arguable.c1); // no-warning
42
43    f1((int *)(void *)&arguable.x); // no-warning
44    to_void(&arguable.x);           // no-warning
45    void *p = &arguable.x;          // no-warning
46    to_void(p);
47    to_intptr((intptr_t)p);         // no-warning
48  }
49  {
50    union UnionArguable arguable;
51    f2(&arguable.c); // no-warning
52    f1(&arguable.x); // expected-warning {{packed member 'x' of class or structure 'UnionArguable'}}
53
54    f1((int *)(void *)&arguable.x);   // no-warning
55    to_void(&arguable.x);             // no-warning
56    to_intptr((intptr_t)&arguable.x); // no-warning
57  }
58  {
59    ArguableT arguable;
60    f2(&arguable.c0); // no-warning
61    f1(&arguable.x);  // expected-warning {{packed member 'x' of class or structure 'Arguable'}}
62    f2(&arguable.c1); // no-warning
63
64    f1((int *)(void *)&arguable.x);   // no-warning
65    to_void(&arguable.x);             // no-warning
66    to_intptr((intptr_t)&arguable.x); // no-warning
67  }
68  {
69    struct Arguable *arguable = get_arguable();
70    f2(&arguable->c0); // no-warning
71    f1(&arguable->x);  // expected-warning {{packed member 'x' of class or structure 'Arguable'}}
72    f2(&arguable->c1); // no-warning
73
74    f1((int *)(void *)&arguable->x);    // no-warning
75    to_void(&arguable->c1);             // no-warning
76    to_intptr((intptr_t)&arguable->c1); // no-warning
77  }
78  {
79    ArguableT *arguable = get_arguable();
80    f2(&(arguable->c0)); // no-warning
81    f1(&(arguable->x));  // expected-warning {{packed member 'x' of class or structure 'Arguable'}}
82    f2(&(arguable->c1)); // no-warning
83
84    f1((int *)(void *)&(arguable->x));      // no-warning
85    to_void(&(arguable->c1));               // no-warning
86    to_intptr((intptr_t)&(arguable->c1));   // no-warning
87  }
88}
89
90struct S1 {
91  char c;
92  int i __attribute__((packed));
93};
94
95int *g1(struct S1 *s1) {
96  return &s1->i; // expected-warning {{packed member 'i' of class or structure 'S1'}}
97}
98
99struct S2_i {
100  int i;
101};
102struct __attribute__((packed)) S2 {
103  char c;
104  struct S2_i inner;
105};
106
107int *g2(struct S2 *s2) {
108  return &s2->inner.i; // expected-warning {{packed member 'inner' of class or structure 'S2'}}
109}
110
111struct S2_a {
112  char c;
113  struct S2_i inner __attribute__((packed));
114};
115
116int *g2_a(struct S2_a *s2_a) {
117  return &s2_a->inner.i; // expected-warning {{packed member 'inner' of class or structure 'S2_a'}}
118}
119
120struct __attribute__((packed)) S3 {
121  char c;
122  struct {
123    int i;
124  } inner;
125};
126
127int *g3(struct S3 *s3) {
128  return &s3->inner.i; // expected-warning {{packed member 'inner' of class or structure 'S3'}}
129}
130
131struct S4 {
132  char c;
133  struct __attribute__((packed)) {
134    int i;
135  } inner;
136};
137
138int *g4(struct S4 *s4) {
139  return &s4->inner.i; // expected-warning {{packed member 'i' of class or structure 'S4::(anonymous)'}}
140}
141
142struct S5 {
143  char c;
144  struct {
145    char c1;
146    int i __attribute__((packed));
147  } inner;
148};
149
150int *g5(struct S5 *s5) {
151  return &s5->inner.i; // expected-warning {{packed member 'i' of class or structure 'S5::(anonymous)'}}
152}
153
154struct __attribute__((packed, aligned(2))) AlignedTo2 {
155  int x;
156};
157
158char *g6(struct AlignedTo2 *s) {
159  return (char *)&s->x; // no-warning
160}
161
162struct __attribute__((packed, aligned(2))) AlignedTo2Bis {
163  int x;
164};
165
166struct AlignedTo2Bis* g7(struct AlignedTo2 *s)
167{
168    return (struct AlignedTo2Bis*)&s->x; // no-warning
169}
170
171typedef struct {
172  char c;
173  int x;
174} __attribute__((packed)) TypedefStructArguable;
175
176typedef union {
177  char c;
178  int x;
179} __attribute((packed)) TypedefUnionArguable;
180
181typedef TypedefStructArguable TypedefStructArguableTheSecond;
182
183int *typedef1(TypedefStructArguable *s) {
184    return &s->x; // expected-warning {{packed member 'x' of class or structure 'TypedefStructArguable'}}
185}
186
187int *typedef2(TypedefStructArguableTheSecond *s) {
188    return &s->x; // expected-warning {{packed member 'x' of class or structure 'TypedefStructArguable'}}
189}
190
191int *typedef3(TypedefUnionArguable *s) {
192    return &s->x; // expected-warning {{packed member 'x' of class or structure 'TypedefUnionArguable'}}
193}
194
195struct S6 {
196  union {
197    char c;
198    int x;
199  } __attribute__((packed));
200};
201
202int *anonymousInnerUnion(struct S6 *s) {
203  return &s->x; // expected-warning {{packed member 'x' of class or structure 'S6::(anonymous)'}}
204}
205
206struct S6a {
207    int a;
208    int _;
209    int c;
210    char __;
211    int d;
212} __attribute__((packed, aligned(16))) s6;
213
214void g8()
215
216    f1(&s6.a); // no-warning
217    f1(&s6.c); // no-warning
218    f1(&s6.d); // expected-warning {{packed member 'd' of class or structure 'S6a'}}
219}
220
221struct __attribute__((packed, aligned(1))) MisalignedContainee { double d; };
222struct __attribute__((aligned(8))) AlignedContainer { struct MisalignedContainee b; };
223
224struct AlignedContainer *p;
225double* g9() {
226  return &p->b.d; // no-warning
227}
228
229union OneUnion
230{
231    uint32_t a;
232    uint32_t b:1;
233};
234
235struct __attribute__((packed)) S7 {
236    uint8_t length;
237    uint8_t stuff;
238    uint8_t padding[2];
239    union OneUnion one_union;
240};
241
242union AnotherUnion {
243    long data;
244    struct S7 s;
245} *au;
246
247union OneUnion* get_OneUnion(void)
248{
249    return &au->s.one_union; // no-warning
250}
251
252struct __attribute__((packed)) S8 {
253    uint8_t data1;
254    uint8_t data2;
255 uint16_t wider_data;
256};
257
258#define LE_READ_2(p) \
259 ((uint16_t) \
260  ((((const uint8_t *)(p))[0]      ) | \
261   (((const uint8_t *)(p))[1] <<  8)))
262
263uint32_t get_wider_data(struct S8 *s)
264{
265    return LE_READ_2(&s->wider_data); // no-warning
266}
267
268struct S9 {
269  uint32_t x;
270  uint8_t y[2];
271  uint16_t z;
272} __attribute__((__packed__));
273
274typedef struct S9 __attribute__((__aligned__(16))) aligned_S9;
275
276void g10() {
277  struct S9 x;
278  struct S9 __attribute__((__aligned__(8))) y;
279  aligned_S9 z;
280
281  uint32_t *p32;
282  p32 = &x.x; // expected-warning {{packed member 'x' of class or structure 'S9'}}
283  p32 = &y.x; // no-warning
284  p32 = &z.x; // no-warning
285}
286
287typedef struct {
288  uint32_t msgh_bits;
289  uint32_t msgh_size;
290  int32_t msgh_voucher_port;
291  int32_t msgh_id;
292} S10Header;
293
294typedef struct {
295  uint32_t t;
296  uint64_t m;
297  uint32_t p;
298  union {
299    struct {
300      uint32_t a;
301      double z;
302    } __attribute__((aligned(8), packed)) a;
303    struct {
304      uint32_t b;
305      double z;
306      uint32_t a;
307    } __attribute__((aligned(8), packed)) b;
308  };
309} __attribute__((aligned(8), packed)) S10Data;
310
311typedef struct {
312  S10Header hdr;
313  uint32_t size;
314  uint8_t count;
315  S10Data data[] __attribute__((aligned(8)));
316} __attribute__((aligned(8), packed)) S10;
317
318void g11(S10Header *hdr);
319void g12(S10 *s) {
320  g11(&s->hdr); // no-warning
321}
322
323struct S11 {
324  uint32_t x;
325} __attribute__((__packed__));
326
327void g13(void) {
328  struct S11 __attribute__((__aligned__(4))) a[4];
329  uint32_t *p32;
330  p32 = &a[0].x; // no-warning
331}
332
333struct Invalid0 {
334  void *x;
335  struct fwd f; // expected-error {{incomplete type}} expected-note {{forward declaration}}
336} __attribute__((packed));
337
338void *g14(struct Invalid0 *ivl) {
339  return &(ivl->x);
340}
341