| ! { dg-do run } |
| ! Tests the fix for pr28174, in which the fix for pr28118 was |
| ! corrupting the character lengths of arrays that shared a |
| ! character length structure. In addition, in developing the |
| ! fix, it was noted that intent(out/inout) arguments were not |
| ! getting written back to the calling scope. |
| ! |
| ! Based on the testscase by Harald Anlauf <anlauf@gmx.de> |
| ! |
| program pr28174 |
| implicit none |
| character(len=12) :: teststring(2) = (/ "abc def ghij", & |
| "klm nop qrst" /) |
| character(len=12) :: a(2), b(2), c(2), d(2) |
| integer :: m = 7, n |
| a = teststring |
| b = a |
| c = a |
| d = a |
| n = m - 4 |
| |
| ! Make sure that variable substring references work. |
| call foo (a(:)(m:m+5), c(:)(n:m+2), d(:)(5:9)) |
| if (any (a .ne. teststring)) STOP 1 |
| if (any (b .ne. teststring)) STOP 2 |
| if (any (c .ne. (/"ab456789#hij", & |
| "kl7654321rst"/))) STOP 3 |
| if (any (d .ne. (/"abc 23456hij", & |
| "klm 98765rst"/))) STOP 4 |
| contains |
| subroutine foo (w, x, y) |
| character(len=*), intent(in) :: w(:) |
| character(len=*), intent(inOUT) :: x(:) |
| character(len=*), intent(OUT) :: y(:) |
| character(len=12) :: foostring(2) = (/"0123456789#$" , & |
| "$#9876543210"/) |
| ! This next is not required by the standard but tests the |
| ! functioning of the gfortran implementation. |
| ! if (all (x(:)(3:7) .eq. y)) STOP 5 |
| x = foostring (:)(5 : 4 + len (x)) |
| y = foostring (:)(3 : 2 + len (y)) |
| end subroutine foo |
| end program pr28174 |
| |