http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46262
janus at gcc dot gnu.org changed:
What |Removed |Added
----------------------------------------------------------------------------
Summary|[4.6 Regression] [OOP] tree |[OOP] tree check: expected
|check: expected |function_type or
|function_type or |method_type, have
|method_type, have |pointer_type
|pointer_type |
--- Comment #9 from janus at gcc dot gnu.org 2011-01-05 09:33:56 UTC ---
(In reply to comment #1)
> -fdump-tree-original shows wrong code being generated:
>
>
> struct class$integrable_model_a <T3f8> (struct class$integrable_model &
> restrict) D.1529;
> static real(kind=4) C.1528 = 2.0e+0;
> struct class$integrable_model_a D.1527;
>
> D.1527 = d_dt ((struct class$integrable_model *) model);
> D.1529 = d_dt (&D.1527, &C.1528);
> _gfortran_transfer_real_write (&dt_parm.0, &D.1529, 4);
>
>
> The second call to "d_dt" should actually be a call to
> "D.1527->$vptr->multiply".
Note that 4.5 also produces wrong code here:
real(kind=4) D.1560;
static real(kind=4) C.1559 = 2.0e+0;
struct .class.integrable_model.a D.1558;
D.1558 = d_dt ((struct .class.integrable_model *) model);
D.1560 = multiply (&D.1558, &C.1559);
_gfortran_transfer_real (&dt_parm.0, &D.1560, 4);
It has a static call to 'multiply', instead of a polymorphic call via the vptr.
So, since 4.5 also does not handle the test case correctly, I think it's fair
to remove the "regression" tag.
In a way one could even argue that the ICE in 4.6 is an improvement over 4.5
silently giving wrong results for such cases, since the user does at least get
*some* error message (even though a crude and uninformative one), instead of
assuming the feature was supported and getting wrong results in the end!