diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2009-08-05 16:10:19 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2009-08-05 16:10:19 +0000 |
commit | fd1e840d81c4d581d118ef1890e682fb90a4a72b (patch) | |
tree | c665e2426f5c2db1de2f984e9fe9682991a6da62 /gcc | |
parent | ec52288b33d1928b62fd5ef9ae576d1cf8b51774 (diff) | |
download | gcc-fd1e840d81c4d581d118ef1890e682fb90a4a72b.zip gcc-fd1e840d81c4d581d118ef1890e682fb90a4a72b.tar.gz gcc-fd1e840d81c4d581d118ef1890e682fb90a4a72b.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/iresolve.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/transfer_resolve_1.f90 | 21 |
4 files changed, 45 insertions, 3 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 5924892..72b6b85 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -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 diff --git a/gcc/fortran/iresolve.c b/gcc/fortran/iresolve.c index fdbf40c..5bb24a4 100644 --- a/gcc/fortran/iresolve.c +++ b/gcc/fortran/iresolve.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 050d1df..5bbd2f8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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> diff --git a/gcc/testsuite/gfortran.dg/transfer_resolve_1.f90 b/gcc/testsuite/gfortran.dg/transfer_resolve_1.f90 new file mode 100644 index 0000000..8d326a1 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/transfer_resolve_1.f90 @@ -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 |