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