This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
Re: [Patch, fortran] PR32880 - User operator & allocatable TYPE components: wrong deallocate
- From: Paul Thomas <paulthomas2 at wanadoo dot fr>
- To: Tobias Burnus <burnus at net-b dot de>
- Cc: Fortran List <fortran at gcc dot gnu dot org>, gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Fri, 27 Jul 2007 23:12:15 +0200
- Subject: Re: [Patch, fortran] PR32880 - User operator & allocatable TYPE components: wrong deallocate
- References: <46AA2BCF.1060108@wanadoo.fr> <46AA55F4.1070507@net-b.de>
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" } }