[Bug fortran/100886] Variable character pointer within a Fortran derived type can't determine the shape(mold) of the target

2021-08-02 Thread thomas.robinson at noaa dot gov via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100886

--- Comment #1 from Tom Robinson  ---
Has anyone had a chance to look at this and confirm it?

[Bug fortran/100886] New: Variable character pointer within a Fortran derived type can't determine the shape(mold) of the target

2021-06-02 Thread thomas.robinson at noaa dot gov via Gcc-bugs
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

[Bug fortran/100860] class(*) type is (character(*)) produces a segmentation fault when run

2021-06-02 Thread thomas.robinson at noaa dot gov via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100860

Tom Robinson  changed:

   What|Removed |Added

 Status|WAITING |RESOLVED
 Resolution|--- |FIXED

--- Comment #4 from Tom Robinson  ---
Actually, it looks like someone else saw this bug report and tested the code. 
They reported it worked.  Thanks.

[Bug fortran/100860] class(*) type is (character(*)) produces a segmentation fault when run

2021-06-02 Thread thomas.robinson at noaa dot gov via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100860

--- Comment #3 from Tom Robinson  ---
I tried with the main (12.0.0) and this code ran.  I will try it in with our
main codebase to confirm it works there too.

[Bug fortran/100860] New: class(*) type is (character(*)) produces a segmentation fault when run

2021-06-01 Thread thomas.robinson at noaa dot gov via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100860

Bug ID: 100860
   Summary: class(*) type is (character(*)) produces a
segmentation fault when run
   Product: gcc
   Version: 11.1.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: ---

When a string is passed as an argument to a subroutine where the argument is
`class(*)`, there is a seg fault when the type is selected.  Other types seem
to be working.
Previous versions of gfortran have no problem compiling and running this simple
program.  I think the code is correct.  It seems to be gcc 11 that has an
issue.

Here is some test code:

module ctest
contains

subroutine sub (carg, slen)

 class(*), intent (in) :: carg
 integer, optional, intent (in)  :: slen

 select type (carg)
 type is (character(*))
   if (.not.present(slen)) then
 write (6,*) "This is an error dealing with a string"
   else
 write (6,*) "string length is ",slen
 write (6,*) "String is ",carg(1:slen)
   endif

 type is (integer)
   write (6,*) "Integer type is ", carg
 type is (real)
   write (6,*) "Real type is ", carg
 class default
   write (6,*) "Not the right type"
 end select


end subroutine sub


end module ctest

program test

use ctest

character (len=10) :: c10
character (len=:), allocatable :: sall
integer :: i=100
real :: r = 999.9
logical :: l = .true.
 call sub (r)
 call sub (i)
 call sub (l)
 c10="12345"
 allocate(character (len=i) :: sall)
 sall = "87654321"
! write (6,*) "c10=",trim(c10),"::LEN=",len_trim(c10)
! call sub(trim(c10), len_trim(c10))
 write (6,*) "sall=",trim(sall),"::LEN=",len_trim(sall)
 call sub(trim(sall),len_trim(sall))



end program test

Here is the output
 Real type is999.900024
 Integer type is  100
 Not the right type
 sall=87654321::LEN=   8

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.


I tried with heap and stack strings, and both fail (you can see I have the
first one commented out).  Please let me know if there's any more information
you need.