48 lines
1.2 KiB
Fortran
48 lines
1.2 KiB
Fortran
! { dg-do compile }
|
|
!
|
|
! PR fortran/40873
|
|
!
|
|
! Failed to compile (segfault) with -fwhole-file.
|
|
! Cf. PR 40873 comment 24; test case taken from
|
|
! PR fortran/31867 comment 6.
|
|
!
|
|
|
|
pure integer function lensum (words, sep)
|
|
character (len=*), intent(in) :: words(:), sep
|
|
lensum = (size (words)-1) * len (sep) + sum (len_trim (words))
|
|
end function
|
|
|
|
module util_mod
|
|
implicit none
|
|
interface
|
|
pure integer function lensum (words, sep)
|
|
character (len=*), intent(in) :: words(:), sep
|
|
end function
|
|
end interface
|
|
contains
|
|
function join (words, sep) result(str)
|
|
! trim and concatenate a vector of character variables,
|
|
! inserting sep between them
|
|
character (len=*), intent(in) :: words(:), sep
|
|
character (len=lensum (words, sep)) :: str
|
|
integer :: i, nw
|
|
nw = size (words)
|
|
str = ""
|
|
if (nw < 1) then
|
|
return
|
|
else
|
|
str = words(1)
|
|
end if
|
|
do i=2,nw
|
|
str = trim (str) // sep // words(i)
|
|
end do
|
|
end function join
|
|
end module util_mod
|
|
!
|
|
program xjoin
|
|
use util_mod, only: join
|
|
implicit none
|
|
character (len=5) :: words(2) = (/"two ","three"/)
|
|
write (*,"(1x,'words = ',a)") "'"//join (words, "&")//"'"
|
|
end program xjoin
|