290 lines · cpp
1// RUN: %check_clang_tidy %s misc-override-with-different-visibility %t -- -config="{CheckOptions: {misc-override-with-different-visibility.CheckDestructors: true,misc-override-with-different-visibility.CheckOperators: true}}" -- -I %S/Inputs/override-with-different-visibility2#include <test-system-header.h>3class A {4public:5 virtual void pub_foo1() {}6 virtual void pub_foo2() {}7 virtual void pub_foo3() {}8protected:9 virtual void prot_foo1();10 virtual void prot_foo2();11 virtual void prot_foo3();12private:13 virtual void priv_foo1() {}14 virtual void priv_foo2() {}15 virtual void priv_foo3() {}16};17 18void A::prot_foo1() {}19void A::prot_foo2() {}20void A::prot_foo3() {}21 22namespace test1 {23 24class B: public A {25public:26 void pub_foo1() override {}27 void prot_foo1() override {}28 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: visibility of function 'prot_foo1' is changed from protected in class 'A' to public [misc-override-with-different-visibility]29 // CHECK-MESSAGES: :9:16: note: function declared here as protected30 void priv_foo1() override {}31 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: visibility of function 'priv_foo1' is changed from private in class 'A' to public [misc-override-with-different-visibility]32 // CHECK-MESSAGES: :13:16: note: function declared here as private33protected:34 void pub_foo2() override {}35 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: visibility of function 'pub_foo2' is changed from public in class 'A' to protected [misc-override-with-different-visibility]36 // CHECK-MESSAGES: :6:16: note: function declared here as public37 void prot_foo2() override {}38 void priv_foo2() override {}39 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: visibility of function 'priv_foo2' is changed from private in class 'A' to protected [misc-override-with-different-visibility]40 // CHECK-MESSAGES: :14:16: note: function declared here as private41private:42 void pub_foo3() override {}43 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: visibility of function 'pub_foo3' is changed from public in class 'A' to private [misc-override-with-different-visibility]44 // CHECK-MESSAGES: :7:16: note: function declared here as public45 void prot_foo3() override {}46 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: visibility of function 'prot_foo3' is changed from protected in class 'A' to private [misc-override-with-different-visibility]47 // CHECK-MESSAGES: :11:16: note: function declared here as protected48 void priv_foo3() override {}49};50 51class C: public B {52public:53 void pub_foo1() override;54protected:55 void prot_foo1() override;56 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: visibility of function 'prot_foo1' is changed from public in class 'B' to protected [misc-override-with-different-visibility]57 // CHECK-MESSAGES: :27:8: note: function declared here as public58private:59 void priv_foo1() override;60 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: visibility of function 'priv_foo1' is changed from public in class 'B' to private [misc-override-with-different-visibility]61 // CHECK-MESSAGES: :30:8: note: function declared here as public62};63 64void C::prot_foo1() {}65void C::priv_foo1() {}66 67}68 69namespace test2 {70 71class B: public A {72public:73 void pub_foo1() override;74protected:75 void prot_foo1() override;76private:77 void priv_foo1() override;78};79 80class C: public B {81public:82 void pub_foo1() override;83 void prot_foo1() override;84 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: visibility of function 'prot_foo1' is changed from protected in class 'B' to public85 // CHECK-MESSAGES: :75:8: note: function declared here as protected86 void priv_foo1() override;87 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: visibility of function 'priv_foo1' is changed from private in class 'B' to public88 // CHECK-MESSAGES: :77:8: note: function declared here as private89 90 void pub_foo2() override;91 void prot_foo2() override;92 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: visibility of function 'prot_foo2' is changed from protected in class 'A' to public93 // CHECK-MESSAGES: :10:16: note: function declared here as protected94 void priv_foo2() override;95 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: visibility of function 'priv_foo2' is changed from private in class 'A' to public96 // CHECK-MESSAGES: :14:16: note: function declared here as private97};98 99}100 101namespace test3 {102 103class B: private A {104public:105 void pub_foo1() override;106 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: visibility of function 'pub_foo1' is changed from private (through private inheritance of class 'A') to public107 // CHECK-MESSAGES: :103:10: note: 'A' is inherited as private here108 // CHECK-MESSAGES: :5:16: note: function declared here as public109protected:110 void prot_foo1() override;111 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: visibility of function 'prot_foo1' is changed from private (through private inheritance of class 'A') to protected112 // CHECK-MESSAGES: :103:10: note: 'A' is inherited as private here113 // CHECK-MESSAGES: :9:16: note: function declared here as protected114private:115 void priv_foo1() override;116 117public:118 void prot_foo2() override;119 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: visibility of function 'prot_foo2' is changed from private (through private inheritance of class 'A') to public120 // CHECK-MESSAGES: :103:10: note: 'A' is inherited as private here121 // CHECK-MESSAGES: :10:16: note: function declared here as protected122 void priv_foo2() override;123 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: visibility of function 'priv_foo2' is changed from private in class 'A' to public124 // CHECK-MESSAGES: :14:16: note: function declared here as private125 126private:127 void pub_foo3() override;128 void prot_foo3() override;129};130 131class C: private A {132};133 134class D: public C {135public:136 void pub_foo1() override;137 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: visibility of function 'pub_foo1' is changed from private (through private inheritance of class 'A') to public138 // CHECK-MESSAGES: :131:10: note: 'A' is inherited as private here139 // CHECK-MESSAGES: :5:16: note: function declared here as public140};141 142 143}144 145namespace test4 {146 147struct Base1 {148public:149 virtual void foo1();150private:151 virtual void foo2();152};153 154struct Base2 {155public:156 virtual void foo2();157private:158 virtual void foo1();159};160 161struct A : public Base1, public Base2 {162protected:163 void foo1() override;164 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: visibility of function 'foo1' is changed from private in class 'Base2' to protected165 // CHECK-MESSAGES: :158:16: note: function declared here as private166 // CHECK-MESSAGES: :[[@LINE-3]]:8: warning: visibility of function 'foo1' is changed from public in class 'Base1' to protected167 // CHECK-MESSAGES: :149:16: note: function declared here as public168private:169 void foo2() override;170 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: visibility of function 'foo2' is changed from public in class 'Base2' to private171 // CHECK-MESSAGES: :156:16: note: function declared here as public172};173 174}175 176namespace test5 {177 178struct B1: virtual public A {};179struct B2: virtual private A {};180struct B: public B1, public B2 {181public:182 void pub_foo1() override;183 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: visibility of function 'pub_foo1' is changed from private (through private inheritance of class 'A') to public184 // CHECK-MESSAGES: :179:12: note: 'A' is inherited as private here185 // CHECK-MESSAGES: :5:16: note: function declared here as public186};187 188}189 190namespace test_using {191 192class A {193private:194 A(int);195protected:196 virtual void f();197};198 199class B: public A {200public:201 using A::A;202 using A::f;203};204 205}206 207namespace test_template {208 209template <typename T>210class A {211protected:212 virtual T foo();213};214 215template <typename T>216class B: public A<T> {217private:218 T foo() override;219 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: visibility of function 'foo' is changed from protected in class 'A<int>' to private220 // CHECK-MESSAGES: :[[@LINE-8]]:13: note: function declared here as protected221};222 223template <typename T>224class C: private A<T> {225public:226 T foo() override;227 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: visibility of function 'foo' is changed from private (through private inheritance of class 'A<int>') to public228 // CHECK-MESSAGES: :[[@LINE-4]]:10: note: 'A<int>' is inherited as private here229 // CHECK-MESSAGES: :[[@LINE-17]]:13: note: function declared here as protected230};231 232B<int> fB() {233 return B<int>{};234}235 236C<int> fC() {237 return C<int>{};238}239 240}241 242namespace test_system_header {243 244struct SysDerived: public sys::Base {245private:246 void publicF();247 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: visibility of function 'publicF' is changed from public in class 'Base' to private248};249 250}251 252namespace test_destructor {253 254class A {255public:256 virtual ~A();257};258 259class B: public A {260protected:261 ~B();262 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: visibility of function '~B'263 // CHECK-MESSAGES: :[[@LINE-7]]:11: note: function declared here264};265 266}267 268namespace test_operator {269 270class A {271 virtual int operator()(int);272 virtual A& operator++();273 virtual operator double() const;274};275 276class B: public A {277protected:278 int operator()(int);279 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: visibility of function 'operator()'280 // CHECK-MESSAGES: :[[@LINE-9]]:15: note: function declared here281 A& operator++();282 // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: visibility of function 'operator++'283 // CHECK-MESSAGES: :[[@LINE-11]]:14: note: function declared here284 operator double() const;285 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: visibility of function 'operator double'286 // CHECK-MESSAGES: :[[@LINE-13]]:11: note: function declared here287};288 289}290