https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109345
anlauf at gcc dot gnu.org changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Target Milestone|--- |12.5
Known to fail| |12.4.0, 13.3.0, 14.1.0,
| |15.0
Known to work| |11.5.0
Summary|class(*) variable that is a |[12/13/14/15 Regression]
|string array is not handled |class(*) variable that is a
|correctly |string array is not handled
| |correctly
Ever confirmed|0 |1
Keywords| |wrong-code
Priority|P3 |P4
Last reconfirmed| |2024-07-23
--- Comment #1 from anlauf at gcc dot gnu.org ---
Interesting bug. This does work in 11.5.0 but fails in 12+.
Slightly rewritten to exhibit the issue more clearly:
program test
implicit none
character(len=12) :: str_array(4) !< Array of strings
str_array(:) = ""
str_array(1) = "12345678"
str_array(2) = "@ABCDEFG"
call foo2(str_array) !< char type
call foo (str_array) !< class(*)
call foo3(str_array) !< class(*) with str copy
contains
subroutine foo ( var) !< Uses class(*)
class(*), intent(in) :: var(:)
integer :: i
print *, "Using class(*)"
select type (var)
type is (character(len=*))
do i = 1, size(var)
print *, len_trim(var(i)), var(i)==str_array(i), "data:",
trim(var(i))
enddo
end select
end
subroutine foo2 (var) !< Uses char type
character(len=*), intent(in) :: var(:)
integer :: i
print *, "Using character(*)"
do i = 1, size(var)
print *, len_trim(var(i)), var(i)==str_array(i), "data:", trim(var(i))
enddo
end
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 !< copy class(*) var to an allocatable string
print *, "Using class(*), with string copy workaround"
do i = 1, size(str)
print *, len_trim(str(i)), str(i)==str_array(i), "data:",
trim(str(i))
enddo
print *, (str(i)==var(i),i=1,size(str))
print *, (str(:)==var(:))
end select
end
end
This prints with 11.5.0:
Using character(*)
8 T data:12345678
8 T data:@ABCDEFG
0 T data:
0 T data:
Using class(*)
8 T data:12345678
8 T data:@ABCDEFG
0 T data:
0 T data:
Using class(*), with string copy workaround
8 T data:12345678
8 T data:@ABCDEFG
0 T data:
0 T data:
T T T T
T T T T
With 12+:
Using character(*)
8 T data:12345678
8 T data:@ABCDEFG
0 T data:
0 T data:
Using class(*)
8 T data:12345678
12 F data:2345678 @
12 F data:345678 @A
12 F data:45678 @AB
Using class(*), with string copy workaround
8 T data:12345678
8 T data:@ABCDEFG
0 T data:
0 T data:
T F F F
T T T T
The issue seems to require a class(*) dummy involved.