1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -Woverloaded-virtual -verify %s 2*67e74705SXin Li 3*67e74705SXin Li struct B1 { 4*67e74705SXin Li virtual void foo(int); // expected-note {{declared here}} 5*67e74705SXin Li virtual void foo(); // expected-note {{declared here}} 6*67e74705SXin Li }; 7*67e74705SXin Li 8*67e74705SXin Li struct S1 : public B1 { 9*67e74705SXin Li void foo(float); // expected-warning {{hides overloaded virtual functions}} 10*67e74705SXin Li }; 11*67e74705SXin Li 12*67e74705SXin Li struct S2 : public B1 { 13*67e74705SXin Li void foo(); // expected-note {{declared here}} 14*67e74705SXin Li }; 15*67e74705SXin Li 16*67e74705SXin Li struct B2 { 17*67e74705SXin Li virtual void foo(void*); // expected-note {{declared here}} 18*67e74705SXin Li }; 19*67e74705SXin Li 20*67e74705SXin Li struct MS1 : public S2, public B2 { 21*67e74705SXin Li virtual void foo(int); // expected-warning {{hides overloaded virtual functions}} 22*67e74705SXin Li }; 23*67e74705SXin Li 24*67e74705SXin Li struct B3 { 25*67e74705SXin Li virtual void foo(int); 26*67e74705SXin Li virtual void foo(); 27*67e74705SXin Li }; 28*67e74705SXin Li 29*67e74705SXin Li struct S3 : public B3 { 30*67e74705SXin Li using B3::foo; 31*67e74705SXin Li void foo(float); 32*67e74705SXin Li }; 33*67e74705SXin Li 34*67e74705SXin Li struct B4 { 35*67e74705SXin Li virtual void foo(); 36*67e74705SXin Li }; 37*67e74705SXin Li 38*67e74705SXin Li struct S4 : public B4 { 39*67e74705SXin Li void foo(float); 40*67e74705SXin Li void foo(); 41*67e74705SXin Li }; 42*67e74705SXin Li 43*67e74705SXin Li namespace PR9182 { 44*67e74705SXin Li struct Base { 45*67e74705SXin Li virtual void foo(int); 46*67e74705SXin Li }; 47*67e74705SXin Li foo(int)48*67e74705SXin Livoid Base::foo(int) { } 49*67e74705SXin Li 50*67e74705SXin Li struct Derived : public Base { 51*67e74705SXin Li virtual void foo(int); 52*67e74705SXin Li void foo(int, int); 53*67e74705SXin Li }; 54*67e74705SXin Li } 55*67e74705SXin Li 56*67e74705SXin Li namespace PR9396 { 57*67e74705SXin Li class A { 58*67e74705SXin Li public: f(int)59*67e74705SXin Li virtual void f(int) {} 60*67e74705SXin Li }; 61*67e74705SXin Li 62*67e74705SXin Li class B : public A { 63*67e74705SXin Li public: f()64*67e74705SXin Li static void f() {} 65*67e74705SXin Li }; 66*67e74705SXin Li } 67*67e74705SXin Li 68*67e74705SXin Li namespace ThreeLayer { 69*67e74705SXin Li struct A { 70*67e74705SXin Li virtual void f(); 71*67e74705SXin Li }; 72*67e74705SXin Li 73*67e74705SXin Li struct B: A { 74*67e74705SXin Li void f(); 75*67e74705SXin Li void f(int); 76*67e74705SXin Li }; 77*67e74705SXin Li 78*67e74705SXin Li struct C: B { 79*67e74705SXin Li void f(int); 80*67e74705SXin Li using A::f; 81*67e74705SXin Li }; 82*67e74705SXin Li } 83*67e74705SXin Li 84*67e74705SXin Li namespace UnbalancedVirtual { 85*67e74705SXin Li struct Base { 86*67e74705SXin Li virtual void func(); 87*67e74705SXin Li }; 88*67e74705SXin Li 89*67e74705SXin Li struct Derived1: virtual Base { 90*67e74705SXin Li virtual void func(); 91*67e74705SXin Li }; 92*67e74705SXin Li 93*67e74705SXin Li struct Derived2: virtual Base { 94*67e74705SXin Li }; 95*67e74705SXin Li 96*67e74705SXin Li struct MostDerived: Derived1, Derived2 { 97*67e74705SXin Li void func(int); 98*67e74705SXin Li void func(); 99*67e74705SXin Li }; 100*67e74705SXin Li } 101*67e74705SXin Li 102*67e74705SXin Li namespace UnbalancedVirtual2 { 103*67e74705SXin Li struct Base { 104*67e74705SXin Li virtual void func(); 105*67e74705SXin Li }; 106*67e74705SXin Li 107*67e74705SXin Li struct Derived1: virtual Base { 108*67e74705SXin Li virtual void func(); 109*67e74705SXin Li }; 110*67e74705SXin Li 111*67e74705SXin Li struct Derived2: virtual Base { 112*67e74705SXin Li }; 113*67e74705SXin Li 114*67e74705SXin Li struct Derived3: Derived1 { 115*67e74705SXin Li virtual void func(); 116*67e74705SXin Li }; 117*67e74705SXin Li 118*67e74705SXin Li struct MostDerived: Derived3, Derived2 { 119*67e74705SXin Li void func(int); 120*67e74705SXin Li void func(); 121*67e74705SXin Li }; 122*67e74705SXin Li } 123*67e74705SXin Li 124*67e74705SXin Li namespace { 125*67e74705SXin Li class A { 126*67e74705SXin Li virtual int foo(bool) const; 127*67e74705SXin Li // expected-note@-1{{type mismatch at 1st parameter ('bool' vs 'int')}} 128*67e74705SXin Li virtual int foo(int, int) const; 129*67e74705SXin Li // expected-note@-1{{different number of parameters (2 vs 1)}} 130*67e74705SXin Li virtual int foo(int*) const; 131*67e74705SXin Li // expected-note@-1{{type mismatch at 1st parameter ('int *' vs 'int')}} 132*67e74705SXin Li virtual int foo(int) volatile; 133*67e74705SXin Li // expected-note@-1{{different qualifiers (volatile vs const)}} 134*67e74705SXin Li }; 135*67e74705SXin Li 136*67e74705SXin Li class B : public A { 137*67e74705SXin Li virtual int foo(int) const; 138*67e74705SXin Li // expected-warning@-1{{hides overloaded virtual functions}} 139*67e74705SXin Li }; 140*67e74705SXin Li } 141*67e74705SXin Li 142*67e74705SXin Li namespace { 143*67e74705SXin Li struct base { f__anon00ae9c810211::base144*67e74705SXin Li void f(char) {} 145*67e74705SXin Li }; 146*67e74705SXin Li 147*67e74705SXin Li struct derived : base { f__anon00ae9c810211::derived148*67e74705SXin Li void f(int) {} 149*67e74705SXin Li }; 150*67e74705SXin Li foo(derived & d)151*67e74705SXin Livoid foo(derived &d) { 152*67e74705SXin Li d.f('1'); // FIXME: this should warn about calling (anonymous namespace)::derived::f(int) 153*67e74705SXin Li // instead of (anonymous namespace)::base::f(char). 154*67e74705SXin Li // Note: this should be under a new diagnostic flag and eventually moved to a 155*67e74705SXin Li // new test case since it's not strictly related to virtual functions. 156*67e74705SXin Li d.f(12); // This should not warn. 157*67e74705SXin Li } 158*67e74705SXin Li } 159