[Bug fortran/55057] [OOP] wrong result with abstract type

janus at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Thu Oct 25 11:58:00 GMT 2012


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55057

--- Comment #2 from janus at gcc dot gnu.org 2012-10-25 11:58:15 UTC ---
-fdump-tree-original shows that the correct code is generated for the call to
"alt" in the main program (involving _vptr->_size):


        {
          struct __class_m_At1 class.17;
          static real(kind=4) C.2125 = 1.5e+0;
          struct __class_m_At1 class.16;
          struct __class_m_At1 class.15;

          class.15._data = (struct at1 *) aa.at2.work._data.data + (sizetype)
((aa.at2.work._data.offset + 2) * (integer(kind=8)) aa.at2.work._vptr->_size);
          class.15._vptr = aa.at2.work._vptr;
          class.16._data = (struct at1 *) aa.at2.work._data.data + (sizetype)
((aa.at2.work._data.offset + 1) * (integer(kind=8)) aa.at2.work._vptr->_size);
          class.16._vptr = aa.at2.work._vptr;
          class.17._data = (struct at1 *) aa.at2.work._data.data + (sizetype)
((aa.at2.work._data.offset + 1) * (integer(kind=8)) aa.at2.work._vptr->_size);
          class.17._vptr = aa.at2.work._vptr;
          aa.at2.work._vptr->alt (&class.15, &class.16, &C.2125, &class.17);
        }


while wrong code is generated for the call to "alt" in "sub":


sub (struct __class_m_At2 & restrict var)
{
  {
    struct __class_m_At1 class.2;
    static real(kind=4) C.1988 = 1.5e+0;
    struct __class_m_At1 class.1;
    struct __class_m_At1 class.0;

    class.0._data = &(*(struct at1[0:] * restrict)
var->_data->work._data.data)[var->_data->work._data.offset + 2];
    class.0._vptr = var->_data->work._vptr;
    class.1._data = &(*(struct at1[0:] * restrict)
var->_data->work._data.data)[var->_data->work._data.offset + 1];
    class.1._vptr = var->_data->work._vptr;
    class.2._data = &(*(struct at1[0:] * restrict)
var->_data->work._data.data)[var->_data->work._data.offset + 1];
    class.2._vptr = var->_data->work._vptr;
    var->_data->work._vptr->alt (&class.0, &class.1, &C.1988, &class.2);
  }
}



More information about the Gcc-bugs mailing list