OSDN Git Service

2013-08-11 Janus Weil <janus@gcc.gnu.org>
authorjanus <janus@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 11 Aug 2013 14:08:12 +0000 (14:08 +0000)
committerjanus <janus@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 11 Aug 2013 14:08:12 +0000 (14:08 +0000)
Backport from trunk:
2013-08-09  Janus Weil  <janus@gcc.gnu.org>

PR fortran/58058
* trans-intrinsic.c (gfc_conv_intrinsic_transfer): Free the temporary
string, if necessary.

2013-08-11  Janus Weil  <janus@gcc.gnu.org>

Backport from trunk:
2013-08-09  Janus Weil  <janus@gcc.gnu.org>

PR fortran/58058
* gfortran.dg/transfer_intrinsic_6.f90: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@201653 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/trans-intrinsic.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/transfer_intrinsic_6.f90 [new file with mode: 0644]

index bb59837..ba8b8d0 100644 (file)
@@ -1,3 +1,12 @@
+2013-08-11  Janus Weil  <janus@gcc.gnu.org>
+
+       Backport from trunk:
+       2013-08-09  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/58058
+       * trans-intrinsic.c (gfc_conv_intrinsic_transfer): Free the temporary
+       string, if necessary.
+
 2013-07-08  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/57785
index ed0ab8b..f7afb78 100644 (file)
@@ -5623,8 +5623,7 @@ scalar_transfer:
 
   if (expr->ts.type == BT_CHARACTER)
     {
-      tree direct;
-      tree indirect;
+      tree direct, indirect, free;
 
       ptr = convert (gfc_get_pchar_type (expr->ts.kind), source);
       tmpdecl = gfc_create_var (gfc_get_pchar_type (expr->ts.kind),
@@ -5657,6 +5656,13 @@ scalar_transfer:
       tmp = build3_v (COND_EXPR, tmp, direct, indirect);
       gfc_add_expr_to_block (&se->pre, tmp);
 
+      /* Free the temporary string, if necessary.  */
+      free = gfc_call_free (tmpdecl);
+      tmp = fold_build2_loc (input_location, GT_EXPR, boolean_type_node,
+                            dest_word_len, source_bytes);
+      tmp = build3_v (COND_EXPR, tmp, free, build_empty_stmt (input_location));
+      gfc_add_expr_to_block (&se->post, tmp);
+
       se->expr = tmpdecl;
       se->string_length = fold_convert (gfc_charlen_type_node, dest_word_len);
     }
index d506eae..302cc20 100644 (file)
@@ -1,3 +1,11 @@
+2013-08-11  Janus Weil  <janus@gcc.gnu.org>
+
+       Backport from trunk:
+       2013-08-09  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/58058
+       * gfortran.dg/transfer_intrinsic_6.f90: New.
+
 2013-07-16  Iain Sandoe  <iain@codesourcery.com>
 
        PR target/55656
diff --git a/gcc/testsuite/gfortran.dg/transfer_intrinsic_6.f90 b/gcc/testsuite/gfortran.dg/transfer_intrinsic_6.f90
new file mode 100644 (file)
index 0000000..e76bc49
--- /dev/null
@@ -0,0 +1,20 @@
+! { dg-do compile }
+! { dg-options "-fdump-tree-original" }
+!
+! PR 58058: [4.7/4.8/4.9 Regression] Memory leak with transfer function
+!
+! Contributed by Thomas Jourdan <thomas.jourdan@orange.fr>
+
+  implicit none
+
+  integer, dimension(3) :: t1
+  character(len=64) :: str
+  
+  t1 = (/1,2,3/)
+
+  str = transfer(t1,str)
+
+end
+
+! { dg-final { scan-tree-dump-times "__builtin_free" 1 "original" } }
+! { dg-final { cleanup-tree-dump "original" } }