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