xref: /aosp_15_r20/external/clang/test/SemaCXX/warn-unused-private-field.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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