public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug fortran/109345] New: class(*) variable that is a string array is not handled correctly
@ 2023-03-30 12:35 lchilutti at gmail dot com
  0 siblings, 0 replies; only message in thread
From: lchilutti at gmail dot com @ 2023-03-30 12:35 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109345

            Bug ID: 109345
           Summary: class(*) variable that is a string array is not
                    handled correctly
           Product: gcc
           Version: 12.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: lchilutti at gmail dot com
  Target Milestone: ---

program test
implicit none
character(len=255)     :: str_array(2)   !< Array of strings

str_array(1) = ""
str_array(2) = ""

str_array(1) = "2880:2880,1:2160::1:1,1:2160"
str_array(2) = "1:1440,2160:2160::2880:1441,2160:2160"

call foo(str_array) !< class(*)
call foo2(str_array) !< char type
call foo3(str_array) !< class(*) with str copy

contains

subroutine foo ( var) !< Uses class(*)
class(*), intent(in) :: var(:)
integer :: i

select type (var)
type is (character(len=*))
  print *, "Using class(*)"
  print *, "The size of var:", size(var)
  do i = 1, size(var)
    print *, len_trim(var(i)), "data:", trim(var(i))
  enddo
end select
end subroutine

subroutine foo2 (var) !< Uses char type
character(len=*), intent(in) :: var(:)
integer :: i
  print *, "Not using class(*)"
  print *, "The size of var:", size(var)
  do i = 1, size(var)
    print *, len_trim(var(i)), "data:", trim(var(i))
  enddo
end subroutine

subroutine foo3 (var) !< Uses class(*) with a workaround
class(*), intent(in) :: var(:)
integer :: i
character(len=:), dimension(:), allocatable :: str

select type (var)
type is (character(len=*))
  str = var !< if you copy the class(*) var to an allocatable string it works
  print *, "Using class(*), with string copy workaround"
  print *, "The size of str:", size(str)
  do i = 1, size(str)
    print *, len_trim(str(i)), "data:", trim(str(i))
  enddo
end select
end subroutine
end program

If I compile the above program with gfortran (gcc version 12.2.0), I get the
following output:

Using class(*)
 The size of var:           2
          28 data:2880:2880,1:2160::1:1,1:2160
         255 data:880:2880,1:2160::1:1,1:2160                                  
                                                                               
                                                                               
                                1
 Not using class(*)
 The size of var:           2
          28 data:2880:2880,1:2160::1:1,1:2160
          37 data:1:1440,2160:2160::2880:1441,2160:2160
 Using class(*), with string copy workaround
 The size of str:           2
          28 data:2880:2880,1:2160::1:1,1:2160
          37 data:1:1440,2160:2160::2880:1441,2160:2160

You can see that when we give an array of strings as an argument to a function
using class(*) and select type, the string returned within the select type
function is incorrect.  We found a workaround in which we can copy the class(*)
input variable to an allocatable string within the select type statement, but
we should not have to do this.

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-03-30 12:35 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-30 12:35 [Bug fortran/109345] New: class(*) variable that is a string array is not handled correctly lchilutti at gmail dot com

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).