1 | // RUN: %clang_cc1 -fsyntax-only -triple %itanium_abi_triple -verify %s -std=c++11 |
2 | // RUN: %clang_cc1 -fsyntax-only -triple %ms_abi_triple -verify %s -std=c++11 |
3 | namespace T1 { |
4 | |
5 | class A { |
6 | virtual int f(); // expected-note{{overridden virtual function is here}} |
7 | }; |
8 | |
9 | class B : A { |
10 | virtual void f(); // expected-error{{virtual function 'f' has a different return type ('void') than the function it overrides (which has return type 'int')}} |
11 | }; |
12 | |
13 | } |
14 | |
15 | namespace T2 { |
16 | |
17 | struct a { }; |
18 | struct b { }; |
19 | |
20 | class A { |
21 | virtual a* f(); // expected-note{{overridden virtual function is here}} |
22 | }; |
23 | |
24 | class B : A { |
25 | virtual b* f(); // expected-error{{return type of virtual function 'f' is not covariant with the return type of the function it overrides ('T2::b *' is not derived from 'T2::a *')}} |
26 | }; |
27 | |
28 | } |
29 | |
30 | namespace T3 { |
31 | |
32 | struct a { }; |
33 | struct b : private a { }; // expected-note{{declared private here}} |
34 | |
35 | class A { |
36 | virtual a* f(); // FIXME: desired-note{{overridden virtual function is here}} |
37 | }; |
38 | |
39 | class B : A { |
40 | virtual b* f(); // expected-error{{invalid covariant return for virtual function: 'T3::a' is a private base class of 'T3::b'}} |
41 | }; |
42 | |
43 | } |
44 | |
45 | namespace T4 { |
46 | |
47 | struct a { }; |
48 | struct a1 : a { }; |
49 | struct b : a, a1 { }; // expected-warning{{direct base 'T4::a' is inaccessible due to ambiguity:\n struct T4::b -> struct T4::a\n struct T4::b -> struct T4::a1 -> struct T4::a}} |
50 | |
51 | class A { |
52 | virtual a* f(); // expected-note{{overridden virtual function is here}} |
53 | }; |
54 | |
55 | class B : A { |
56 | virtual b* f(); // expected-error{{return type of virtual function 'f' is not covariant with the return type of the function it overrides (ambiguous conversion from derived class 'T4::b' to base class 'T4::a':\n\ |
57 | struct T4::b -> struct T4::a\n\ |
58 | struct T4::b -> struct T4::a1 -> struct T4::a)}} |
59 | }; |
60 | |
61 | } |
62 | |
63 | namespace T5 { |
64 | |
65 | struct a { }; |
66 | |
67 | class A { |
68 | virtual a* const f(); |
69 | virtual a* const g(); // expected-note{{overridden virtual function is here}} |
70 | }; |
71 | |
72 | class B : A { |
73 | virtual a* const f(); |
74 | virtual a* g(); // expected-error{{return type of virtual function 'g' is not covariant with the return type of the function it overrides ('T5::a *' has different qualifiers than 'T5::a *const')}} |
75 | }; |
76 | |
77 | } |
78 | |
79 | namespace T6 { |
80 | |
81 | struct a { }; |
82 | |
83 | class A { |
84 | virtual const a* f(); |
85 | virtual a* g(); // expected-note{{overridden virtual function is here}} |
86 | }; |
87 | |
88 | class B : A { |
89 | virtual a* f(); |
90 | virtual const a* g(); // expected-error{{return type of virtual function 'g' is not covariant with the return type of the function it overrides (class type 'const T6::a *' is more qualified than class type 'T6::a *'}} |
91 | }; |
92 | |
93 | } |
94 | |
95 | namespace T7 { |
96 | struct a { }; |
97 | struct b { }; |
98 | |
99 | class A { |
100 | a* f(); |
101 | }; |
102 | |
103 | class B : A { |
104 | virtual b* f(); |
105 | }; |
106 | } |
107 | |
108 | namespace T8 { |
109 | struct a { }; |
110 | struct b; // expected-note {{forward declaration of 'T8::b'}} |
111 | |
112 | class A { |
113 | virtual a *f(); |
114 | }; |
115 | |
116 | class B : A { |
117 | b* f(); // expected-error {{return type of virtual function 'f' is not covariant with the return type of the function it overrides ('T8::b' is incomplete)}} |
118 | }; |
119 | } |
120 | |
121 | namespace T9 { |
122 | struct a { }; |
123 | |
124 | template<typename T> struct b : a { |
125 | int a[sizeof(T) ? -1 : -1]; // expected-error {{array with a negative size}} |
126 | }; |
127 | |
128 | class A { |
129 | virtual a *f(); |
130 | }; |
131 | |
132 | class B : A { |
133 | virtual b<int> *f(); // expected-note {{in instantiation of template class 'T9::b<int>' requested here}} |
134 | }; |
135 | } |
136 | |
137 | // PR5656 |
138 | class X0 { |
139 | virtual void f0(); |
140 | }; |
141 | class X1 : public X0 { |
142 | void f0() = 0; |
143 | }; |
144 | |
145 | template <typename Base> |
146 | struct Foo : Base { |
147 | void f(int) = 0; // expected-error{{not virtual and cannot be declared pure}} |
148 | }; |
149 | |
150 | struct Base1 { virtual void f(int); }; |
151 | struct Base2 { }; |
152 | |
153 | void test() { |
154 | (void)sizeof(Foo<Base1>); |
155 | (void)sizeof(Foo<Base2>); // expected-note{{instantiation}} |
156 | } |
157 | |
158 | template<typename Base> |
159 | struct Foo2 : Base { |
160 | template<typename T> int f(T); |
161 | }; |
162 | |
163 | void test2() { |
164 | Foo2<Base1> f1; |
165 | Foo2<Base2> f2; |
166 | f1.f(17); |
167 | f2.f(17); |
168 | }; |
169 | |
170 | struct Foo3 { |
171 | virtual void f(int) = 0; // expected-note{{unimplemented pure virtual method}} |
172 | }; |
173 | |
174 | template<typename T> |
175 | struct Bar3 : Foo3 { |
176 | void f(T); |
177 | }; |
178 | |
179 | void test3() { |
180 | Bar3<int> b3i; // okay |
181 | Bar3<float> b3f; // expected-error{{is an abstract class}} |
182 | } |
183 | |
184 | // 5920 |
185 | namespace PR5920 { |
186 | class Base {}; |
187 | |
188 | template <typename T> |
189 | class Derived : public Base {}; |
190 | |
191 | class Foo { |
192 | public: |
193 | virtual Base* Method(); |
194 | }; |
195 | |
196 | class Bar : public Foo { |
197 | public: |
198 | virtual Derived<int>* Method(); |
199 | }; |
200 | } |
201 | |
202 | // Look through template types and typedefs to see whether return types are |
203 | // pointers or references. |
204 | namespace PR6110 { |
205 | class Base {}; |
206 | class Derived : public Base {}; |
207 | |
208 | typedef Base* BaseP; |
209 | typedef Derived* DerivedP; |
210 | |
211 | class X { virtual BaseP f(); }; |
212 | class X1 : public X { virtual DerivedP f(); }; |
213 | |
214 | template <typename T> class Y { virtual T f(); }; |
215 | template <typename T1, typename T> class Y1 : public Y<T> { virtual T1 f(); }; |
216 | Y1<Derived*, Base*> y; |
217 | } |
218 | |
219 | // Defer checking for covariance if either return type is dependent. |
220 | namespace type_dependent_covariance { |
221 | struct B {}; |
222 | template <int N> struct TD : public B {}; |
223 | template <> struct TD<1> {}; |
224 | |
225 | template <int N> struct TB {}; |
226 | struct D : public TB<0> {}; |
227 | |
228 | template <int N> struct X { |
229 | virtual B* f1(); // expected-note{{overridden virtual function is here}} |
230 | virtual TB<N>* f2(); // expected-note{{overridden virtual function is here}} |
231 | }; |
232 | template <int N, int M> struct X1 : X<N> { |
233 | virtual TD<M>* f1(); // expected-error{{return type of virtual function 'f1' is not covariant with the return type of the function it overrides ('TD<1> *'}} |
234 | virtual D* f2(); // expected-error{{return type of virtual function 'f2' is not covariant with the return type of the function it overrides ('type_dependent_covariance::D *' is not derived from 'TB<1> *')}} |
235 | }; |
236 | |
237 | X1<0, 0> good; |
238 | X1<0, 1> bad_derived; // expected-note{{instantiation}} |
239 | X1<1, 0> bad_base; // expected-note{{instantiation}} |
240 | } |
241 | |
242 | namespace T10 { |
243 | struct A { }; |
244 | struct B : A { }; |
245 | |
246 | struct C { |
247 | virtual A&& f(); |
248 | }; |
249 | |
250 | struct D : C { |
251 | virtual B&& f(); |
252 | }; |
253 | }; |
254 | |
255 | namespace T11 { |
256 | struct A { }; |
257 | struct B : A { }; |
258 | |
259 | struct C { |
260 | virtual A& f(); // expected-note {{overridden virtual function is here}} |
261 | }; |
262 | |
263 | struct D : C { |
264 | virtual B&& f(); // expected-error {{virtual function 'f' has a different return type ('T11::B &&') than the function it overrides (which has return type 'T11::A &')}} |
265 | }; |
266 | }; |
267 | |
268 | namespace T12 { |
269 | struct A { }; |
270 | struct B : A { }; |
271 | |
272 | struct C { |
273 | virtual A&& f(); // expected-note {{overridden virtual function is here}} |
274 | }; |
275 | |
276 | struct D : C { |
277 | virtual B& f(); // expected-error {{virtual function 'f' has a different return type ('T12::B &') than the function it overrides (which has return type 'T12::A &&')}} |
278 | }; |
279 | }; |
280 | |
281 | namespace PR8168 { |
282 | class A { |
283 | public: |
284 | virtual void foo() {} // expected-note{{overridden virtual function is here}} |
285 | }; |
286 | |
287 | class B : public A { |
288 | public: |
289 | static void foo() {} // expected-error{{'static' member function 'foo' overrides a virtual function}} |
290 | }; |
291 | } |
292 | |