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

Reply via email to