]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/40847 (segfault & bogus warning)
authorPaul Thomas <pault@gcc.gnu.org>
Wed, 5 Aug 2009 16:10:19 +0000 (16:10 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Wed, 5 Aug 2009 16:10:19 +0000 (16:10 +0000)
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

gcc/fortran/ChangeLog
gcc/fortran/iresolve.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/transfer_resolve_1.f90 [new file with mode: 0644]

index 5924892e777b56f80c1384d9954226a1c6c55958..72b6b85e22410eb938ab6820714efbd98ee3d42c 100644 (file)
@@ -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
index fdbf40c4408349c04fb0fb892b1bc9af89056fea..5bb24a42a21446b1d882236c5938f15ff0da39ee 100644 (file)
@@ -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;
 
index 050d1dfda48913f6a288797fd1419bd0f61a8ba4..5bbd2f8d3f890c6b9d16f043e3b1b61c1373b23c 100644 (file)
@@ -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 (file)
index 0000000..8d326a1
--- /dev/null
@@ -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