[J3] Changing address of an allocatable on assignment when shapes match
Malcolm Cohen
malcolm at nag-j.co.jp
Fri Aug 23 20:10:30 EDT 2019
It is conforming to do the reallocation in the sample program. Actually, the sample program is not conforming, as it uses a nonstandard intrinsic, so technically it’s okay to do anything.
In general, it would not be conforming to do the reallocation if the allocatable array has the TARGET attribute, as this would break the Fortran pointer association semantics.
If LOC( X ) is merely shorthand for TRANSFER(C_LOC( X ),0), the TARGET attribute is necessary anyway to make the program conforming.
Cheers,
From: Steve Lionel via J3
Sent: Saturday, August 24, 2019 6:59 AM
To: fortran standards email list for J3
Cc: Steve Lionel
Subject: [J3] Changing address of an allocatable on assignment when shapes match
In
https://stackoverflow.com/questions/57606191/memory-location-of-fortran-allocatable-arrays-on-assigment
a user asks when the storage location of an allocatable array can change
during intrinsic assignment. I responded that if the shapes (or lengths,
or in the case of polymorphic, kinds) don't match, the variable is
deallocated and then reallocated to match the expression. But if
everything matches, is it conforming to do a reallocation anyway?
According to the user, Sun/Oracle Fortran Studio 12.6 (this may not be a
current version) does the reallocate even if the shapes match (but
doesn't in assignment to S(:). I could imagine that an implementor might
do this to avoid copying data twice in case of an overlap, but it feels
wrong to me. Other compilers I tried don't reallocate under these
conditions. Also, the user reports that adding the TARGET attribute
disables the reallocation.
What are people's thoughts on this - is it ok by the standard, even if a
bit weird?
Steve
program test
implicit none
real, dimension(:), allocatable :: S
integer :: i, idx(7) = [1,3,5,7,2,4,6]
allocate(S(size(idx)))
do i=1,size(S)
S(i) = i*i
end do
write(6,*) S
write(6,*) loc(S)
S = S(idx)
write(6,*) S
write(6,*) loc(S)
S(:) = S(idx)
write(6,*) S
write(6,*) loc(S)
deallocate(S)
end program
$ sunf90 -V
f90: Studio 12.6 Fortran 95 8.8 Linux_i386 2017/05/30
$ sunf90 test.f90 ; ./a.out
1.0 4.0 9.0 16.0 25.0 36.0 49.0
37518752
1.0 9.0 25.0 49.0 4.0 16.0 36.0
37519840
1.0 25.0 4.0 36.0 9.0 49.0 16.0
37519840
Disclaimer
The Numerical Algorithms Group Ltd is a company registered in England and Wales with company number 1249803. The registered office is: Wilkinson House, Jordan Hill Road, Oxford OX2 8DR, United Kingdom. Please see our Privacy Notice for information on how we process personal data and for details of how to stop or limit communications from us.
This e-mail has been scanned for all viruses and malware, and may have been automatically archived by Mimecast Ltd, an innovator in Software as a Service (SaaS) for business.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.j3-fortran.org/pipermail/j3/attachments/20190824/bcc89f15/attachment.html>
More information about the J3
mailing list