From d0e7a9fdfc21c858d4131052cf38dea4fa8f44b2 Mon Sep 17 00:00:00 2001 From: Janus Weil Date: Thu, 15 Jun 2017 23:17:48 +0200 Subject: [PATCH] re PR fortran/80983 ([F03] memory leak when calling procedure-pointer component with allocatable result) 2017-06-15 Janus Weil PR fortran/80983 * trans-expr.c (gfc_conv_procedure_call): Deallocate the result of scalar allocatable procedure-pointer components. 2017-06-15 Janus Weil PR fortran/80983 * gfortran.dg/proc_ptr_comp_51.f90: New test. From-SVN: r249227 --- gcc/fortran/ChangeLog | 6 ++++ gcc/fortran/trans-expr.c | 3 +- gcc/testsuite/ChangeLog | 5 +++ .../gfortran.dg/proc_ptr_comp_51.f90 | 35 +++++++++++++++++++ 4 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/proc_ptr_comp_51.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index ec28113820e..8e9e9a66d62 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2017-06-15 Janus Weil + + PR fortran/80983 + * trans-expr.c (gfc_conv_procedure_call): Deallocate the result of + scalar allocatable procedure-pointer components. + 2017-06-10 Thomas Koenig PR fortran/80988 diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 6af287e648c..acd0428eae6 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -6132,7 +6132,8 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, after use. This necessitates the creation of a temporary to hold the result to prevent duplicate calls. */ if (!byref && sym->ts.type != BT_CHARACTER - && sym->attr.allocatable && !sym->attr.dimension && !comp) + && ((sym->attr.allocatable && !sym->attr.dimension && !comp) + || (comp && comp->attr.allocatable && !comp->attr.dimension))) { tmp = gfc_create_var (TREE_TYPE (se->expr), NULL); gfc_add_modify (&se->pre, tmp, se->expr); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a79f533992e..34b6a9d9f1f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-06-15 Janus Weil + + PR fortran/80983 + * gfortran.dg/proc_ptr_comp_51.f90: New test. + 2017-06-15 Thomas Preud'homme PR lto/69866 diff --git a/gcc/testsuite/gfortran.dg/proc_ptr_comp_51.f90 b/gcc/testsuite/gfortran.dg/proc_ptr_comp_51.f90 new file mode 100644 index 00000000000..530872be4d5 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/proc_ptr_comp_51.f90 @@ -0,0 +1,35 @@ +! { dg-do compile } +! +! PR 80983: [F03] memory leak when calling procedure-pointer component with allocatable result +! +! Contributed by Janus Weil + +program test + implicit none + + type :: concrete_type + procedure (alloc_integer), pointer, nopass :: alloc + end type + + procedure (alloc_integer), pointer :: pp + + type(concrete_type) :: concrete + + print *, alloc_integer() ! case #1: plain function + + pp => alloc_integer + print *, pp() ! case #2: procedure pointer + + concrete % alloc => alloc_integer + print *, concrete % alloc() ! case #3: procedure-pointer component + +contains + + function alloc_integer() result(res) + integer, allocatable :: res + allocate(res, source=13) + end function + +end + +! { dg-final { scan-tree-dump-times "__builtin_free" 3 "original" } } -- 2.30.2