xref: /aosp_15_r20/external/clang/test/SemaCXX/warn-overloaded-virtual.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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 Li void 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 Li void 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