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