Compile the following example with -xalias=ftnpointer
parameter (n=20)
integer, pointer :: a(:)
integer, target :: t(n)
interface
subroutine sub(a,b,n)
integer, pointer :: a(:)
integer, pointer :: b(:)
end subroutine
end interface
a => t
a = (/ (i, i=1,n) /)
call sub(a,a,n)
....
end
subroutine sub(a,b,n)
integer, pointer :: a(:)
real, pointer :: b(:)
integer i, mold
forall (i=2:n)
a(i) = transfer(b(i-1), mold)
The compiler must assume that a and b can overlap.
|
Note that in this example the compiler must assume that a and b may overlap, even though they point to data of different data types. This is illegal in standard Fortran. The compiler gives a warning if it can detect this situation.