| // RUN: %clang_cc1 -fsyntax-only -verify %s |
| |
| #include <stdint.h> |
| |
| extern void f1(int *); |
| extern void f2(char *); |
| |
| struct Ok { |
| char c; |
| int x; |
| }; |
| |
| struct __attribute__((packed)) Arguable { |
| char c0; |
| int x; |
| char c1; |
| }; |
| |
| union __attribute__((packed)) UnionArguable { |
| char c; |
| int x; |
| }; |
| |
| typedef struct Arguable ArguableT; |
| |
| struct Arguable *get_arguable(); |
| |
| void to_void(void *); |
| void to_intptr(intptr_t); |
| |
| void g0(void) { |
| { |
| struct Ok ok; |
| f1(&ok.x); // no-warning |
| f2(&ok.c); // no-warning |
| } |
| { |
| struct Arguable arguable; |
| f2(&arguable.c0); // no-warning |
| f1(&arguable.x); // expected-warning {{packed member 'x' of class or structure 'Arguable'}} |
| f2(&arguable.c1); // no-warning |
| |
| f1((int *)(void *)&arguable.x); // no-warning |
| to_void(&arguable.x); // no-warning |
| void *p = &arguable.x; // no-warning |
| to_void(p); |
| to_intptr((intptr_t)p); // no-warning |
| } |
| { |
| union UnionArguable arguable; |
| f2(&arguable.c); // no-warning |
| f1(&arguable.x); // expected-warning {{packed member 'x' of class or structure 'UnionArguable'}} |
| |
| f1((int *)(void *)&arguable.x); // no-warning |
| to_void(&arguable.x); // no-warning |
| to_intptr((intptr_t)&arguable.x); // no-warning |
| } |
| { |
| ArguableT arguable; |
| f2(&arguable.c0); // no-warning |
| f1(&arguable.x); // expected-warning {{packed member 'x' of class or structure 'Arguable'}} |
| f2(&arguable.c1); // no-warning |
| |
| f1((int *)(void *)&arguable.x); // no-warning |
| to_void(&arguable.x); // no-warning |
| to_intptr((intptr_t)&arguable.x); // no-warning |
| } |
| { |
| struct Arguable *arguable = get_arguable(); |
| f2(&arguable->c0); // no-warning |
| f1(&arguable->x); // expected-warning {{packed member 'x' of class or structure 'Arguable'}} |
| f2(&arguable->c1); // no-warning |
| |
| f1((int *)(void *)&arguable->x); // no-warning |
| to_void(&arguable->c1); // no-warning |
| to_intptr((intptr_t)&arguable->c1); // no-warning |
| } |
| { |
| ArguableT *arguable = get_arguable(); |
| f2(&(arguable->c0)); // no-warning |
| f1(&(arguable->x)); // expected-warning {{packed member 'x' of class or structure 'Arguable'}} |
| f2(&(arguable->c1)); // no-warning |
| |
| f1((int *)(void *)&(arguable->x)); // no-warning |
| to_void(&(arguable->c1)); // no-warning |
| to_intptr((intptr_t)&(arguable->c1)); // no-warning |
| } |
| } |
| |
| struct S1 { |
| char c; |
| int i __attribute__((packed)); |
| }; |
| |
| int *g1(struct S1 *s1) { |
| return &s1->i; // expected-warning {{packed member 'i' of class or structure 'S1'}} |
| } |
| |
| struct S2_i { |
| int i; |
| }; |
| struct __attribute__((packed)) S2 { |
| char c; |
| struct S2_i inner; |
| }; |
| |
| int *g2(struct S2 *s2) { |
| return &s2->inner.i; // expected-warning {{packed member 'inner' of class or structure 'S2'}} |
| } |
| |
| struct S2_a { |
| char c; |
| struct S2_i inner __attribute__((packed)); |
| }; |
| |
| int *g2_a(struct S2_a *s2_a) { |
| return &s2_a->inner.i; // expected-warning {{packed member 'inner' of class or structure 'S2_a'}} |
| } |
| |
| struct __attribute__((packed)) S3 { |
| char c; |
| struct { |
| int i; |
| } inner; |
| }; |
| |
| int *g3(struct S3 *s3) { |
| return &s3->inner.i; // expected-warning {{packed member 'inner' of class or structure 'S3'}} |
| } |
| |
| struct S4 { |
| char c; |
| struct __attribute__((packed)) { |
| int i; |
| } inner; |
| }; |
| |
| int *g4(struct S4 *s4) { |
| return &s4->inner.i; // expected-warning {{packed member 'i' of class or structure 'S4::(anonymous)'}} |
| } |
| |
| struct S5 { |
| char c; |
| struct { |
| char c1; |
| int i __attribute__((packed)); |
| } inner; |
| }; |
| |
| int *g5(struct S5 *s5) { |
| return &s5->inner.i; // expected-warning {{packed member 'i' of class or structure 'S5::(anonymous)'}} |
| } |
| |
| struct __attribute__((packed, aligned(2))) AlignedTo2 { |
| int x; |
| }; |
| |
| char *g6(struct AlignedTo2 *s) { |
| return (char *)&s->x; // no-warning |
| } |
| |
| struct __attribute__((packed, aligned(2))) AlignedTo2Bis { |
| int x; |
| }; |
| |
| struct AlignedTo2Bis* g7(struct AlignedTo2 *s) |
| { |
| return (struct AlignedTo2Bis*)&s->x; // no-warning |
| } |
| |
| typedef struct { |
| char c; |
| int x; |
| } __attribute__((packed)) TypedefStructArguable; |
| |
| typedef union { |
| char c; |
| int x; |
| } __attribute((packed)) TypedefUnionArguable; |
| |
| typedef TypedefStructArguable TypedefStructArguableTheSecond; |
| |
| int *typedef1(TypedefStructArguable *s) { |
| return &s->x; // expected-warning {{packed member 'x' of class or structure 'TypedefStructArguable'}} |
| } |
| |
| int *typedef2(TypedefStructArguableTheSecond *s) { |
| return &s->x; // expected-warning {{packed member 'x' of class or structure 'TypedefStructArguable'}} |
| } |
| |
| int *typedef3(TypedefUnionArguable *s) { |
| return &s->x; // expected-warning {{packed member 'x' of class or structure 'TypedefUnionArguable'}} |
| } |
| |
| struct S6 { |
| union { |
| char c; |
| int x; |
| } __attribute__((packed)); |
| }; |
| |
| int *anonymousInnerUnion(struct S6 *s) { |
| return &s->x; // expected-warning {{packed member 'x' of class or structure 'S6::(anonymous)'}} |
| } |
| |
| struct S6a { |
| int a; |
| int _; |
| int c; |
| char __; |
| int d; |
| } __attribute__((packed, aligned(16))) s6; |
| |
| void g8() |
| { |
| f1(&s6.a); // no-warning |
| f1(&s6.c); // no-warning |
| f1(&s6.d); // expected-warning {{packed member 'd' of class or structure 'S6a'}} |
| } |
| |
| struct __attribute__((packed, aligned(1))) MisalignedContainee { double d; }; |
| struct __attribute__((aligned(8))) AlignedContainer { struct MisalignedContainee b; }; |
| |
| struct AlignedContainer *p; |
| double* g9() { |
| return &p->b.d; // no-warning |
| } |
| |
| union OneUnion |
| { |
| uint32_t a; |
| uint32_t b:1; |
| }; |
| |
| struct __attribute__((packed)) S7 { |
| uint8_t length; |
| uint8_t stuff; |
| uint8_t padding[2]; |
| union OneUnion one_union; |
| }; |
| |
| union AnotherUnion { |
| long data; |
| struct S7 s; |
| } *au; |
| |
| union OneUnion* get_OneUnion(void) |
| { |
| return &au->s.one_union; // no-warning |
| } |
| |
| struct __attribute__((packed)) S8 { |
| uint8_t data1; |
| uint8_t data2; |
| uint16_t wider_data; |
| }; |
| |
| #define LE_READ_2(p) \ |
| ((uint16_t) \ |
| ((((const uint8_t *)(p))[0] ) | \ |
| (((const uint8_t *)(p))[1] << 8))) |
| |
| uint32_t get_wider_data(struct S8 *s) |
| { |
| return LE_READ_2(&s->wider_data); // no-warning |
| } |
| |
| struct S9 { |
| uint32_t x; |
| uint8_t y[2]; |
| uint16_t z; |
| } __attribute__((__packed__)); |
| |
| typedef struct S9 __attribute__((__aligned__(16))) aligned_S9; |
| |
| void g10() { |
| struct S9 x; |
| struct S9 __attribute__((__aligned__(8))) y; |
| aligned_S9 z; |
| |
| uint32_t *p32; |
| p32 = &x.x; // expected-warning {{packed member 'x' of class or structure 'S9'}} |
| p32 = &y.x; // no-warning |
| p32 = &z.x; // no-warning |
| } |
| |
| typedef struct { |
| uint32_t msgh_bits; |
| uint32_t msgh_size; |
| int32_t msgh_voucher_port; |
| int32_t msgh_id; |
| } S10Header; |
| |
| typedef struct { |
| uint32_t t; |
| uint64_t m; |
| uint32_t p; |
| union { |
| struct { |
| uint32_t a; |
| double z; |
| } __attribute__((aligned(8), packed)) a; |
| struct { |
| uint32_t b; |
| double z; |
| uint32_t a; |
| } __attribute__((aligned(8), packed)) b; |
| }; |
| } __attribute__((aligned(8), packed)) S10Data; |
| |
| typedef struct { |
| S10Header hdr; |
| uint32_t size; |
| uint8_t count; |
| S10Data data[] __attribute__((aligned(8))); |
| } __attribute__((aligned(8), packed)) S10; |
| |
| void g11(S10Header *hdr); |
| void g12(S10 *s) { |
| g11(&s->hdr); // no-warning |
| } |
| |
| struct S11 { |
| uint32_t x; |
| } __attribute__((__packed__)); |
| |
| void g13(void) { |
| struct S11 __attribute__((__aligned__(4))) a[4]; |
| uint32_t *p32; |
| p32 = &a[0].x; // no-warning |
| } |
| |
| struct Invalid0 { |
| void *x; |
| struct fwd f; // expected-error {{incomplete type}} expected-note {{forward declaration}} |
| } __attribute__((packed)); |
| |
| void *g14(struct Invalid0 *ivl) { |
| return &(ivl->x); |
| } |