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