xref: /llvm-project/clang/test/SemaCXX/address-packed.cpp (revision d80d6c5a56098efe7dd90e2fea6d49da87724251)
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 Ibanez void 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 Ibanez void 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 Ibanez Incomplete *S2::e() const { return (Incomplete *)&d; } // no-warning
124