Could you please examine the code below. The code constructs an array of structures, where the structure contains an array of integers. The code then attempts to pass the first element of each structure's array into an array in a subroutine - this step fails. It appears as though the memory locations being accessed to generate the temporary array in the subroutine has an incorrect stride. The stride appears to be 1, instead of the size of the structure.
The code appears to run correctly when compiled with SGI and Cray compilers. Results are: ------------ Results when compiled with gfc compiler: Original: 1 11 21 Original: 2 12 22 Original: 3 13 23 Original: 4 14 24 Original: 5 15 25 Added 100 to a(1): 101 102 103 Added 100 to a(1): 104 105 22 Added 100 to a(1): 3 13 23 Added 100 to a(1): 4 14 24 Added 100 to a(1): 5 15 25 Results when compiled with SGI compiler, or Cray compiler: Original: 1, 11, 21 Original: 2, 12, 22 Original: 3, 13, 23 Original: 4, 14, 24 Original: 5, 15, 25 Added 100 to a(1): 101, 11, 21 Added 100 to a(1): 102, 12, 22 Added 100 to a(1): 103, 13, 23 Added 100 to a(1): 104, 14, 24 Added 100 to a(1): 105, 15, 25 Code is: -------- program test_f90 integer, parameter :: N = 5 type test_type integer a(3) end type type (test_type) s(N) integer i ! "s" is an array of structures,where the structure contains an array of length 3 do i=1, N s(i)%a(1) = i s(i)%a(2) = i + 10 s(i)%a(3) = i + 20 enddo ! "s" is initialised as follows: s(1)%a(1) = 1, s(1)%a(2) = 11, s(1)%a(3) = 21 ! s(2)%a(1) = 2, s(2)%a(2) = 12, s(2)%a(3) = 22 ! s(3)%a(1) = 3, s(3)%a(2) = 13, s(3)%a(3) = 23 ! s(4)%a(1) = 4, s(4)%a(2) = 14, s(4)%a(3) = 24 ! s(5)%a(1) = 5, s(5)%a(2) = 15, s(5)%a(3) = 25 do i=1, N write(*, *) 'Original: ', s(i)%a(1), s(i)%a(2), s(i)%a(3) enddo write(*, *) ' ' ! Add an offset to: s(1)%a(1), s(2)%a(1), s(3)%a(1), s(4)%a(1), s(5)%a(1) call test_sub(s%a(1), 100) ! "s" should now contain: s(1)%a(1) = 101, s(1)%a(2) = 11, s(1)%a(3) = 21 ! s(2)%a(1) = 102, s(2)%a(2) = 12, s(2)%a(3) = 22 ! s(3)%a(1) = 103, s(3)%a(2) = 13, s(3)%a(3) = 23 ! s(4)%a(1) = 104, s(4)%a(2) = 14, s(4)%a(3) = 24 ! s(5)%a(1) = 105, s(5)%a(2) = 15, s(5)%a(3) = 25 do i=1, N write(*, *) 'Added 100 to a(1): ', s(i)%a(1), s(i)%a(2), s(i)%a(3) enddo contains subroutine test_sub(array, offset) integer array(:), offset integer i do i=1, N array(i) = i + offset enddo end subroutine end program -- Summary: error passing an array derived from struc ture elements Product: gcc Version: 4.2.0 Status: UNCONFIRMED Severity: major Priority: P3 Component: fortran AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: stephen dot jeffrey at nrm dot qld dot gov dot au http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29315