// RUN: %clang_cc1 -fsyntax-only -verify %s #include 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); }