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).