1 // RUN: %check_clang_tidy -check-suffixes=PUBLIC,NONPRIVATE,PROTECTED %s misc-non-private-member-variables-in-classes %t
2 // RUN: %check_clang_tidy -check-suffixes=PUBLIC,NONPRIVATE,PROTECTED %s misc-non-private-member-variables-in-classes %t -- -config='{CheckOptions: [{key: misc-non-private-member-variables-in-classes.IgnorePublicMemberVariables, value: false}, {key: misc-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic, value: false}]}' --
3 // RUN: %check_clang_tidy -check-suffixes=PUBLIC,PROTECTED %s misc-non-private-member-variables-in-classes %t -- -config='{CheckOptions: [{key: misc-non-private-member-variables-in-classes.IgnorePublicMemberVariables, value: false}, {key: misc-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic, value: true}]}' --
4 // RUN: %check_clang_tidy -check-suffixes=PUBLIC,PROTECTED %s cppcoreguidelines-non-private-member-variables-in-classes %t -- --
5 // RUN: %check_clang_tidy -check-suffixes=PROTECTED %s misc-non-private-member-variables-in-classes %t -- -config='{CheckOptions: [{key: misc-non-private-member-variables-in-classes.IgnorePublicMemberVariables, value: true}, {key: misc-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic, value: false}]}' --
6 // RUN: %check_clang_tidy -check-suffixes=PROTECTED %s misc-non-private-member-variables-in-classes %t -- -config='{CheckOptions: [{key: misc-non-private-member-variables-in-classes.IgnorePublicMemberVariables, value: true}, {key: misc-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic, value: true}]}' --
7 
8 //----------------------------------------------------------------------------//
9 
10 // Only data, do not warn
11 
12 struct S0 {
13   int S0_v0;
14 
15 public:
16   int S0_v1;
17 
18 protected:
19   int S0_v2;
20 
21 private:
22   int S0_v3;
23 };
24 
25 class S1 {
26   int S1_v0;
27 
28 public:
29   int S1_v1;
30 
31 protected:
32   int S1_v2;
33 
34 private:
35   int S1_v3;
36 };
37 
38 // Only data and implicit or static methods, do not warn
39 
40 class C {
41 public:
C()42   C() {}
~C()43   ~C() {}
44 };
45 
46 struct S1Implicit {
47   C S1Implicit_v0;
48 };
49 
50 struct S1ImplicitAndStatic {
51   C S1Implicit_v0;
sS1ImplicitAndStatic52   static void s() {}
53 };
54 
55 //----------------------------------------------------------------------------//
56 
57 // All functions are static, do not warn.
58 
59 struct S2 {
60   static void S2_m0();
61   int S2_v0;
62 
63 public:
64   static void S2_m1();
65   int S2_v1;
66 
67 protected:
68   static void S2_m3();
69   int S2_v2;
70 
71 private:
72   static void S2_m4();
73   int S2_v3;
74 };
75 
76 class S3 {
77   static void S3_m0();
78   int S3_v0;
79 
80 public:
81   static void S3_m1();
82   int S3_v1;
83 
84 protected:
85   static void S3_m3();
86   int S3_v2;
87 
88 private:
89   static void S3_m4();
90   int S3_v3;
91 };
92 
93 //============================================================================//
94 
95 // union != struct/class. do not diagnose.
96 
97 union U0 {
98   void U0_m0();
99   int U0_v0;
100 
101 public:
102   void U0_m1();
103   int U0_v1;
104 
105 protected:
106   void U0_m2();
107   int U0_v2;
108 
109 private:
110   void U0_m3();
111   int U0_v3;
112 };
113 
114 //============================================================================//
115 
116 // Has non-static method with default visibility.
117 
118 struct S4 {
119   void S4_m0();
120 
121   int S4_v0;
122   // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S4_v0' has public visibility
123 public:
124   int S4_v1;
125   // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S4_v1' has public visibility
126 protected:
127   int S4_v2;
128   // CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S4_v2' has protected visibility
129 private:
130   int S4_v3;
131 };
132 
133 class S5 {
134   void S5_m0();
135 
136   int S5_v0;
137 
138 public:
139   int S5_v1;
140   // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S5_v1' has public visibility
141 protected:
142   int S5_v2;
143   // CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S5_v2' has protected visibility
144 private:
145   int S5_v3;
146 };
147 
148 //----------------------------------------------------------------------------//
149 
150 // Has non-static method with public visibility.
151 
152 struct S6 {
153   int S6_v0;
154   // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S6_v0' has public visibility
155 public:
156   void S6_m0();
157   int S6_v1;
158   // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S6_v1' has public visibility
159 protected:
160   int S6_v2;
161   // CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S6_v2' has protected visibility
162 private:
163   int S6_v3;
164 };
165 
166 class S7 {
167   int S7_v0;
168 
169 public:
170   void S7_m0();
171   int S7_v1;
172   // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S7_v1' has public visibility
173 protected:
174   int S7_v2;
175   // CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S7_v2' has protected visibility
176 private:
177   int S7_v3;
178 };
179 
180 //----------------------------------------------------------------------------//
181 
182 // Has non-static method with protected visibility.
183 
184 struct S8 {
185   int S8_v0;
186   // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S8_v0' has public visibility
187 public:
188   int S8_v1;
189   // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S8_v1' has public visibility
190 protected:
191   void S8_m0();
192   int S8_v2;
193   // CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S8_v2' has protected visibility
194 private:
195   int S8_v3;
196 };
197 
198 class S9 {
199   int S9_v0;
200 
201 public:
202   int S9_v1;
203   // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S9_v1' has public visibility
204 protected:
205   void S9_m0();
206   int S9_v2;
207   // CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S9_v2' has protected visibility
208 private:
209   int S9_v3;
210 };
211 
212 //----------------------------------------------------------------------------//
213 
214 // Has non-static method with private visibility.
215 
216 struct S10 {
217   int S10_v0;
218   // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S10_v0' has public visibility
219 public:
220   int S10_v1;
221   // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S10_v1' has public visibility
222 protected:
223   int S10_v2;
224   // CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S10_v2' has protected visibility
225 private:
226   void S10_m0();
227   int S10_v3;
228 };
229 
230 class S11 {
231   int S11_v0;
232 
233 public:
234   int S11_v1;
235   // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S11_v1' has public visibility
236 protected:
237   int S11_v2;
238   // CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S11_v2' has protected visibility
239 private:
240   void S11_m0();
241   int S11_v3;
242 };
243 
244 //============================================================================//
245 
246 // Static variables are ignored.
247 // Has non-static methods and static variables.
248 
249 struct S12 {
250   void S12_m0();
251   static int S12_v0;
252 
253 public:
254   void S12_m1();
255   static int S12_v1;
256 
257 protected:
258   void S12_m2();
259   static int S12_v2;
260 
261 private:
262   void S12_m3();
263   static int S12_v3;
264 };
265 
266 class S13 {
267   void S13_m0();
268   static int S13_v0;
269 
270 public:
271   void S13_m1();
272   static int S13_v1;
273 
274 protected:
275   void S13_m2();
276   static int S13_v2;
277 
278 private:
279   void S13_m3();
280   static int S13_v3;
281 };
282 
283 struct S14 {
284   void S14_m0();
285   int S14_v0;
286   // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S14_v0' has public visibility
287 
288 public:
289   void S14_m1();
290   int S14_v1;
291   // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S14_v1' has public visibility
292 
293 protected:
294   void S14_m2();
295 
296 private:
297   void S14_m3();
298 };
299 
300 class S15 {
301   void S15_m0();
302 
303 public:
304   void S15_m1();
305   int S15_v1;
306   // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S15_v1' has public visibility
307 
308 protected:
309   void S15_m2();
310 
311 private:
312   void S15_m3();
313 };
314 
315 //----------------------------------------------------------------------------//
316 
317 template <typename T>
318 struct S97 {
319   void method();
320   T S97_v0;
321   // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:5: warning: member variable 'S97_v0' has public visibility
322 };
323 
324 template struct S97<char *>;
325 
326 template <>
327 struct S97<double> {
328   void method();
329   double S97d_v0;
330   // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:10: warning: member variable 'S97d_v0' has public visibility
331 };
332 
333 //----------------------------------------------------------------------------//
334 
335 #define FIELD(x) int x;
336 
337 // Do diagnose fields originating from macros.
338 struct S98 {
339   void method();
340   FIELD(S98_v0);
341   // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:9: warning: member variable 'S98_v0' has public visibility
342 };
343 
344 //----------------------------------------------------------------------------//
345 
346 // Don't look in descendant classes.
347 class S99 {
348   void method();
349 
350   struct S99_0 {
351     int S99_S0_v0;
352   };
353 
354 public:
355   struct S99_1 {
356     int S99_S0_v0;
357   };
358 
359 protected:
360   struct S99_2 {
361     int S99_S0_v0;
362   };
363 
364 private:
365   struct S99_3 {
366     int S99_S0_v0;
367   };
368 };
369 
370 //----------------------------------------------------------------------------//
371 
372 // Only diagnose once, don't let the inheritance fool you.
373 struct S100 {
374   int S100_v0;
375   // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S100_v0' has public visibility
376   void m0();
377 };
378 struct S101_default_inheritance : S100 {
379   int S101_v0;
380   // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S101_v0' has public visibility
381   void m1();
382 };
383 struct S102_public_inheritance : public S100 {
384   int S102_v0;
385   // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S102_v0' has public visibility
386   void m1();
387 };
388 struct S103_protected_inheritance : protected S100 {
389   int S103_v0;
390   // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S103_v0' has public visibility
391   void m1();
392 };
393 struct S104_private_inheritance : private S100 {
394   int S104_v0;
395   // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S104_v0' has public visibility
396   void m1();
397 };
398