re PR fortran/40847 (segfault & bogus warning)

2009-08-16  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/40847
	* iresolve.c (gfc_resolve_transfer): Correct error in 'mold'
	character length for case where length expresson is NULL.

2009-08-16  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/40847
	* gfortran.dg/transfer_resolve_1.f90 : New test.

From-SVN: r150810
This commit is contained in:
Paul Thomas 2009-08-16 20:04:40 +00:00
parent 95feb896a7
commit 9e890a553d
4 changed files with 45 additions and 3 deletions

View File

@ -1,3 +1,9 @@
2009-08-16 Paul Thomas <pault@gcc.gnu.org>
PR fortran/40847
* iresolve.c (gfc_resolve_transfer): Correct error in 'mold'
character length for case where length expresson is NULL.
2009-07-29 Tobias Burnus <burnus@net-b.de>
PR fortran/40851

View File

@ -2346,9 +2346,19 @@ gfc_resolve_transfer (gfc_expr *f, gfc_expr *source ATTRIBUTE_UNUSED,
/* TODO: Make this do something meaningful. */
static char transfer0[] = "__transfer0", transfer1[] = "__transfer1";
if (mold->ts.type == BT_CHARACTER && !mold->ts.cl->length
&& !(mold->expr_type == EXPR_VARIABLE && mold->symtree->n.sym->attr.dummy))
mold->ts.cl->length = gfc_int_expr (mold->value.character.length);
if (mold->ts.type == BT_CHARACTER
&& !mold->ts.cl->length
&& gfc_is_constant_expr (mold))
{
int len;
if (mold->expr_type == EXPR_CONSTANT)
mold->ts.cl->length = gfc_int_expr (mold->value.character.length);
else
{
len = mold->value.constructor->expr->value.character.length;
mold->ts.cl->length = gfc_int_expr (len);
}
}
f->ts = mold->ts;

View File

@ -1,3 +1,8 @@
2009-08-16 Paul Thomas <pault@gcc.gnu.org>
PR fortran/40847
* gfortran.dg/transfer_resolve_1.f90 : New test.
2009-08-16 Uros Bizjak <ubizjak@gmail.com>
Backport from mainline:

View File

@ -0,0 +1,21 @@
! { dg-do run }
! PR40847 - an error in gfc_resolve_transfer caused the character length
! of 'mold' to be set incorrectly.
!
! Contributed by Joost VandeVondele <jv244@cam.ac.uk>
!
program test_elemental
if (any (transfer_size((/0.,0./),(/'a','b'/)) .ne. [4 ,4])) call abort
contains
elemental function transfer_size (source, mold)
real, intent(in) :: source
character(*), intent(in) :: mold
integer :: transfer_size
transfer_size = SIZE(TRANSFER(source, (/mold/)))
return
end function transfer_size
end program test_elemental