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

source code of clang-tools-extra/test/clang-tidy/checkers/misc/non-private-member-variables-in-classes.cpp