This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[gfortran] patch for PR 15294 - ADJUSTR intrinsic accessescorrupted pointer
- From: Bud Davis <bdavis9659 at comcast dot net>
- To: gfortran <fortran at gcc dot gnu dot org>, gcc-patches at gcc dot gnu dot org
- Date: Thu, 29 Apr 2004 21:07:35 -0500
- Subject: [gfortran] patch for PR 15294 - ADJUSTR intrinsic accessescorrupted pointer
adjustr was broken.
! pr 15294 - [gfortran] ADJUSTR intrinsic accesses corrupted pointer
!
program test_adjustr
implicit none
integer test_cases
parameter (test_cases=13)
integer i
character(len=10) s1(test_cases), s2(test_cases)
s1(1)='A'
s2(1)=' A'
s1(2)='AB'
s2(2)=' AB'
s1(3)='ABC'
s2(3)=' ABC'
s1(4)='ABCD'
s2(4)=' ABCD'
s1(5)='ABCDE'
s2(5)=' ABCDE'
s1(6)='ABCDEF'
s2(6)=' ABCDEF'
s1(7)='ABCDEFG'
s2(7)=' ABCDEFG'
s1(8)='ABCDEFGH'
s2(8)=' ABCDEFGH'
s1(9)='ABCDEFGHI'
s2(9)=' ABCDEFGHI'
s1(10)='ABCDEFGHIJ'
s2(10)='ABCDEFGHIJ'
s1(11)=''
s2(11)=''
s1(12)=' '
s2(12)=' '
s1(13)=' '
s2(13)=' '
do I = 1,test_cases
! print*,i
! print*, 's1 = "', s1(i), '"'
! print*, 's2 = "', s2(i), '"'
! print*, 'adjustr(s1) = "', adjustr(s1(i)), '"'
if (adjustr(s1(i)).ne.s2(i)) then
! print*,'fail'
call abort
endif
enddo
end program test_adjustr
here is the output of the test with prints enabled:
1
s1 = "A "
s2 = " A"
adjustr(s1) = " A"
2
s1 = "AB "
s2 = " AB"
adjustr(s1) = " AB"
3
s1 = "ABC "
s2 = " ABC"
adjustr(s1) = " ABC"
4
s1 = "ABCD "
s2 = " ABCD"
adjustr(s1) = " ABCD"
5
s1 = "ABCDE "
s2 = " ABCDE"
adjustr(s1) = " ABCDE"
6
s1 = "ABCDEF "
s2 = " ABCDEF"
adjustr(s1) = " ABCDEF"
7
s1 = "ABCDEFG "
s2 = " ABCDEFG"
adjustr(s1) = " ABCDEFG"
8
s1 = "ABCDEFGH "
s2 = " ABCDEFGH"
adjustr(s1) = " ABCDEFGH"
9
s1 = "ABCDEFGHI "
s2 = " ABCDEFGHI"
adjustr(s1) = " ABCDEFGHI"
10
s1 = "ABCDEFGHIJ"
s2 = "ABCDEFGHIJ"
adjustr(s1) = "ABCDEFGHIJ"
11
s1 = " "
s2 = " "
adjustr(s1) = " "
12
s1 = " "
s2 = " "
adjustr(s1) = " "
13
s1 = " "
s2 = " "
adjustr(s1) = " "
no additional testsuite failures, tested i686/gnu/linux FC1
changelog entry:
2004-04-30 Bud Davis <bdavis9659@comcast.net>
PR fortran/15294
* io/intrinsic/string_intrinsics.c(adjustr): rework logic.
--bud
Index: gcc/libgfortran/intrinsics/string_intrinsics.c
===================================================================
RCS file: /cvs/gcc/gcc/libgfortran/intrinsics/Attic/string_intrinsics.c,v
retrieving revision 1.1.2.6
diff -c -3 -p -r1.1.2.6 string_intrinsics.c
*** gcc/libgfortran/intrinsics/string_intrinsics.c 12 Dec 2003 12:48:31 -0000 1.1.2.6
--- gcc/libgfortran/intrinsics/string_intrinsics.c 30 Apr 2004 01:59:48 -0000
*************** adjustr (char *dest, GFC_INTEGER_4 len,
*** 276,287 ****
i = len;
while (i > 0 && src[i - 1] == ' ')
! i++;
! if (i < len)
! memcpy (&dest[len - i], &src, i);
! if (i < len)
! memset (dest, ' ', len - i);
}
--- 276,286 ----
i = len;
while (i > 0 && src[i - 1] == ' ')
! i--;
! if (i<len)
! memset (dest, ' ', len - i);
! memcpy (dest + (len - i), src, i );
}