https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100886
Bug ID: 100886
Summary: Variable character pointer within a Fortran derived
type can't determine the shape(mold) of the target
Product: gcc
Version: 12.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
Assignee: unassigned at gcc dot gnu.org
Reporter: thomas.robinson at noaa dot gov
Target Milestone: ---
A character pointer within a Fortran DDT can't determine the shape(mold) of a
variable length allocatable target character array
Desired behavior: DDT pointer behaves like a non-DDT pointer and properly
determines shape(mold) of the target and points to it
Here is some sample code:
program char_ptr_test
implicit none
character(len=:), dimension(:), allocatable, target:: input_nml_file
character(len=:), dimension(:), pointer:: copy_input_nml_file => null()
type init_type
character(len=:), dimension(:), pointer:: input_nml_file => null()
end type init_type
type(init_type):: Init
integer:: i
character(len=6):: arg
logical:: gnu=.false.
!--- parse command line
call get_command_argument(1, arg)
if (len_trim(arg) > 0) print *, trim(arg)
!--- set up input_nml_file and output the result
call init_input()
do i = 1,size(input_nml_file)
print *, 'Main input_nml_file is: "',input_nml_file(i),'"'
enddo
!--- plain pointer - works as expected
print *, NEW_LINE('a'),'plain pointer'
copy_input_nml_file => input_nml_file
do i = 1,size(copy_input_nml_file)
print *, 'copy_input_nml_file is: "',copy_input_nml_file(i),'"'
enddo
nullify(copy_input_nml_file)
!--- pointer within a DDT - fails
!--- point to input_nml_file elements (:)
print *, NEW_LINE('a'),'pointer within fortran ddt @ elements (:)'
Init%input_nml_file => input_nml_file(:)
do i = 1,size(Init%input_nml_file)
print *, 'Init%input_nml_file is: "',Init%input_nml_file(i),'"'
enddo
!--- pointer within a DDT - fails
!--- point to input_nml_file as whole
print *, NEW_LINE('a'),'pointer within fortran ddt @ whole entity'
Init%input_nml_file => input_nml_file
do i = 1,size(Init%input_nml_file)
print *, 'Init%input_nml_file is: "',Init%input_nml_file(i),'"'
enddo
nullify(Init%input_nml_file)
!--- pointer within a DDT - works
!--- point to input_nml_file elements (:)
!--- allocate/deallocate to get shape
print *, NEW_LINE('a'),'pointer within fortran ddt with shape settings @
elements(:)'
allocate(Init%input_nml_file, mold=input_nml_file)
deallocate(Init%input_nml_file)
Init%input_nml_file => input_nml_file(:)
do i = 1,size(Init%input_nml_file)
print *, 'Init%input_nml_file is: "',Init%input_nml_file(i),'"'
enddo
nullify(Init%input_nml_file)
!--- pointer within a DDT - fails with segfault
!--- point to input_nml_file as whole
!--- allocate/deallocate to get shape
print *, NEW_LINE('a'),'pointer within fortran ddt w/ shape settings @ whole
entity'
allocate(Init%input_nml_file, mold=input_nml_file)
deallocate(Init%input_nml_file)
Init%input_nml_file => input_nml_file
do i = 1,size(Init%input_nml_file)
print *, 'Init%input_nml_file is: "',Init%input_nml_file(i),'"'
enddo
nullify(Init%input_nml_file)
contains
subroutine init_input()
allocate(character(len=10)::input_nml_file(7))
input_nml_file(1) = 'New York '
input_nml_file(2) = 'London'
input_nml_file(3) = 'Paris '
input_nml_file(4) = 'Munich'
input_nml_file(5) = 'Everybody '
input_nml_file(6) = 'talk about'
input_nml_file(7) = 'Pop Muzik '
end subroutine init_input
end program char_ptr_test
The behavior is different between 9.3 and 10.2, but the same for 10.2 to 12.0
(at least for the versions that I have available). Please let me know if
there's any other information you need