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