------- Comment #1 from mikael at gcc dot gnu dot org 2009-01-18 20:40 -------
I suspect the following is invalid as the arguments to the defined assignment
alias.
WHERE(LDA)
TLA2L = TLA2L(1:3,1:2)%L !removing this line fixes problem
TLA2L = TLA2L(1:3,1:2)%I
ELSEWHERE
TLA2L = -1
ENDWHERE
However, the following is valid (I think):
module m
type t
integer :: i,j
end type t
interface assignment (=)
procedure i_to_t
end interface
contains
elemental subroutine i_to_t (p, q)
type(t), intent(out) :: p
integer, intent(in) :: q
p%i = q
end subroutine
end module
use m
type(t), target :: a(3)
type(t), target :: b(3)
type(t), dimension(:), pointer :: p
logical :: l(3)
a%i = 1
a%j = 2
b%i = 3
b%j = 4
p => b
l = .true.
where (l)
a = p%i
end where
print *, a%j
end
The output I get is:
32758 32758 0
instead of:
2 2 2
The problem is that we create a temporary for the defined assignment, but we
don't copy the values of the lhs (before calling the function) to it as they
will be overwritten by the rhs's ones. However, if the assignment function
doesn't set all the members of the derived type, the unset members keep the
values of the temporary, and are copied to the lhs.
Thus, confirmed
--
mikael at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Ever Confirmed|0 |1
Keywords| |wrong-code
Last reconfirmed|0000-00-00 00:00:00 |2009-01-18 20:40:05
date| |
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38863