1f7b9f314SRoger Ferrer Ibanez // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 2f7b9f314SRoger Ferrer Ibanez extern void f1(int *); 3f7b9f314SRoger Ferrer Ibanez extern void f2(char *); 4f7b9f314SRoger Ferrer Ibanez 5f7b9f314SRoger Ferrer Ibanez struct __attribute__((packed)) Arguable { 6f7b9f314SRoger Ferrer Ibanez int x; 7f7b9f314SRoger Ferrer Ibanez char c; 8f7b9f314SRoger Ferrer Ibanez static void foo(); 9f7b9f314SRoger Ferrer Ibanez }; 10f7b9f314SRoger Ferrer Ibanez 11f7b9f314SRoger Ferrer Ibanez extern void f3(void()); 12f7b9f314SRoger Ferrer Ibanez 13f7b9f314SRoger Ferrer Ibanez namespace Foo { 14f7b9f314SRoger Ferrer Ibanez struct __attribute__((packed)) Arguable { 15f7b9f314SRoger Ferrer Ibanez char c; 16f7b9f314SRoger Ferrer Ibanez int x; 17f7b9f314SRoger Ferrer Ibanez static void foo(); 18f7b9f314SRoger Ferrer Ibanez }; 19f7b9f314SRoger Ferrer Ibanez } 20f7b9f314SRoger Ferrer Ibanez 21f7b9f314SRoger Ferrer Ibanez struct Arguable *get_arguable(); 22f7b9f314SRoger Ferrer Ibanez 23f7b9f314SRoger Ferrer Ibanez void f4(int &); 24f7b9f314SRoger Ferrer Ibanez 25f7b9f314SRoger Ferrer Ibanez void to_void(void *); 26f7b9f314SRoger Ferrer Ibanez 27f7b9f314SRoger Ferrer Ibanez template <typename... T> 28f7b9f314SRoger Ferrer Ibanez void sink(T...); 29f7b9f314SRoger Ferrer Ibanez g0()30f7b9f314SRoger Ferrer Ibanezvoid g0() { 31f7b9f314SRoger Ferrer Ibanez { 32f7b9f314SRoger Ferrer Ibanez Foo::Arguable arguable; 33f7b9f314SRoger Ferrer Ibanez f1(&arguable.x); // expected-warning {{packed member 'x' of class or structure 'Foo::Arguable'}} 34f7b9f314SRoger Ferrer Ibanez f2(&arguable.c); // no-warning 35f7b9f314SRoger Ferrer Ibanez f3(&arguable.foo); // no-warning 36f7b9f314SRoger Ferrer Ibanez 37f7b9f314SRoger Ferrer Ibanez to_void(&arguable.x); // no-warning 38f7b9f314SRoger Ferrer Ibanez void *p1 = &arguable.x; // no-warning 39f7b9f314SRoger Ferrer Ibanez void *p2 = static_cast<void *>(&arguable.x); // no-warning 40f7b9f314SRoger Ferrer Ibanez void *p3 = reinterpret_cast<void *>(&arguable.x); // no-warning 41f7b9f314SRoger Ferrer Ibanez void *p4 = (void *)&arguable.x; // no-warning 42f7b9f314SRoger Ferrer Ibanez sink(p1, p2, p3, p4); 43f7b9f314SRoger Ferrer Ibanez } 44f7b9f314SRoger Ferrer Ibanez { 45f7b9f314SRoger Ferrer Ibanez Arguable arguable1; 46f7b9f314SRoger Ferrer Ibanez Arguable &arguable(arguable1); 47f7b9f314SRoger Ferrer Ibanez f1(&arguable.x); // expected-warning {{packed member 'x' of class or structure 'Arguable'}} 48f7b9f314SRoger Ferrer Ibanez f2(&arguable.c); // no-warning 49f7b9f314SRoger Ferrer Ibanez f3(&arguable.foo); // no-warning 50f7b9f314SRoger Ferrer Ibanez } 51f7b9f314SRoger Ferrer Ibanez { 52f7b9f314SRoger Ferrer Ibanez Arguable *arguable1; 53f7b9f314SRoger Ferrer Ibanez Arguable *&arguable(arguable1); 54f7b9f314SRoger Ferrer Ibanez f1(&arguable->x); // expected-warning {{packed member 'x' of class or structure 'Arguable'}} 55f7b9f314SRoger Ferrer Ibanez f2(&arguable->c); // no-warning 56f7b9f314SRoger Ferrer Ibanez f3(&arguable->foo); // no-warning 57f7b9f314SRoger Ferrer Ibanez } 58f7b9f314SRoger Ferrer Ibanez } 59f7b9f314SRoger Ferrer Ibanez 60f7b9f314SRoger Ferrer Ibanez struct __attribute__((packed)) A { 61f7b9f314SRoger Ferrer Ibanez int x; 62f7b9f314SRoger Ferrer Ibanez char c; 63f7b9f314SRoger Ferrer Ibanez f0A64f7b9f314SRoger Ferrer Ibanez int *f0() { 65f7b9f314SRoger Ferrer Ibanez return &this->x; // expected-warning {{packed member 'x' of class or structure 'A'}} 66f7b9f314SRoger Ferrer Ibanez } 67f7b9f314SRoger Ferrer Ibanez g0A68f7b9f314SRoger Ferrer Ibanez int *g0() { 69f7b9f314SRoger Ferrer Ibanez return &x; // expected-warning {{packed member 'x' of class or structure 'A'}} 70f7b9f314SRoger Ferrer Ibanez } 71f7b9f314SRoger Ferrer Ibanez h0A72f7b9f314SRoger Ferrer Ibanez char *h0() { 73f7b9f314SRoger Ferrer Ibanez return &c; // no-warning 74f7b9f314SRoger Ferrer Ibanez } 75f7b9f314SRoger Ferrer Ibanez }; 76f7b9f314SRoger Ferrer Ibanez 77f7b9f314SRoger Ferrer Ibanez struct B : A { f1B78f7b9f314SRoger Ferrer Ibanez int *f1() { 79f7b9f314SRoger Ferrer Ibanez return &this->x; // expected-warning {{packed member 'x' of class or structure 'A'}} 80f7b9f314SRoger Ferrer Ibanez } 81f7b9f314SRoger Ferrer Ibanez g1B82f7b9f314SRoger Ferrer Ibanez int *g1() { 83f7b9f314SRoger Ferrer Ibanez return &x; // expected-warning {{packed member 'x' of class or structure 'A'}} 84f7b9f314SRoger Ferrer Ibanez } 85f7b9f314SRoger Ferrer Ibanez h1B86f7b9f314SRoger Ferrer Ibanez char *h1() { 87f7b9f314SRoger Ferrer Ibanez return &c; // no-warning 88f7b9f314SRoger Ferrer Ibanez } 89f7b9f314SRoger Ferrer Ibanez }; 90f7b9f314SRoger Ferrer Ibanez 91f7b9f314SRoger Ferrer Ibanez template <typename Ty> 92f7b9f314SRoger Ferrer Ibanez class __attribute__((packed)) S { 93f7b9f314SRoger Ferrer Ibanez Ty X; 94f7b9f314SRoger Ferrer Ibanez 95f7b9f314SRoger Ferrer Ibanez public: get() const96f7b9f314SRoger Ferrer Ibanez const Ty *get() const { 97f7b9f314SRoger Ferrer Ibanez return &X; // expected-warning {{packed member 'X' of class or structure 'S<int>'}} 98f7b9f314SRoger Ferrer Ibanez // expected-warning@-1 {{packed member 'X' of class or structure 'S<float>'}} 99f7b9f314SRoger Ferrer Ibanez } 100f7b9f314SRoger Ferrer Ibanez }; 101f7b9f314SRoger Ferrer Ibanez 102f7b9f314SRoger Ferrer Ibanez template <typename Ty> 103f7b9f314SRoger Ferrer Ibanez void h(Ty *); 104f7b9f314SRoger Ferrer Ibanez g1()105f7b9f314SRoger Ferrer Ibanezvoid g1() { 106f7b9f314SRoger Ferrer Ibanez S<int> s1; 107f7b9f314SRoger Ferrer Ibanez s1.get(); // expected-note {{in instantiation of member function 'S<int>::get'}} 108f7b9f314SRoger Ferrer Ibanez 109f7b9f314SRoger Ferrer Ibanez S<char> s2; 110f7b9f314SRoger Ferrer Ibanez s2.get(); 111f7b9f314SRoger Ferrer Ibanez 112f7b9f314SRoger Ferrer Ibanez S<float> s3; 113f7b9f314SRoger Ferrer Ibanez s3.get(); // expected-note {{in instantiation of member function 'S<float>::get'}} 114f7b9f314SRoger Ferrer Ibanez } 115*d80d6c5aSRoger Ferrer Ibanez 116*d80d6c5aSRoger Ferrer Ibanez // PR35509 117*d80d6c5aSRoger Ferrer Ibanez typedef long L1; 118*d80d6c5aSRoger Ferrer Ibanez struct Incomplete; 119*d80d6c5aSRoger Ferrer Ibanez struct S2 { 120*d80d6c5aSRoger Ferrer Ibanez L1 d; 121*d80d6c5aSRoger Ferrer Ibanez Incomplete *e() const; 122*d80d6c5aSRoger Ferrer Ibanez } __attribute__((packed)); e() const123*d80d6c5aSRoger Ferrer IbanezIncomplete *S2::e() const { return (Incomplete *)&d; } // no-warning 124