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