// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s extern void f1(int *); extern void f2(char *); struct __attribute__((packed)) Arguable { int x; char c; static void foo(); }; extern void f3(void()); namespace Foo { struct __attribute__((packed)) Arguable { char c; int x; static void foo(); }; } struct Arguable *get_arguable(); void f4(int &); void to_void(void *); template void sink(T...); void g0() { { Foo::Arguable arguable; f1(&arguable.x); // expected-warning {{packed member 'x' of class or structure 'Foo::Arguable'}} f2(&arguable.c); // no-warning f3(&arguable.foo); // no-warning to_void(&arguable.x); // no-warning void *p1 = &arguable.x; // no-warning void *p2 = static_cast(&arguable.x); // no-warning void *p3 = reinterpret_cast(&arguable.x); // no-warning void *p4 = (void *)&arguable.x; // no-warning sink(p1, p2, p3, p4); } { Arguable arguable1; Arguable &arguable(arguable1); f1(&arguable.x); // expected-warning {{packed member 'x' of class or structure 'Arguable'}} f2(&arguable.c); // no-warning f3(&arguable.foo); // no-warning } { Arguable *arguable1; Arguable *&arguable(arguable1); f1(&arguable->x); // expected-warning {{packed member 'x' of class or structure 'Arguable'}} f2(&arguable->c); // no-warning f3(&arguable->foo); // no-warning } } struct __attribute__((packed)) A { int x; char c; int *f0() { return &this->x; // expected-warning {{packed member 'x' of class or structure 'A'}} } int *g0() { return &x; // expected-warning {{packed member 'x' of class or structure 'A'}} } char *h0() { return &c; // no-warning } }; struct B : A { int *f1() { return &this->x; // expected-warning {{packed member 'x' of class or structure 'A'}} } int *g1() { return &x; // expected-warning {{packed member 'x' of class or structure 'A'}} } char *h1() { return &c; // no-warning } }; template class __attribute__((packed)) S { Ty X; public: const Ty *get() const { return &X; // expected-warning {{packed member 'X' of class or structure 'S'}} // expected-warning@-1 {{packed member 'X' of class or structure 'S'}} } }; template void h(Ty *); void g1() { S s1; s1.get(); // expected-note {{in instantiation of member function 'S::get'}} S s2; s2.get(); S s3; s3.get(); // expected-note {{in instantiation of member function 'S::get'}} } // PR35509 typedef long L1; struct Incomplete; struct S2 { L1 d; Incomplete *e() const; } __attribute__((packed)); Incomplete *S2::e() const { return (Incomplete *)&d; } // no-warning