[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