re PR fortran/82923 (Automatic allocation of deferred length character using function result)

2018-05-19  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/82923
	PR fortran/66694
	PR fortran/82617
	* trans-array.c (gfc_alloc_allocatable_for_assignment): Set the
	charlen backend_decl of the rhs expr to ss->info->string_length
	so that the value in the current scope is used.

2018-05-19  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/82923
	* gfortran.dg/allocate_assumed_charlen_4.f90: New test. Note
	that the patch fixes PR66694 & PR82617, although the testcases
	are not explicitly included.

From-SVN: r260399
This commit is contained in:
Paul Thomas 2018-05-19 14:53:58 +00:00
parent 8c55577cec
commit 34aac30d2d
4 changed files with 63 additions and 0 deletions

View File

@ -1,3 +1,13 @@
2018-05-19 Paul Thomas <pault@gcc.gnu.org>
PR fortran/82923
PR fortran/66694
PR fortran/82617
Backport from trunk
* trans-array.c (gfc_alloc_allocatable_for_assignment): Set the
charlen backend_decl of the rhs expr to ss->info->string_length
so that the value in the current scope is used.
2018-05-16 Paul Thomas <pault@gcc.gnu.org>
PR fortran/83149

View File

@ -9132,6 +9132,12 @@ gfc_alloc_allocatable_for_assignment (gfc_loopinfo *loop,
if (expr2 && rss == gfc_ss_terminator)
return NULL_TREE;
/* Ensure that the string length from the current scope is used. */
if (expr2->ts.type == BT_CHARACTER
&& expr2->expr_type == EXPR_FUNCTION
&& !expr2->value.function.isym)
expr2->ts.u.cl->backend_decl = rss->info->string_length;
gfc_start_block (&fblock);
/* Since the lhs is allocatable, this must be a descriptor type.

View File

@ -1,3 +1,11 @@
2018-05-19 Paul Thomas <pault@gcc.gnu.org>
PR fortran/82923
Backport from trunk
* gfortran.dg/allocate_assumed_charlen_4.f90: New test. Note
that the patch fixes PR66694 & PR82617, although the testcases
are not explicitly included.
2017-05-17 Paul Thomas <pault@gcc.gnu.org>
PR fortran/82814

View File

@ -0,0 +1,39 @@
! { dg-do run }
!
! Test the fix for PR82923, in which an ICE occurred because the
! character length from 'getchars' scope was being used in the
! automatic allocation of 'mine'.
!
! Contributed by "Werner Blokbuster" <werner.blokbuster@gmail.com>
!
module m
implicit none
contains
function getchars(my_len,my_size)
integer, intent(in) :: my_len, my_size
character(my_len) :: getchars(my_size)
getchars = 'A-'
end function getchars
function getchars2(my_len)
integer, intent(in) :: my_len
character(my_len) :: getchars2
getchars2 = 'B--'
end function getchars2
end module m
program testca
use m, only: getchars, getchars2
implicit none
character(:), allocatable :: mine(:)
character(:), allocatable :: mine2
integer :: i
! ICE occured at this line:
mine = getchars(2,4)
if (any (mine .ne. [('A-', i = 1, 4)])) stop 1
! The scalar version was fine and this will keep it so:
mine2 = getchars2(3)
if (mine2 .ne. 'B--') stop 2
end program testca