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);

  }

}

Reply via email to