1 // RUN: %clang_cc1 -fsyntax-only -Wunused-private-field -Wused-but-marked-unused -Wno-uninitialized -verify -std=c++11 %s
2
3 class NotFullyDefined {
4 public:
5 NotFullyDefined();
6 private:
7 int y;
8 };
9
10 class HasUndefinedNestedClass {
11 class Undefined;
12 int unused_;
13 };
14
15 class HasUndefinedPureVirtualDestructor {
16 virtual ~HasUndefinedPureVirtualDestructor() = 0;
17 int unused_;
18 };
19
20 class HasDefinedNestedClasses {
21 class DefinedHere {};
22 class DefinedOutside;
23 int unused_; // expected-warning{{private field 'unused_' is not used}}
24 };
25 class HasDefinedNestedClasses::DefinedOutside {};
26
27 class HasUndefinedFriendFunction {
28 friend void undefinedFriendFunction();
29 int unused_;
30 };
31
32 class HasUndefinedFriendClass {
33 friend class NotFullyDefined;
34 friend class NotDefined;
35 int unused_;
36 };
37
38 class HasFriend {
39 friend class FriendClass;
40 friend void friendFunction(HasFriend f);
41 int unused_; // expected-warning{{private field 'unused_' is not used}}
42 int used_by_friend_class_;
43 int used_by_friend_function_;
44 };
45
46 class ClassWithTemplateFriend {
47 template <typename T> friend class TemplateFriend;
48 int used_by_friend_;
49 int unused_;
50 };
51
52 template <typename T> class TemplateFriend {
53 public:
TemplateFriend(ClassWithTemplateFriend my_friend)54 TemplateFriend(ClassWithTemplateFriend my_friend) {
55 int var = my_friend.used_by_friend_;
56 }
57 };
58
59 class FriendClass {
60 HasFriend my_friend_;
use()61 void use() {
62 my_friend_.used_by_friend_class_ = 42;
63 }
64 };
65
friendFunction(HasFriend my_friend)66 void friendFunction(HasFriend my_friend) {
67 my_friend.used_by_friend_function_ = 42;
68 }
69
70 class NonTrivialConstructor {
71 public:
NonTrivialConstructor()72 NonTrivialConstructor() {}
73 };
74
75 class NonTrivialDestructor {
76 public:
~NonTrivialDestructor()77 ~NonTrivialDestructor() {}
78 };
79
80 class Trivial {
81 public:
82 Trivial() = default;
Trivial(int a)83 Trivial(int a) {}
84 };
85
side_effect()86 int side_effect() {
87 return 42;
88 }
89
90 class A {
91 public:
A()92 A() : primitive_type_(42), default_initializer_(), other_initializer_(42),
93 trivial_(), user_constructor_(42),
94 initialized_with_side_effect_(side_effect()) {
95 used_ = 42;
96 attr_used_ = 42; // expected-warning{{'attr_used_' was marked unused but was used}}
97 }
98
A(int x,A * a)99 A(int x, A* a) : pointer_(a) {}
100
101 private:
102 int primitive_type_; // expected-warning{{private field 'primitive_type_' is not used}}
103 A* pointer_; // expected-warning{{private field 'pointer_' is not used}}
104 int no_initializer_; // expected-warning{{private field 'no_initializer_' is not used}}
105 int default_initializer_; // expected-warning{{private field 'default_initializer_' is not used}}
106 int other_initializer_; // expected-warning{{private field 'other_initializer_' is not used}}
107 int used_, unused_; // expected-warning{{private field 'unused_' is not used}}
108 int in_class_initializer_ = 42; // expected-warning{{private field 'in_class_initializer_' is not used}}
109 int in_class_initializer_with_side_effect_ = side_effect();
110 Trivial trivial_initializer_ = Trivial(); // expected-warning{{private field 'trivial_initializer_' is not used}}
111 Trivial non_trivial_initializer_ = Trivial(42);
112 int initialized_with_side_effect_;
113 static int static_fields_are_ignored_;
114
115 Trivial trivial_; // expected-warning{{private field 'trivial_' is not used}}
116 Trivial user_constructor_;
117 NonTrivialConstructor non_trivial_constructor_;
118 NonTrivialDestructor non_trivial_destructor_;
119
120 int attr_ __attribute__((unused));
121 int attr_used_ __attribute__((unused));
122 };
123
124 class EverythingUsed {
125 public:
EverythingUsed()126 EverythingUsed() : as_array_index_(0), var_(by_initializer_) {
127 var_ = sizeof(sizeof_);
128 int *use = &by_reference_;
129 int test[2];
130 test[as_array_index_] = 42;
131 int EverythingUsed::*ptr = &EverythingUsed::by_pointer_to_member_;
132 }
133
134 template<class T>
useStuff(T t)135 void useStuff(T t) {
136 by_template_function_ = 42;
137 }
138
139 private:
140 int var_;
141 int sizeof_;
142 int by_reference_;
143 int by_template_function_;
144 int as_array_index_;
145 int by_initializer_;
146 int by_pointer_to_member_;
147 };
148
149 class HasFeatureTest {
150 #if __has_feature(attribute_unused_on_fields)
151 int unused_; // expected-warning{{private field 'unused_' is not used}}
152 int unused2_ __attribute__((unused)); // no-warning
153 #endif
154 };
155
156 namespace templates {
157 class B {
158 template <typename T> void f(T t);
159 int a;
160 };
161 } // namespace templates
162
163 namespace mutual_friends {
164 // Undefined methods make mutual friends undefined.
165 class A {
166 int a;
167 friend class B;
168 void doSomethingToAOrB();
169 };
170 class B {
171 int b;
172 friend class A;
173 };
174
175 // Undefined friends do not make a mutual friend undefined.
176 class C {
177 int c;
doSomethingElse()178 void doSomethingElse() {}
179 friend class E;
180 friend class D;
181 };
182 class D {
183 int d; // expected-warning{{private field 'd' is not used}}
184 friend class C;
185 };
186
187 // Undefined nested classes make mutual friends undefined.
188 class F {
189 int f;
190 class G;
191 friend class H;
192 };
193 class H {
194 int h;
195 friend class F;
196 };
197 } // namespace mutual_friends
198
199 namespace anonymous_structs_unions {
200 class A {
201 private:
202 // FIXME: Look at the DeclContext for anonymous structs/unions.
203 union {
204 int *Aligner;
205 unsigned char Data[8];
206 };
207 };
208 union S {
209 private:
210 int *Aligner;
211 unsigned char Data[8];
212 };
213 } // namespace anonymous_structs_unions
214
215 namespace pr13413 {
216 class A {
A()217 A() : p_(__null), b_(false), a_(this), p2_(nullptr) {}
218 void* p_; // expected-warning{{private field 'p_' is not used}}
219 bool b_; // expected-warning{{private field 'b_' is not used}}
220 A* a_; // expected-warning{{private field 'a_' is not used}}
221 void* p2_; // expected-warning{{private field 'p2_' is not used}}
222 };
223 }
224
225 namespace pr13543 {
226 void f(int);
227 void f(char);
228 struct S {
Spr13543::S229 S() : p(&f) {}
230 private:
231 void (*p)(int); // expected-warning{{private field 'p' is not used}}
232 };
233
234 struct A { int n; };
235 struct B {
Bpr13543::B236 B() : a(A()) {}
Bpr13543::B237 B(char) {}
Bpr13543::B238 B(int n) : a{n}, b{(f(n), 0)} {}
239 private:
240 A a = A(); // expected-warning{{private field 'a' is not used}}
241 A b;
242 };
243
244 struct X { ~X(); };
245 class C {
246 X x[4]; // no-warning
247 };
248 }
249