aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2009-08-05 16:10:19 +0000
committerPaul Thomas <pault@gcc.gnu.org>2009-08-05 16:10:19 +0000
commitfd1e840d81c4d581d118ef1890e682fb90a4a72b (patch)
treec665e2426f5c2db1de2f984e9fe9682991a6da62 /gcc
parentec52288b33d1928b62fd5ef9ae576d1cf8b51774 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/fortran/iresolve.c16
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/transfer_resolve_1.f9021
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