From c0f81f78ae9aa3931b3b5472eb138ff3815d10de Mon Sep 17 00:00:00 2001 From: Paul Thomas Date: Sat, 24 Oct 2009 10:11:46 +0000 Subject: [PATCH] re PR fortran/41772 (Wrong code due to TRANSFER of EMPTY array section) 2009-10-24 Paul Thomas PR fortran/41772 * trans-intrinsic.c (gfc_conv_intrinsic_transfer): Stop'extent' from going negative. 2009-10-24 Paul Thomas PR fortran/41772 * gfortran.dg/transfer_intrinsic_3.f90. From-SVN: r153524 --- gcc/fortran/ChangeLog | 6 ++++ gcc/fortran/trans-intrinsic.c | 2 ++ gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gfortran.dg/transfer_intrinsic_3.f90 | 38 ++++++++++++++++++++++ 4 files changed, 51 insertions(+) create mode 100644 gcc/testsuite/gfortran.dg/transfer_intrinsic_3.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index bc4ecb0..cf6c8cd 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2009-10-24 Paul Thomas + + PR fortran/41772 + * trans-intrinsic.c (gfc_conv_intrinsic_transfer): Stop'extent' + from going negative. + 2009-10-23 Janus Weil PR fortran/41800 diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c index 1e7b35f..c3d7dfb 100644 --- a/gcc/fortran/trans-intrinsic.c +++ b/gcc/fortran/trans-intrinsic.c @@ -4490,6 +4490,8 @@ gfc_conv_intrinsic_transfer (gfc_se * se, gfc_expr * expr) scalar_transfer: extent = fold_build2 (MIN_EXPR, gfc_array_index_type, dest_word_len, source_bytes); + extent = fold_build2 (MAX_EXPR, gfc_array_index_type, + extent, gfc_index_zero_node); if (expr->ts.type == BT_CHARACTER) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 481a82e..676b5a7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-10-24 Paul Thomas + + PR fortran/41772 + * gfortran.dg/transfer_intrinsic_3.f90. + 2009-10-24 Eric Botcazou * gnat.dg/opt4.adb: New test. diff --git a/gcc/testsuite/gfortran.dg/transfer_intrinsic_3.f90 b/gcc/testsuite/gfortran.dg/transfer_intrinsic_3.f90 new file mode 100644 index 0000000..f0b9b54 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/transfer_intrinsic_3.f90 @@ -0,0 +1,38 @@ +! { dg-do run } +! Tests the fix for PR41772 in which the empty array reference +! 'qname(1:n-1)' was not handled correctly in TRANSFER. +! +! Contributed by Tobias Burnus +! +module m + implicit none +contains + pure function str_vs(vs) result(s) + character, dimension(:), intent(in) :: vs + character(len=size(vs)) :: s + s = transfer(vs, s) + end function str_vs + subroutine has_key_ns(uri, localname, n) + character(len=*), intent(in) :: uri, localname + integer, intent(in) :: n + if ((n .lt. 2) .and. (len (uri) .ne. 0)) then + call abort + else IF ((n .ge. 2) .and. (len (uri) .ne. n - 1)) then + call abort + end if + end subroutine +end module m + + use m + implicit none + character, dimension(:), pointer :: QName + integer :: n + allocate(qname(6)) + qname = (/ 'a','b','c','d','e','f' /) + + do n = 0, 3 + call has_key_ns(str_vs(qname(1:n-1)),"", n) + end do + deallocate(qname) +end +! { dg-final { cleanup-modules "m" } } \ No newline at end of file -- 2.7.4