| // 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 <typename... T> |
| 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<void *>(&arguable.x); // no-warning |
| void *p3 = reinterpret_cast<void *>(&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 <typename Ty> |
| class __attribute__((packed)) S { |
| Ty X; |
| |
| public: |
| const Ty *get() const { |
| return &X; // expected-warning {{packed member 'X' of class or structure 'S<int>'}} |
| // expected-warning@-1 {{packed member 'X' of class or structure 'S<float>'}} |
| } |
| }; |
| |
| template <typename Ty> |
| void h(Ty *); |
| |
| void g1() { |
| S<int> s1; |
| s1.get(); // expected-note {{in instantiation of member function 'S<int>::get'}} |
| |
| S<char> s2; |
| s2.get(); |
| |
| S<float> s3; |
| s3.get(); // expected-note {{in instantiation of member function 'S<float>::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 |