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.

Reply via email to