349 lines · c
1// RUN: %clang_cc1 -fsyntax-only -verify %s2 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(void);27 28void to_void(void *);29void to_intptr(intptr_t);30 31void g0(void) {32 {33 struct Ok ok;34 f1(&ok.x); // no-warning35 f2(&ok.c); // no-warning36 }37 {38 struct Arguable arguable;39 f2(&arguable.c0); // no-warning40 f1(&arguable.x); // expected-warning {{packed member 'x' of class or structure 'Arguable'}}41 f2(&arguable.c1); // no-warning42 43 f1((int *)(void *)&arguable.x); // no-warning44 to_void(&arguable.x); // no-warning45 void *p = &arguable.x; // no-warning46 to_void(p);47 to_intptr((intptr_t)p); // no-warning48 }49 {50 union UnionArguable arguable;51 f2(&arguable.c); // no-warning52 f1(&arguable.x); // expected-warning {{packed member 'x' of class or structure 'UnionArguable'}}53 54 f1((int *)(void *)&arguable.x); // no-warning55 to_void(&arguable.x); // no-warning56 to_intptr((intptr_t)&arguable.x); // no-warning57 }58 {59 ArguableT arguable;60 f2(&arguable.c0); // no-warning61 f1(&arguable.x); // expected-warning {{packed member 'x' of class or structure 'Arguable'}}62 f2(&arguable.c1); // no-warning63 64 f1((int *)(void *)&arguable.x); // no-warning65 to_void(&arguable.x); // no-warning66 to_intptr((intptr_t)&arguable.x); // no-warning67 }68 {69 struct Arguable *arguable = get_arguable();70 f2(&arguable->c0); // no-warning71 f1(&arguable->x); // expected-warning {{packed member 'x' of class or structure 'Arguable'}}72 f2(&arguable->c1); // no-warning73 74 f1((int *)(void *)&arguable->x); // no-warning75 to_void(&arguable->c1); // no-warning76 to_intptr((intptr_t)&arguable->c1); // no-warning77 }78 {79 ArguableT *arguable = get_arguable();80 f2(&(arguable->c0)); // no-warning81 f1(&(arguable->x)); // expected-warning {{packed member 'x' of class or structure 'Arguable'}}82 f2(&(arguable->c1)); // no-warning83 84 f1((int *)(void *)&(arguable->x)); // no-warning85 to_void(&(arguable->c1)); // no-warning86 to_intptr((intptr_t)&(arguable->c1)); // no-warning87 }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::struct (unnamed at}}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::struct (unnamed at}}152}153 154struct __attribute__((packed, aligned(2))) AlignedTo2 {155 int x;156};157 158char *g6(struct AlignedTo2 *s) {159 return (char *)&s->x; // no-warning160}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-warning169}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::union (anonymous at}}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(void)215{216 f1(&s6.a); // no-warning217 f1(&s6.c); // no-warning218 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(void) {226 return &p->b.d; // no-warning227}228 229union OneUnion230{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-warning250}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-warning266}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(void) {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-warning284 p32 = &z.x; // no-warning285}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-warning321}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-warning331}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 342void to_void_with_expr(void *ptr, int expr);343 344void g15(void) {345 struct Arguable arguable;346 to_void_with_expr(&arguable.x, 3); // no-warning347 to_void_with_expr(&arguable.x, ({3;})); // no-warning348}349