The attached patch allows gfortran to compile the
attached testcase. The resulting executable runs
as expected.
Short story:
character(len=20) :: string = 'some text here'
character(len=:), allocatable :: s
n = 5
allocate(s, source=string(:n))
The length of s is determined from the expression in
the source= argument. If this expression is a lonely
substring reference as in the above, then gfortran
does set the correct length. This patch fixes this.
OK for trunk?
2011-08-26 Steven G. Kargl <[email protected]>
PR fortran/45170
* trans-stmt.c (gfc_trans_allocate): Evaluate the substring.
2011-08-26 Steven G. Kargl <[email protected]>
PR fortran/45170
* gfortran.dg/allocate_with_source_2.f90: New test
--
Steve
Index: trans-stmt.c
===================================================================
--- trans-stmt.c (revision 177772)
+++ trans-stmt.c (working copy)
@@ -4783,6 +4783,10 @@ gfc_trans_allocate (gfc_code * code)
|| code->expr3->expr_type == EXPR_CONSTANT)
{
gfc_conv_expr (&se_sz, code->expr3);
+ gfc_add_block_to_block (&se.pre, &se_sz.pre);
+ se_sz.string_length
+ = gfc_evaluate_now (se_sz.string_length, &se.pre);
+ gfc_add_block_to_block (&se.pre, &se_sz.post);
memsz = se_sz.string_length;
}
else if (code->expr3->mold
! { dg-do run }
! PR 45170
! A variation of a theme for deferred type parameters. The
! substring reference in the source= portion of the allocate
! was not probably resolved. Testcase is a modified version
! of a program due to Hans-Werner Boschmann <boschmann at tp1
! dot physik dot uni-siegen dot de>
!
program helloworld
character(:),allocatable::string
real::rnd
call hello(5, string)
if (string /= 'hello' .or. len(string) /= 5) call abort
contains
subroutine hello (n,string)
character(:),allocatable,intent(out)::string
integer,intent(in)::n
character(20)::helloworld="hello world"
allocate(string, source=helloworld(:n))
end subroutine hello
end program helloworld