// RUN: %check_clang_tidy -check-suffixes=PUBLIC,NONPRIVATE,PROTECTED %s misc-non-private-member-variables-in-classes %t // 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: 0}, {key: misc-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic, value: 0}]}' -- // 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: 0}, {key: misc-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic, value: 1}]}' -- // RUN: %check_clang_tidy -check-suffixes=PUBLIC,PROTECTED %s cppcoreguidelines-non-private-member-variables-in-classes %t -- -- // 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: 1}, {key: misc-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic, value: 0}]}' -- // 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: 1}, {key: misc-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic, value: 1}]}' -- //----------------------------------------------------------------------------// // Only data, do not warn struct S0 { int S0_v0; public: int S0_v1; protected: int S0_v2; private: int S0_v3; }; class S1 { int S1_v0; public: int S1_v1; protected: int S1_v2; private: int S1_v3; }; // Only data and implicit or static methods, do not warn class C { public: C() {} ~C() {} }; struct S1Implicit { C S1Implicit_v0; }; struct S1ImplicitAndStatic { C S1Implicit_v0; static void s() {} }; //----------------------------------------------------------------------------// // All functions are static, do not warn. struct S2 { static void S2_m0(); int S2_v0; public: static void S2_m1(); int S2_v1; protected: static void S2_m3(); int S2_v2; private: static void S2_m4(); int S2_v3; }; class S3 { static void S3_m0(); int S3_v0; public: static void S3_m1(); int S3_v1; protected: static void S3_m3(); int S3_v2; private: static void S3_m4(); int S3_v3; }; //============================================================================// // union != struct/class. do not diagnose. union U0 { void U0_m0(); int U0_v0; public: void U0_m1(); int U0_v1; protected: void U0_m2(); int U0_v2; private: void U0_m3(); int U0_v3; }; //============================================================================// // Has non-static method with default visibility. struct S4 { void S4_m0(); int S4_v0; // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S4_v0' has public visibility public: int S4_v1; // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S4_v1' has public visibility protected: int S4_v2; // CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S4_v2' has protected visibility private: int S4_v3; }; class S5 { void S5_m0(); int S5_v0; public: int S5_v1; // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S5_v1' has public visibility protected: int S5_v2; // CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S5_v2' has protected visibility private: int S5_v3; }; //----------------------------------------------------------------------------// // Has non-static method with public visibility. struct S6 { int S6_v0; // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S6_v0' has public visibility public: void S6_m0(); int S6_v1; // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S6_v1' has public visibility protected: int S6_v2; // CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S6_v2' has protected visibility private: int S6_v3; }; class S7 { int S7_v0; public: void S7_m0(); int S7_v1; // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S7_v1' has public visibility protected: int S7_v2; // CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S7_v2' has protected visibility private: int S7_v3; }; //----------------------------------------------------------------------------// // Has non-static method with protected visibility. struct S8 { int S8_v0; // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S8_v0' has public visibility public: int S8_v1; // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S8_v1' has public visibility protected: void S8_m0(); int S8_v2; // CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S8_v2' has protected visibility private: int S8_v3; }; class S9 { int S9_v0; public: int S9_v1; // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S9_v1' has public visibility protected: void S9_m0(); int S9_v2; // CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S9_v2' has protected visibility private: int S9_v3; }; //----------------------------------------------------------------------------// // Has non-static method with private visibility. struct S10 { int S10_v0; // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S10_v0' has public visibility public: int S10_v1; // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S10_v1' has public visibility protected: int S10_v2; // CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S10_v2' has protected visibility private: void S10_m0(); int S10_v3; }; class S11 { int S11_v0; public: int S11_v1; // CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S11_v1' has public visibility protected: int S11_v2; // CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S11_v2' has protected visibility private: void S11_m0(); int S11_v3; }; //============================================================================// // Static variables are ignored. // Has non-static methods and static variables. struct S12 { void S12_m0(); static int S12_v0; public: void S12_m1(); static int S12_v1; protected: void S12_m2(); static int S12_v2; private: void S12_m3(); static int S12_v3; }; class S13 { void S13_m0(); static int S13_v0; public: void S13_m1(); static int S13_v1; protected: void S13_m2(); static int S13_v2; private: void S13_m3(); static int S13_v3; }; struct S14 { void S14_m0(); int S14_v0; // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S14_v0' has public visibility public: void S14_m1(); int S14_v1; // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S14_v1' has public visibility protected: void S14_m2(); private: void S14_m3(); }; class S15 { void S15_m0(); public: void S15_m1(); int S15_v1; // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S15_v1' has public visibility protected: void S15_m2(); private: void S15_m3(); }; //----------------------------------------------------------------------------// template struct S97 { void method(); T S97_v0; // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:5: warning: member variable 'S97_v0' has public visibility }; template struct S97; template <> struct S97 { void method(); double S97d_v0; // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:10: warning: member variable 'S97d_v0' has public visibility }; //----------------------------------------------------------------------------// #define FIELD(x) int x; // Do diagnose fields originating from macros. struct S98 { void method(); FIELD(S98_v0); // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:9: warning: member variable 'S98_v0' has public visibility }; //----------------------------------------------------------------------------// // Don't look in descendant classes. class S99 { void method(); struct S99_0 { int S99_S0_v0; }; public: struct S99_1 { int S99_S0_v0; }; protected: struct S99_2 { int S99_S0_v0; }; private: struct S99_3 { int S99_S0_v0; }; }; //----------------------------------------------------------------------------// // Only diagnose once, don't let the inheritance fool you. struct S100 { int S100_v0; // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S100_v0' has public visibility void m0(); }; struct S101_default_inheritance : S100 { int S101_v0; // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S101_v0' has public visibility void m1(); }; struct S102_public_inheritance : public S100 { int S102_v0; // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S102_v0' has public visibility void m1(); }; struct S103_protected_inheritance : protected S100 { int S103_v0; // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S103_v0' has public visibility void m1(); }; struct S104_private_inheritance : private S100 { int S104_v0; // CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S104_v0' has public visibility void m1(); };