diff mbox

[Fortran,F03] PR 80983: memory leak when calling procedure-pointer component with allocatable result

Message ID CAKwh3qjEz86fOH5KSvd_Ur8XB0_uwa2Zfz_3GfS6oWmjnMK-Sw@mail.gmail.com
State New
Headers show

Commit Message

Janus Weil June 15, 2017, 12:07 p.m. UTC
Hi all,

the attached patch fixes a runtime memory leak with procedure-pointer
components (PPCs). gfortran correctly deallocates scalar allocatable
function results (also for procedure pointers), but fails to do so for
PPCs, which is cured by my patch.

[Note: Since gfortran translates any type-bound procedure call into a
PPC call internally, the patch also cures memory leaks with TBPs.]

It regtests cleanly on x86_64-linux-gnu. Ok for trunk?

Cheers,
Janus


2017-06-15  Janus Weil  <janus@gcc.gnu.org>

    PR fortran/70983
    * trans-expr.c (gfc_conv_procedure_call): Deallocate the result of
    scalar allocatable procedure-pointer components.


2017-06-15  Janus Weil  <janus@gcc.gnu.org>

    PR fortran/70983
    * gfortran.dg/proc_ptr_comp_51.f90: New test.

Comments

Thomas Koenig June 15, 2017, 1:33 p.m. UTC | #1
Hi Janus,

> It regtests cleanly on x86_64-linux-gnu. Ok for trunk?

OK.

Thanks for the patch!

Regards

	Thomas
Janus Weil June 15, 2017, 9:18 p.m. UTC | #2
2017-06-15 15:33 GMT+02:00 Thomas Koenig <tkoenig@netcologne.de>:
> Hi Janus,
>
>> It regtests cleanly on x86_64-linux-gnu. Ok for trunk?
>
>
> OK.
>
> Thanks for the patch!

Thanks, Thomas! Committed as r249227.

Cheers,
Janus
Christophe Lyon June 16, 2017, 9:11 a.m. UTC | #3
Hi,

On 15 June 2017 at 23:18, Janus Weil <janus@gcc.gnu.org> wrote:
> 2017-06-15 15:33 GMT+02:00 Thomas Koenig <tkoenig@netcologne.de>:
>> Hi Janus,
>>
>>> It regtests cleanly on x86_64-linux-gnu. Ok for trunk?
>>
>>
>> OK.
>>
>> Thanks for the patch!
>
> Thanks, Thomas! Committed as r249227.
>

There's a problem with the new test. It says:
gfortran.dg/proc_ptr_comp_51.f90   -O  : dump file does not exist
UNRESOLVED: gfortran.dg/proc_ptr_comp_51.f90   -O
scan-tree-dump-times original "__builtin_free" 3

You probably either want to add:
! { dg-options "-fdump-tree-original" }
or to remove:
! { dg-final { scan-tree-dump-times "__builtin_free" 3 "original" } }

Thanks,

Christophe

> Cheers,
> Janus
Janus Weil June 16, 2017, 10:16 a.m. UTC | #4
2017-06-16 11:11 GMT+02:00 Christophe Lyon <christophe.lyon@linaro.org>:
> Hi,
>
> On 15 June 2017 at 23:18, Janus Weil <janus@gcc.gnu.org> wrote:
>> 2017-06-15 15:33 GMT+02:00 Thomas Koenig <tkoenig@netcologne.de>:
>>> Hi Janus,
>>>
>>>> It regtests cleanly on x86_64-linux-gnu. Ok for trunk?
>>>
>>>
>>> OK.
>>>
>>> Thanks for the patch!
>>
>> Thanks, Thomas! Committed as r249227.
>>
>
> There's a problem with the new test. It says:
> gfortran.dg/proc_ptr_comp_51.f90   -O  : dump file does not exist
> UNRESOLVED: gfortran.dg/proc_ptr_comp_51.f90   -O
> scan-tree-dump-times original "__builtin_free" 3
>
> You probably either want to add:
> ! { dg-options "-fdump-tree-original" }
> or to remove:
> ! { dg-final { scan-tree-dump-times "__builtin_free" 3 "original" } }

Thanks for your attention, Christophe. I wanted the first of these two
options, but apparently forgot that line ... :(

Fixed with r249243.

Cheers,
Janus
diff mbox

Patch

Index: gcc/fortran/trans-expr.c
===================================================================
--- gcc/fortran/trans-expr.c	(revision 249130)
+++ gcc/fortran/trans-expr.c	(working copy)
@@ -6132,7 +6132,8 @@  gfc_conv_procedure_call (gfc_se * se, gfc_symbol *
      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);