blob: d62815d7afade3f02949a56dea69bc3e46cdf048 [file] [log] [blame]
! { dg-do run }
!
! Test the fix for PR105054.
!
! Contributed by Arjen Markus <arjen.markus895@gmail.com>
!
module string_pointers
implicit none
character(len=20), dimension(10), target :: array_strings
character(len=:), dimension(:), target, allocatable :: array_strings2
contains
function pointer_to_string( i , flag)
integer, intent(in) :: i, flag
character(len=:), pointer :: pointer_to_string
if (flag == 1) then
pointer_to_string => array_strings(i)
return
endif
if (.not.allocated (array_strings2)) allocate (array_strings2(4), &
mold = ' ')
pointer_to_string => array_strings2(i)
end function pointer_to_string
function pointer_to_string2( i , flag) result (res)
integer, intent(in) :: i, flag
character(len=:), pointer :: res
if (flag == 1) then
res => array_strings(i)
return
endif
if (.not.allocated (array_strings2)) allocate (array_strings2(4), &
mold = ' ')
res => array_strings2(i)
end function pointer_to_string2
end module string_pointers
program chk_string_pointer
use string_pointers
implicit none
integer :: i
character(*), parameter :: chr(4) = ['1234 ','ABCDefgh ', &
'12345678 ',' ']
pointer_to_string(1, 1) = '1234567890'
pointer_to_string(2, 1) = '12345678901234567890'
if (len(pointer_to_string(3, 1)) /= 20) stop 1
array_strings(1) = array_strings(1)(1:4) // 'ABC'
if (pointer_to_string(1, 1) /= '1234ABC') stop 2
pointer_to_string(1, 2) = '1234'
pointer_to_string(2, 2) = 'ABCDefgh'
pointer_to_string(3, 2) = '12345678'
do i = 1, 3
if (trim (array_strings2(i)) /= trim(chr(i))) stop 3
enddo
! Clear the target arrays
array_strings = repeat (' ', 20)
deallocate (array_strings2)
! Repeat with an explicit result.
pointer_to_string2(1, 1) = '1234567890'
pointer_to_string2(2, 1) = '12345678901234567890'
if (len(pointer_to_string(3, 1)) /= 20) stop 4
array_strings(1) = array_strings(1)(1:4) // 'ABC'
if (pointer_to_string(1, 1) /= '1234ABC') stop 5
pointer_to_string2(1, 2) = '1234'
pointer_to_string2(2, 2) = 'ABCDefgh'
pointer_to_string2(3, 2) = '12345678'
do i = 1, 3
if (trim (array_strings2(i)) /= trim(chr(i))) stop 6
enddo
end program chk_string_pointer