In the following test, the main program passes substrings from a character array, via the explicit interface of sub1. Sub1 then passes on its input array to sub2 via an implicit interface. I test two variations of the actual argument in the call statements for sub2:
! Version string14.f90, 2012-feb-21
subroutine sub2 (s2)
character(len=*) s2(*)
print "(' ""', a, '""')", s2(1:4)
end subroutine sub2
module mod1
contains
subroutine sub1 (s1)
character(len=*), intent(in) :: s1(:)
print *, 'len (s1) = ', len (s1)
print *, 'shape (s1) = ', shape (s1)
print *, 'Pass by reference to whole array:'
call sub2 (s1)
print *, 'Pass by reference to first array element:'
call sub2 (s1(1))
end subroutine sub1
end module mod1
program str_test
use mod1
character(len=3) s(4)
s = (/ '123', '456', '789', 'ABC' /)
call sub1 (s(:)(1:2))
end program str_test
I would expect to get the same results either way, by sequence association, but there is a surprise:
mac56:~/bugs/string-array 83> ifort string14.f90 mac56:~/bugs/string-array 84> ./a.out len (s1) = 2 shape (s1) = 4 Pass by reference to whole array: "12" "45" "78" "AB" Pass by reference to first array element: "12" "34" "56" "78"
Is this valid Fortran? Is this a compiler bug?
I get the same results with two versions of Intel Fortran. On Mac OS 10.6.8:
Intel Fortran Intel 64 Compiler Professional for applications running on Intel 64, Version 11.1 Build 20100806 Package ID: m_cprof_p_11.1.089
On Mac OS 10.7.3 (Lion):
Intel Fortran Intel 64 Compiler XE for applications running on Intel 64, Version 12.1.1.246 Build 20111011
Also note that the following compilers get the "right" answer:
gfortran version 4.5.2 on Mac
pgf90 version 8.0-2 on Linux
And Sun Fortran 95 version 8.3 on Linux gets the "wrong" answer, same as Intel Fortran.
Thanks for any insights about this.
--Dave A.





