Covariant return clarification
    Mark Mitchell 
    mark at codesourcery.com
       
    Fri Jan  3 21:06:07 UTC 2003
    
    
  
The ABI specification, at present, implies that given
  struct A {};
  struct B : public A {};
  struct X {  
    virtual A* f();
  };
  struct Y : public X {
    virtual B* f();
  };
Y::f is to be considered covariant with respect to X::f, i.e., that
"B*" and "A*" are "substantively different".
This is an oversight; clearly there is no conversion required to
convert form B* to A* and there is therefore no need for a thunk in
that situation.
I've improved the wording below.
--
Mark Mitchell                   mark at codesourcery.com
CodeSourcery, LLC               http://www.codesourcery.com
Index: abi.html
===================================================================
RCS file: /usr/local/Repository/cxx-abi/abi.html,v
retrieving revision 1.58
diff -c -5 -p -r1.58 abi.html
*** abi.html	31 Dec 2002 19:56:24 -0000	1.58
--- abi.html	3 Jan 2003 18:21:32 -0000
*************** two conditions holds:
*** 1250,1261 ****
       in the virtual table, but the return type of the overrider is
       substantively different from the return type of the function(s)
       already present.  If the return types are different, they are
       both pointer-to-class types, or both reference-to-class types.
       Let B and D denote the classes, where D is derived from B.  The
!      types are substantively different if B is a virtual base or is
!      not an indirect primary base of D.
  </ul>
  
  <p>
  <img src=warning.gif alt="<b>NOTE</b>:">
  <i>
--- 1250,1261 ----
       in the virtual table, but the return type of the overrider is
       substantively different from the return type of the function(s)
       already present.  If the return types are different, they are
       both pointer-to-class types, or both reference-to-class types.
       Let B and D denote the classes, where D is derived from B.  The
!      types are substantively different if B is a morally virtual base of D 
!      or if B is not located at offset zero in D.
  </ul>
  
  <p>
  <img src=warning.gif alt="<b>NOTE</b>:">
  <i>
*************** unwind table location.
*** 4939,4948 ****
--- 4939,4952 ----
  
  <p> <hr> <p>
  <a name=revisions>
  <h2> Appendix R: Revision History </h2>
  <p> <hr> <p>
+ 
+ <p>
+ <font color=blue>[030103]</font>
+ Clarify definition of substantively different types.
  
  <p>
  <font color=blue>[021222]</font>
  Document mangling for anonymous unions.
  
    
    
More information about the cxx-abi-dev
mailing list