xref: /aosp_15_r20/external/clang/test/CXX/class.derived/class.virtual/p3-0x.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s
2*67e74705SXin Li 
3*67e74705SXin Li namespace Test1 {
4*67e74705SXin Li 
5*67e74705SXin Li struct B {
6*67e74705SXin Li   virtual void f(int);
7*67e74705SXin Li };
8*67e74705SXin Li 
9*67e74705SXin Li struct D : B {
10*67e74705SXin Li   virtual void f(long) override; // expected-error {{'f' marked 'override' but does not override any member functions}}
11*67e74705SXin Li   void f(int) override;
12*67e74705SXin Li };
13*67e74705SXin Li }
14*67e74705SXin Li 
15*67e74705SXin Li namespace Test2 {
16*67e74705SXin Li 
17*67e74705SXin Li struct A {
18*67e74705SXin Li   virtual void f(int, char, int);
19*67e74705SXin Li };
20*67e74705SXin Li 
21*67e74705SXin Li template<typename T>
22*67e74705SXin Li struct B : A {
23*67e74705SXin Li   // FIXME: Diagnose this.
24*67e74705SXin Li   virtual void f(T) override;
25*67e74705SXin Li };
26*67e74705SXin Li 
27*67e74705SXin Li template<typename T>
28*67e74705SXin Li struct C : A {
29*67e74705SXin Li   virtual void f(int) override; // expected-error {{does not override}}
30*67e74705SXin Li };
31*67e74705SXin Li 
32*67e74705SXin Li }
33*67e74705SXin Li 
34*67e74705SXin Li namespace Test3 {
35*67e74705SXin Li 
36*67e74705SXin Li struct A {
37*67e74705SXin Li   virtual void f(int, char, int);
38*67e74705SXin Li };
39*67e74705SXin Li 
40*67e74705SXin Li template<typename... Args>
41*67e74705SXin Li struct B : A {
42*67e74705SXin Li   virtual void f(Args...) override; // expected-error {{'f' marked 'override' but does not override any member functions}}
43*67e74705SXin Li };
44*67e74705SXin Li 
45*67e74705SXin Li template struct B<int, char, int>;
46*67e74705SXin Li template struct B<int>; // expected-note {{in instantiation of template class 'Test3::B<int>' requested here}}
47*67e74705SXin Li 
48*67e74705SXin Li }
49*67e74705SXin Li 
50*67e74705SXin Li namespace Test4 {
51*67e74705SXin Li struct B {
52*67e74705SXin Li   virtual void f() const final; // expected-note {{overridden virtual function is here}}
53*67e74705SXin Li };
54*67e74705SXin Li 
55*67e74705SXin Li struct D : B {
56*67e74705SXin Li   void f() const; // expected-error {{declaration of 'f' overrides a 'final' function}}
57*67e74705SXin Li };
58*67e74705SXin Li 
59*67e74705SXin Li }
60*67e74705SXin Li 
61*67e74705SXin Li namespace PR13499 {
62*67e74705SXin Li   struct X {
63*67e74705SXin Li     virtual void f();
64*67e74705SXin Li     virtual void h();
65*67e74705SXin Li   };
66*67e74705SXin Li   template<typename T> struct A : X {
67*67e74705SXin Li     void f() override;
68*67e74705SXin Li     void h() final;
69*67e74705SXin Li   };
70*67e74705SXin Li   template<typename T> struct B : X {
71*67e74705SXin Li     void g() override; // expected-error {{only virtual member functions can be marked 'override'}}
72*67e74705SXin Li     void i() final; // expected-error {{only virtual member functions can be marked 'final'}}
73*67e74705SXin Li   };
74*67e74705SXin Li   B<int> b; // no-note
75*67e74705SXin Li   template<typename T> struct C : T {
76*67e74705SXin Li     void g() override;
77*67e74705SXin Li     void i() final;
78*67e74705SXin Li   };
79*67e74705SXin Li   template<typename T> struct D : X {
80*67e74705SXin Li     virtual void g() override; // expected-error {{does not override}}
81*67e74705SXin Li     virtual void i() final;
82*67e74705SXin Li   };
83*67e74705SXin Li   template<typename...T> struct E : X {
84*67e74705SXin Li     void f(T...) override;
85*67e74705SXin Li     void g(T...) override; // expected-error {{only virtual member functions can be marked 'override'}}
86*67e74705SXin Li     void h(T...) final;
87*67e74705SXin Li     void i(T...) final; // expected-error {{only virtual member functions can be marked 'final'}}
88*67e74705SXin Li   };
89*67e74705SXin Li   // FIXME: Diagnose these in the template definition, not in the instantiation.
90*67e74705SXin Li   E<> e; // expected-note {{in instantiation of}}
91*67e74705SXin Li 
92*67e74705SXin Li   template<typename T> struct Y : T {
93*67e74705SXin Li     void f() override;
94*67e74705SXin Li     void h() final;
95*67e74705SXin Li   };
96*67e74705SXin Li   template<typename T> struct Z : T {
97*67e74705SXin Li     void g() override; // expected-error {{only virtual member functions can be marked 'override'}}
98*67e74705SXin Li     void i() final; // expected-error {{only virtual member functions can be marked 'final'}}
99*67e74705SXin Li   };
100*67e74705SXin Li   Y<X> y;
101*67e74705SXin Li   Z<X> z; // expected-note {{in instantiation of}}
102*67e74705SXin Li }
103*67e74705SXin Li 
104*67e74705SXin Li namespace MemberOfUnknownSpecialization {
105*67e74705SXin Li   template<typename T> struct A {
106*67e74705SXin Li     struct B {};
107*67e74705SXin Li     struct C : B {
108*67e74705SXin Li       void f() override;
109*67e74705SXin Li     };
110*67e74705SXin Li   };
111*67e74705SXin Li 
112*67e74705SXin Li   template<> struct A<int>::B {
113*67e74705SXin Li     virtual void f();
114*67e74705SXin Li   };
115*67e74705SXin Li   // ok
116*67e74705SXin Li   A<int>::C c1;
117*67e74705SXin Li 
118*67e74705SXin Li   template<> struct A<char>::B {
119*67e74705SXin Li     void f();
120*67e74705SXin Li   };
121*67e74705SXin Li   // expected-error@-13 {{only virtual member functions can be marked 'override'}}
122*67e74705SXin Li   // expected-note@+1 {{in instantiation of}}
123*67e74705SXin Li   A<char>::C c2;
124*67e74705SXin Li 
125*67e74705SXin Li   template<> struct A<double>::B {
126*67e74705SXin Li     virtual void f() final;
127*67e74705SXin Li   };
128*67e74705SXin Li   // expected-error@-20 {{declaration of 'f' overrides a 'final' function}}
129*67e74705SXin Li   // expected-note@-3 {{here}}
130*67e74705SXin Li   // expected-note@+1 {{in instantiation of}}
131*67e74705SXin Li   A<double>::C c3;
132*67e74705SXin Li }
133*67e74705SXin Li 
134*67e74705SXin Li namespace DiagnosticsQOI {
135*67e74705SXin Li   struct X {
136*67e74705SXin Li     virtual ~X();
137*67e74705SXin Li     virtual void foo(int x); // expected-note {{hidden overloaded virtual function}}
138*67e74705SXin Li     virtual void bar(int x); // expected-note 2 {{hidden overloaded virtual function}}
139*67e74705SXin Li     virtual void bar(float x); // expected-note 2 {{hidden overloaded virtual function}}
140*67e74705SXin Li   };
141*67e74705SXin Li 
142*67e74705SXin Li   struct Y : X {
143*67e74705SXin Li     void foo(int x, int y) override; // expected-error {{non-virtual member function marked 'override' hides virtual member function}}
144*67e74705SXin Li     void bar(double) override; // expected-error {{non-virtual member function marked 'override' hides virtual member functions}}
145*67e74705SXin Li     void bar(long double) final; // expected-error {{non-virtual member function marked 'final' hides virtual member functions}}
146*67e74705SXin Li   };
147*67e74705SXin Li 
148*67e74705SXin Li   template<typename T>
149*67e74705SXin Li   struct Z : T {
150*67e74705SXin Li     static void foo() override; // expected-error {{only virtual member functions can be marked 'override'}}
151*67e74705SXin Li   };
152*67e74705SXin Li }
153