This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Patch, fortran] PR32880 - User operator & allocatable TYPE components: wrong deallocate


Tobias,
add a testcase.
Thanks. How about the attached file of the PR?

That's what I have done so far (see attached). However, in the course of the investigation, I found that parentheses were not working correctly. I'll add a tests of that too.

We need to add the IVS testsuite to cp2k and all the others:-)

Paul
! { dg-do run }
! Tests the fix for pr32880, in which 'res' was deallocated
! before it could be used in the concatenation.
! Adapted from vst28.f95, in Lawrie Schonfeld's iso_varying_string
! testsuite, by Tobias Burnus.
!
module iso_varying_string
  type varying_string
     character(LEN=1), dimension(:), allocatable :: chars
  end type varying_string
  interface assignment(=)
     module procedure op_assign_VS_CH
  end interface assignment(=)
  interface operator(//)
     module procedure op_concat_VS_CH
  end interface operator(//)
contains
  elemental subroutine op_assign_VS_CH (var, exp)
    type(varying_string), intent(out) :: var
    character(LEN=*), intent(in)      :: exp
    integer                      :: length
    integer                      :: i_char
    length = len(exp)
    allocate(var%chars(length))
    forall(i_char = 1:length)
       var%chars(i_char) = exp(i_char:i_char)
    end forall
  end subroutine op_assign_VS_CH
  elemental function op_concat_VS_CH (string_a, string_b) result (concat_string)
    type(varying_string), intent(in) :: string_a
    character(LEN=*), intent(in)     :: string_b
    type(varying_string)             :: concat_string
    len_string_a = size(string_a%chars)
    allocate(concat_string%chars(len_string_a+len(string_b)))
    if (len_string_a >0) &
       concat_string%chars(:len_string_a) = string_a%chars
    if (len (string_b) > 0) &
       concat_string%chars(len_string_a+1:) = string_b
  end function op_concat_VS_CH
end module iso_varying_string

program VST28
  use iso_varying_string
  character(len=10) :: char_a
  type(VARYING_STRING) :: res
  char_a = "abcdefghij"
  res = char_a(5:5)
  res = res//char_a(6:6)
  if(size(res%chars) /= 2 .or. any(res%chars /= ['e','f'])) then
    write(*,*) 'ERROR: should be ef, got: ', res%chars, size(res%chars)
    call abort ()
  end if
end program VST28

! { dg-final { cleanup-modules "iso_varying_string" } }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]