[Bug fortran/50981] [4.4/4.5/4.6 Regression] Wrong-code for scalarizing ELEMENTAL call with absent OPTIONAL argument

burnus at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Tue Jan 10 23:56:00 GMT 2012


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

--- Comment #17 from Tobias Burnus <burnus at gcc dot gnu.org> 2012-01-10 23:54:50 UTC ---
(In reply to comment #16)
> This patch passes gfortran.dg/*elemental*, but fails on
> gfortran.dg/class_array_{1,2,3,7,9}.f03.

The problem is the way _copy is translated. One currently has in trans-stmt.c's
gfc_trans_allocate

              /* Do a polymorphic deep copy.  */
              actual->next->expr->ts.type = BT_CLASS;
              gfc_add_data_component (actual->next->expr);

This adds "class._data". With the patch of comment 16 one has now additionally
in trans-expr.c's gfc_conv_procedure_call:

+         if (fsym && fsym->ts.type == BT_DERIVED && e->ts.type == BT_CLASS)
+           parmse.expr = gfc_class_data_get (parmse.expr);

If one removes the latter it works.

I think the proper solution is to remove the trans-stmt.c manual scalarization
and handle somewhere in trans-{array,expr}.c the array bounds.

Stupid attempts fail for various reasons: Changing the BT_CLASS to BT_DERIVED
in gfc_trans_allocate does not work as one the offsets will no longer be
class._size (why?). Keeping BT_CLASS but removing the gfc_add_data_component in
trans-stmt.c will ICE for dataref - and removing that as well will lead to
valid code with class._size, but without scalarization loop ...



More information about the Gcc-bugs mailing list