// 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 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); } { 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 } { 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 } { 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 } { 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 } } 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)'}} }