[PATCH] D15823: Support virtual-near-miss check.

Alexander Kornienko via cfe-commits cfe-commits at lists.llvm.org
Fri Jan 1 04:08:23 PST 2016


alexfh added inline comments.

================
Comment at: clang-tidy/misc/VirtualNearMissCheck.cpp:85
@@ +84,3 @@
+  }else {
+    return false;
+  }
----------------
congliu wrote:
> alexfh wrote:
> > What if both return types are not references and are not pointers? Why do you return `false` in this case?
> This is to deal with an special case of C++ override. Usually the return type of the override and overriden should be the same. The exception is that the return type ban be a reference (or pointer) to the class themselves. For example, 
>   class Base{
>     virtual Base* func();
>   };
>   class Derived : Base{
>     virtual Derived* func();
>   };
> In this case, the Derived::func() does override Base::func(), even though the return type are not the same.
> So if the return types are not the same (line 72 assured that), and are not both references (or pointers), we can rule out the possibility of override, and therefore return false.
It looks like you're talking about the concept of covariance described in [class.virtual] p7. And you seem to be getting it wrong: the return type doesn't need to be a pointer/reference to the class defining the method. Here's the relevant quote from the standard:

> The return type of an overriding function shall be either identical to the return type of the overridden
> function or covariant with the classes of the functions. If a function D::f overrides a function B::f, the
> return types of the functions are covariant if they satisfy the following criteria:
> — both are pointers to classes, both are lvalue references to classes, or both are rvalue references to
> classes115
> — the class in the return type of B::f is the same class as the class in the return type of D::f, or is an
> unambiguous and accessible direct or indirect base class of the class in the return type of D::f
> — both pointers or references have the same cv-qualification and the class type in the return type of D::f
> has the same cv-qualification as or less cv-qualification than the class type in the return type of B::f.

Please change your code to implement this concept correctly.


http://reviews.llvm.org/D15823





More information about the cfe-commits mailing list