================
@@ -289,3 +289,29 @@ namespace PR8168 {
     static void foo() {} // expected-error{{'static' member function 'foo' 
overrides a virtual function}}
   };
 }
+
+namespace T13 {
+  class A {
+  public:
+    virtual const int* foo(); // expected-note{{overridden virtual function is 
here}}
+  };
+
+  class B: public A {
+  public:
+    virtual int* foo(); // expected-error{{return type of virtual function 
'foo' is not covariant with the return type of the function it overrides ('int 
*' has different qualifiers than 'const int *')}}
+  };
+}
+
+namespace T14 {
+  struct a {};
+
+  class A {
+  public:
+    virtual const a* foo(); // expected-note{{overridden virtual function is 
here}}
+  };
+
+  class B: public A {
+  public:
+    virtual volatile a* foo(); // expected-error{{return type of virtual 
function 'foo' is not covariant with the return type of the function it 
overrides (class type 'volatile a *' is more qualified than class type 'const a 
*')}}
----------------
ecnelises wrote:

Hmm, right, we can't say `volatile` is more qualified than `const` or not. But 
`virtual volatile a* foo(); ... virtual a* foo() override;` is acceptable as 
long as `a` is a class-type, so saying `has different qualifiers` also looks 
inaccurate.

https://github.com/llvm/llvm-project/pull/71696
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to