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

--- Comment #80 from Tobias Burnus <burnus at gcc dot gnu.org> 2012-08-01 
16:22:52 UTC ---
(In reply to comment #79)
> >         this%y = this%find_y()  ! FAILS
> > 
> > the lhs is a target, and the rhs is NOT a target, so that the middle-end 
> > types
> > are different. :-(
> 
> But how can this be a valid fortran program?  You assign something
> that is not aliased to something that suddenly makes it aliased?
> If that's valid then you can make the middle-end happy by wrapping
> the RHS inside a VIEW_CONVERT_EXPR with the LHS type.

I have not closely looked at the dump, however,
  this%y = this%find_y()
means that one assigns component-wise the values from the RHS to the LHS; if
there are pointer components, the pointer address is assigned; if there are
allocatable components, those are - if needed - first (re)allocated and then
(element-wise) assigned.

Thus, one only assigns the values and no pointers - and, hence, the RHS can be
a nontarget while the LHS can be a target.

In this example, "this%y" is a derived type with an allocatable-array
component. I think the current algorithm is something like:

  *dst = *src;
  if (src->data)
    {
      (re)allocate dst->data
      memcpy (dst->data, src->data);
    }

Thus, one first transfers the pointer address [besides the array bounds], but
if "data" is not NULL, the data is copied. Thus, it should be safe - but an
ARRAY_RANGE_REF could be nicer than a memcpy, and the VIEW_CONVERT_EXPR could
be inserted.

Reply via email to