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