On 23.01.21 10:04, Paul Richard Thomas via Fortran wrote:

This is a relatively obvious patch. The chunk in trans-array.c is not part
of the fix for the PR but does suppress some of the bad dtype's that arise
from allocation of class objects.
Do you have a testcase for it? Either behavioral (dg-do run) or based on
the tree-dump + scan? I think it would be useful to ensure that, even if
it is not part of the PR – and hence the testcase. (At least it does not
look as if the testcase goes beyond the PR.)
The part in trans-stmt.c provides vptrs
for all class allocations if the expression3 is available.

[...]

        /* Set the vptr only when no source= is set.  When source= is set, then
       the trans_assignment below will set the vptr.  */
-      if (al_vptr != NULL_TREE && (!code->expr3 || code->expr3->mold))
+      if (al_vptr != NULL_TREE && (!code->expr3 || code->expr3->mold
+                                || code->expr3->ts.type == BT_CLASS))

First, the comment needs to be updated as the branch is also called in some
cases for 'source='.

Additionally, I wonder whether there is the any issue with this and code
along the line of the following (here for scalars, but arrays might cause
additional issues):

type t
end type t
class(t), allocatable :: cx
type(t), allocatable :: ty

allocate(ty, source=cx)
end

Where 'source=' is polymorphic – but the allocated variable is not.
Already without your patch, I see:
  ty = (struct t *) __builtin_malloc (MAX_EXPR <(unsigned long) cx._vptr->_size, 
1>);
which may allocate too much. vptr is not set (obviously)
and __vtab_MAIN___T._copy (cx._data, ty); looks fine.

Thus, with the current code, the main issue seems to be only overallocation.

And doing with the code above
  ty = cx
will currently ICE in gfc_allocate_using_malloc (called by 
trans_class_assignment).

I do not quite see whether those are separate issues or whether they are made
worse (or better?) by your patch.

Tobias

-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstraße 201, 80634 München / Germany
Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Alexander 
Walter

Reply via email to