From fb5803b8e3e75f4c4f07cdff9e2278c75241cb33 Mon Sep 17 00:00:00 2001 From: Janus Weil Date: Sun, 11 Aug 2013 16:08:12 +0200 Subject: [PATCH] backport: re PR fortran/58058 (Memory leak with transfer function) 2013-08-11 Janus Weil Backport from trunk: 2013-08-09 Janus Weil PR fortran/58058 * trans-intrinsic.c (gfc_conv_intrinsic_transfer): Free the temporary string, if necessary. 2013-08-11 Janus Weil Backport from trunk: 2013-08-09 Janus Weil PR fortran/58058 * gfortran.dg/transfer_intrinsic_6.f90: New. From-SVN: r201653 --- gcc/fortran/ChangeLog | 9 +++++++++ gcc/fortran/trans-intrinsic.c | 10 ++++++++-- gcc/testsuite/ChangeLog | 8 ++++++++ .../gfortran.dg/transfer_intrinsic_6.f90 | 20 +++++++++++++++++++ 4 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/transfer_intrinsic_6.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index bb59837f9629..ba8b8d03deb2 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,12 @@ +2013-08-11 Janus Weil + + Backport from trunk: + 2013-08-09 Janus Weil + + PR fortran/58058 + * trans-intrinsic.c (gfc_conv_intrinsic_transfer): Free the temporary + string, if necessary. + 2013-07-08 Tobias Burnus PR fortran/57785 diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c index ed0ab8b2ed9e..f7afb7869661 100644 --- a/gcc/fortran/trans-intrinsic.c +++ b/gcc/fortran/trans-intrinsic.c @@ -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); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d506eaea9893..302cc20c9e1d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2013-08-11 Janus Weil + + Backport from trunk: + 2013-08-09 Janus Weil + + PR fortran/58058 + * gfortran.dg/transfer_intrinsic_6.f90: New. + 2013-07-16 Iain Sandoe 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 index 000000000000..e76bc49aeda7 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/transfer_intrinsic_6.f90 @@ -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 + + 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" } } -- 2.47.2