re PR fortran/40847 (segfault & bogus warning)
2009-08-05 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-05 Paul Thomas <pault@gcc.gnu.org> PR fortran/40847 * gfortran.dg/transfer_resolve_1.f90 : New test. From-SVN: r150493
This commit is contained in:
parent
ec52288b33
commit
fd1e840d81
4 changed files with 45 additions and 3 deletions
|
@ -1,3 +1,9 @@
|
|||
2009-08-05 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-04 Tobias Burnus <burnus@net-b.de>
|
||||
|
||||
PR fortran/40949
|
||||
|
|
|
@ -2340,9 +2340,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;
|
||||
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2009-08-05 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/40847
|
||||
* gfortran.dg/transfer_resolve_1.f90 : New test.
|
||||
|
||||
2009-08-05 Uros Bizjak <ubizjak@gmail.com>
|
||||
Mikulas Patocka <mikulas@artax.karlin.mff.cuni.cz>
|
||||
|
||||
|
|
21
gcc/testsuite/gfortran.dg/transfer_resolve_1.f90
Normal file
21
gcc/testsuite/gfortran.dg/transfer_resolve_1.f90
Normal 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
|
Loading…
Add table
Reference in a new issue