189a1d03eSRichard // RUN: %check_clang_tidy -check-suffixes=PUBLIC,NONPRIVATE,PROTECTED %s misc-non-private-member-variables-in-classes %t
2*e8a3ddafSNathan James // 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*e8a3ddafSNathan James // 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}}' --
489a1d03eSRichard // RUN: %check_clang_tidy -check-suffixes=PUBLIC,PROTECTED %s cppcoreguidelines-non-private-member-variables-in-classes %t -- --
5*e8a3ddafSNathan James // 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*e8a3ddafSNathan James // 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}}' --
789a1d03eSRichard 
889a1d03eSRichard //----------------------------------------------------------------------------//
989a1d03eSRichard 
1089a1d03eSRichard // Only data, do not warn
1189a1d03eSRichard 
1289a1d03eSRichard struct S0 {
1389a1d03eSRichard   int S0_v0;
1489a1d03eSRichard 
1589a1d03eSRichard public:
1689a1d03eSRichard   int S0_v1;
1789a1d03eSRichard 
1889a1d03eSRichard protected:
1989a1d03eSRichard   int S0_v2;
2089a1d03eSRichard 
2189a1d03eSRichard private:
2289a1d03eSRichard   int S0_v3;
2389a1d03eSRichard };
2489a1d03eSRichard 
2589a1d03eSRichard class S1 {
2689a1d03eSRichard   int S1_v0;
2789a1d03eSRichard 
2889a1d03eSRichard public:
2989a1d03eSRichard   int S1_v1;
3089a1d03eSRichard 
3189a1d03eSRichard protected:
3289a1d03eSRichard   int S1_v2;
3389a1d03eSRichard 
3489a1d03eSRichard private:
3589a1d03eSRichard   int S1_v3;
3689a1d03eSRichard };
3789a1d03eSRichard 
3889a1d03eSRichard // Only data and implicit or static methods, do not warn
3989a1d03eSRichard 
4089a1d03eSRichard class C {
4189a1d03eSRichard public:
C()4289a1d03eSRichard   C() {}
~C()4389a1d03eSRichard   ~C() {}
4489a1d03eSRichard };
4589a1d03eSRichard 
4689a1d03eSRichard struct S1Implicit {
4789a1d03eSRichard   C S1Implicit_v0;
4889a1d03eSRichard };
4989a1d03eSRichard 
5089a1d03eSRichard struct S1ImplicitAndStatic {
5189a1d03eSRichard   C S1Implicit_v0;
sS1ImplicitAndStatic5289a1d03eSRichard   static void s() {}
5389a1d03eSRichard };
5489a1d03eSRichard 
5589a1d03eSRichard //----------------------------------------------------------------------------//
5689a1d03eSRichard 
5789a1d03eSRichard // All functions are static, do not warn.
5889a1d03eSRichard 
5989a1d03eSRichard struct S2 {
6089a1d03eSRichard   static void S2_m0();
6189a1d03eSRichard   int S2_v0;
6289a1d03eSRichard 
6389a1d03eSRichard public:
6489a1d03eSRichard   static void S2_m1();
6589a1d03eSRichard   int S2_v1;
6689a1d03eSRichard 
6789a1d03eSRichard protected:
6889a1d03eSRichard   static void S2_m3();
6989a1d03eSRichard   int S2_v2;
7089a1d03eSRichard 
7189a1d03eSRichard private:
7289a1d03eSRichard   static void S2_m4();
7389a1d03eSRichard   int S2_v3;
7489a1d03eSRichard };
7589a1d03eSRichard 
7689a1d03eSRichard class S3 {
7789a1d03eSRichard   static void S3_m0();
7889a1d03eSRichard   int S3_v0;
7989a1d03eSRichard 
8089a1d03eSRichard public:
8189a1d03eSRichard   static void S3_m1();
8289a1d03eSRichard   int S3_v1;
8389a1d03eSRichard 
8489a1d03eSRichard protected:
8589a1d03eSRichard   static void S3_m3();
8689a1d03eSRichard   int S3_v2;
8789a1d03eSRichard 
8889a1d03eSRichard private:
8989a1d03eSRichard   static void S3_m4();
9089a1d03eSRichard   int S3_v3;
9189a1d03eSRichard };
9289a1d03eSRichard 
9389a1d03eSRichard //============================================================================//
9489a1d03eSRichard 
9589a1d03eSRichard // union != struct/class. do not diagnose.
9689a1d03eSRichard 
9789a1d03eSRichard union U0 {
9889a1d03eSRichard   void U0_m0();
9989a1d03eSRichard   int U0_v0;
10089a1d03eSRichard 
10189a1d03eSRichard public:
10289a1d03eSRichard   void U0_m1();
10389a1d03eSRichard   int U0_v1;
10489a1d03eSRichard 
10589a1d03eSRichard protected:
10689a1d03eSRichard   void U0_m2();
10789a1d03eSRichard   int U0_v2;
10889a1d03eSRichard 
10989a1d03eSRichard private:
11089a1d03eSRichard   void U0_m3();
11189a1d03eSRichard   int U0_v3;
11289a1d03eSRichard };
11389a1d03eSRichard 
11489a1d03eSRichard //============================================================================//
11589a1d03eSRichard 
11689a1d03eSRichard // Has non-static method with default visibility.
11789a1d03eSRichard 
11889a1d03eSRichard struct S4 {
11989a1d03eSRichard   void S4_m0();
12089a1d03eSRichard 
12189a1d03eSRichard   int S4_v0;
12289a1d03eSRichard   // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S4_v0' has public visibility
12389a1d03eSRichard public:
12489a1d03eSRichard   int S4_v1;
12589a1d03eSRichard   // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S4_v1' has public visibility
12689a1d03eSRichard protected:
12789a1d03eSRichard   int S4_v2;
12889a1d03eSRichard   // CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S4_v2' has protected visibility
12989a1d03eSRichard private:
13089a1d03eSRichard   int S4_v3;
13189a1d03eSRichard };
13289a1d03eSRichard 
13389a1d03eSRichard class S5 {
13489a1d03eSRichard   void S5_m0();
13589a1d03eSRichard 
13689a1d03eSRichard   int S5_v0;
13789a1d03eSRichard 
13889a1d03eSRichard public:
13989a1d03eSRichard   int S5_v1;
14089a1d03eSRichard   // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S5_v1' has public visibility
14189a1d03eSRichard protected:
14289a1d03eSRichard   int S5_v2;
14389a1d03eSRichard   // CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S5_v2' has protected visibility
14489a1d03eSRichard private:
14589a1d03eSRichard   int S5_v3;
14689a1d03eSRichard };
14789a1d03eSRichard 
14889a1d03eSRichard //----------------------------------------------------------------------------//
14989a1d03eSRichard 
15089a1d03eSRichard // Has non-static method with public visibility.
15189a1d03eSRichard 
15289a1d03eSRichard struct S6 {
15389a1d03eSRichard   int S6_v0;
15489a1d03eSRichard   // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S6_v0' has public visibility
15589a1d03eSRichard public:
15689a1d03eSRichard   void S6_m0();
15789a1d03eSRichard   int S6_v1;
15889a1d03eSRichard   // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S6_v1' has public visibility
15989a1d03eSRichard protected:
16089a1d03eSRichard   int S6_v2;
16189a1d03eSRichard   // CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S6_v2' has protected visibility
16289a1d03eSRichard private:
16389a1d03eSRichard   int S6_v3;
16489a1d03eSRichard };
16589a1d03eSRichard 
16689a1d03eSRichard class S7 {
16789a1d03eSRichard   int S7_v0;
16889a1d03eSRichard 
16989a1d03eSRichard public:
17089a1d03eSRichard   void S7_m0();
17189a1d03eSRichard   int S7_v1;
17289a1d03eSRichard   // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S7_v1' has public visibility
17389a1d03eSRichard protected:
17489a1d03eSRichard   int S7_v2;
17589a1d03eSRichard   // CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S7_v2' has protected visibility
17689a1d03eSRichard private:
17789a1d03eSRichard   int S7_v3;
17889a1d03eSRichard };
17989a1d03eSRichard 
18089a1d03eSRichard //----------------------------------------------------------------------------//
18189a1d03eSRichard 
18289a1d03eSRichard // Has non-static method with protected visibility.
18389a1d03eSRichard 
18489a1d03eSRichard struct S8 {
18589a1d03eSRichard   int S8_v0;
18689a1d03eSRichard   // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S8_v0' has public visibility
18789a1d03eSRichard public:
18889a1d03eSRichard   int S8_v1;
18989a1d03eSRichard   // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S8_v1' has public visibility
19089a1d03eSRichard protected:
19189a1d03eSRichard   void S8_m0();
19289a1d03eSRichard   int S8_v2;
19389a1d03eSRichard   // CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S8_v2' has protected visibility
19489a1d03eSRichard private:
19589a1d03eSRichard   int S8_v3;
19689a1d03eSRichard };
19789a1d03eSRichard 
19889a1d03eSRichard class S9 {
19989a1d03eSRichard   int S9_v0;
20089a1d03eSRichard 
20189a1d03eSRichard public:
20289a1d03eSRichard   int S9_v1;
20389a1d03eSRichard   // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S9_v1' has public visibility
20489a1d03eSRichard protected:
20589a1d03eSRichard   void S9_m0();
20689a1d03eSRichard   int S9_v2;
20789a1d03eSRichard   // CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S9_v2' has protected visibility
20889a1d03eSRichard private:
20989a1d03eSRichard   int S9_v3;
21089a1d03eSRichard };
21189a1d03eSRichard 
21289a1d03eSRichard //----------------------------------------------------------------------------//
21389a1d03eSRichard 
21489a1d03eSRichard // Has non-static method with private visibility.
21589a1d03eSRichard 
21689a1d03eSRichard struct S10 {
21789a1d03eSRichard   int S10_v0;
21889a1d03eSRichard   // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S10_v0' has public visibility
21989a1d03eSRichard public:
22089a1d03eSRichard   int S10_v1;
22189a1d03eSRichard   // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S10_v1' has public visibility
22289a1d03eSRichard protected:
22389a1d03eSRichard   int S10_v2;
22489a1d03eSRichard   // CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S10_v2' has protected visibility
22589a1d03eSRichard private:
22689a1d03eSRichard   void S10_m0();
22789a1d03eSRichard   int S10_v3;
22889a1d03eSRichard };
22989a1d03eSRichard 
23089a1d03eSRichard class S11 {
23189a1d03eSRichard   int S11_v0;
23289a1d03eSRichard 
23389a1d03eSRichard public:
23489a1d03eSRichard   int S11_v1;
23589a1d03eSRichard   // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S11_v1' has public visibility
23689a1d03eSRichard protected:
23789a1d03eSRichard   int S11_v2;
23889a1d03eSRichard   // CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S11_v2' has protected visibility
23989a1d03eSRichard private:
24089a1d03eSRichard   void S11_m0();
24189a1d03eSRichard   int S11_v3;
24289a1d03eSRichard };
24389a1d03eSRichard 
24489a1d03eSRichard //============================================================================//
24589a1d03eSRichard 
24689a1d03eSRichard // Static variables are ignored.
24789a1d03eSRichard // Has non-static methods and static variables.
24889a1d03eSRichard 
24989a1d03eSRichard struct S12 {
25089a1d03eSRichard   void S12_m0();
25189a1d03eSRichard   static int S12_v0;
25289a1d03eSRichard 
25389a1d03eSRichard public:
25489a1d03eSRichard   void S12_m1();
25589a1d03eSRichard   static int S12_v1;
25689a1d03eSRichard 
25789a1d03eSRichard protected:
25889a1d03eSRichard   void S12_m2();
25989a1d03eSRichard   static int S12_v2;
26089a1d03eSRichard 
26189a1d03eSRichard private:
26289a1d03eSRichard   void S12_m3();
26389a1d03eSRichard   static int S12_v3;
26489a1d03eSRichard };
26589a1d03eSRichard 
26689a1d03eSRichard class S13 {
26789a1d03eSRichard   void S13_m0();
26889a1d03eSRichard   static int S13_v0;
26989a1d03eSRichard 
27089a1d03eSRichard public:
27189a1d03eSRichard   void S13_m1();
27289a1d03eSRichard   static int S13_v1;
27389a1d03eSRichard 
27489a1d03eSRichard protected:
27589a1d03eSRichard   void S13_m2();
27689a1d03eSRichard   static int S13_v2;
27789a1d03eSRichard 
27889a1d03eSRichard private:
27989a1d03eSRichard   void S13_m3();
28089a1d03eSRichard   static int S13_v3;
28189a1d03eSRichard };
28289a1d03eSRichard 
28389a1d03eSRichard struct S14 {
28489a1d03eSRichard   void S14_m0();
28589a1d03eSRichard   int S14_v0;
28689a1d03eSRichard   // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S14_v0' has public visibility
28789a1d03eSRichard 
28889a1d03eSRichard public:
28989a1d03eSRichard   void S14_m1();
29089a1d03eSRichard   int S14_v1;
29189a1d03eSRichard   // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S14_v1' has public visibility
29289a1d03eSRichard 
29389a1d03eSRichard protected:
29489a1d03eSRichard   void S14_m2();
29589a1d03eSRichard 
29689a1d03eSRichard private:
29789a1d03eSRichard   void S14_m3();
29889a1d03eSRichard };
29989a1d03eSRichard 
30089a1d03eSRichard class S15 {
30189a1d03eSRichard   void S15_m0();
30289a1d03eSRichard 
30389a1d03eSRichard public:
30489a1d03eSRichard   void S15_m1();
30589a1d03eSRichard   int S15_v1;
30689a1d03eSRichard   // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S15_v1' has public visibility
30789a1d03eSRichard 
30889a1d03eSRichard protected:
30989a1d03eSRichard   void S15_m2();
31089a1d03eSRichard 
31189a1d03eSRichard private:
31289a1d03eSRichard   void S15_m3();
31389a1d03eSRichard };
31489a1d03eSRichard 
31589a1d03eSRichard //----------------------------------------------------------------------------//
31689a1d03eSRichard 
31789a1d03eSRichard template <typename T>
31889a1d03eSRichard struct S97 {
31989a1d03eSRichard   void method();
32089a1d03eSRichard   T S97_v0;
32189a1d03eSRichard   // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:5: warning: member variable 'S97_v0' has public visibility
32289a1d03eSRichard };
32389a1d03eSRichard 
32489a1d03eSRichard template struct S97<char *>;
32589a1d03eSRichard 
32689a1d03eSRichard template <>
32789a1d03eSRichard struct S97<double> {
32889a1d03eSRichard   void method();
32989a1d03eSRichard   double S97d_v0;
33089a1d03eSRichard   // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:10: warning: member variable 'S97d_v0' has public visibility
33189a1d03eSRichard };
33289a1d03eSRichard 
33389a1d03eSRichard //----------------------------------------------------------------------------//
33489a1d03eSRichard 
33589a1d03eSRichard #define FIELD(x) int x;
33689a1d03eSRichard 
33789a1d03eSRichard // Do diagnose fields originating from macros.
33889a1d03eSRichard struct S98 {
33989a1d03eSRichard   void method();
34089a1d03eSRichard   FIELD(S98_v0);
34189a1d03eSRichard   // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:9: warning: member variable 'S98_v0' has public visibility
34289a1d03eSRichard };
34389a1d03eSRichard 
34489a1d03eSRichard //----------------------------------------------------------------------------//
34589a1d03eSRichard 
34689a1d03eSRichard // Don't look in descendant classes.
34789a1d03eSRichard class S99 {
34889a1d03eSRichard   void method();
34989a1d03eSRichard 
35089a1d03eSRichard   struct S99_0 {
35189a1d03eSRichard     int S99_S0_v0;
35289a1d03eSRichard   };
35389a1d03eSRichard 
35489a1d03eSRichard public:
35589a1d03eSRichard   struct S99_1 {
35689a1d03eSRichard     int S99_S0_v0;
35789a1d03eSRichard   };
35889a1d03eSRichard 
35989a1d03eSRichard protected:
36089a1d03eSRichard   struct S99_2 {
36189a1d03eSRichard     int S99_S0_v0;
36289a1d03eSRichard   };
36389a1d03eSRichard 
36489a1d03eSRichard private:
36589a1d03eSRichard   struct S99_3 {
36689a1d03eSRichard     int S99_S0_v0;
36789a1d03eSRichard   };
36889a1d03eSRichard };
36989a1d03eSRichard 
37089a1d03eSRichard //----------------------------------------------------------------------------//
37189a1d03eSRichard 
37289a1d03eSRichard // Only diagnose once, don't let the inheritance fool you.
37389a1d03eSRichard struct S100 {
37489a1d03eSRichard   int S100_v0;
37589a1d03eSRichard   // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S100_v0' has public visibility
37689a1d03eSRichard   void m0();
37789a1d03eSRichard };
37889a1d03eSRichard struct S101_default_inheritance : S100 {
37989a1d03eSRichard   int S101_v0;
38089a1d03eSRichard   // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S101_v0' has public visibility
38189a1d03eSRichard   void m1();
38289a1d03eSRichard };
38389a1d03eSRichard struct S102_public_inheritance : public S100 {
38489a1d03eSRichard   int S102_v0;
38589a1d03eSRichard   // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S102_v0' has public visibility
38689a1d03eSRichard   void m1();
38789a1d03eSRichard };
38889a1d03eSRichard struct S103_protected_inheritance : protected S100 {
38989a1d03eSRichard   int S103_v0;
39089a1d03eSRichard   // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S103_v0' has public visibility
39189a1d03eSRichard   void m1();
39289a1d03eSRichard };
39389a1d03eSRichard struct S104_private_inheritance : private S100 {
39489a1d03eSRichard   int S104_v0;
39589a1d03eSRichard   // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S104_v0' has public visibility
39689a1d03eSRichard   void m1();
39789a1d03eSRichard };
398