re PR fortran/80983 ([F03] memory leak when calling procedure-pointer component with...
authorJanus Weil <janus@gcc.gnu.org>
Thu, 15 Jun 2017 21:17:48 +0000 (23:17 +0200)
committerJanus Weil <janus@gcc.gnu.org>
Thu, 15 Jun 2017 21:17:48 +0000 (23:17 +0200)
2017-06-15  Janus Weil  <janus@gcc.gnu.org>

PR fortran/80983
* 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/80983
* gfortran.dg/proc_ptr_comp_51.f90: New test.

From-SVN: r249227

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

index ec28113820ec396dc7f1b29744b61a6f919fa499..8e9e9a66d620fdbf933f91489c1f93e2cb366da3 100644 (file)
@@ -1,3 +1,9 @@
+2017-06-15  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/80983
+       * trans-expr.c (gfc_conv_procedure_call): Deallocate the result of
+       scalar allocatable procedure-pointer components.
+
 2017-06-10  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR fortran/80988
index 6af287e648c8c79e563e5ece4fcab23d2e566d32..acd0428eae6bf563b0e62a8afc0ad5119c6364a6 100644 (file)
@@ -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);
index a79f533992ef0703cc3c506ac65b311bc9a0ec51..34b6a9d9f1f096bfcc31480a86b7e33fe2a39ac3 100644 (file)
@@ -1,3 +1,8 @@
+2017-06-15  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/80983
+       * gfortran.dg/proc_ptr_comp_51.f90: New test.
+
 2017-06-15  Thomas Preud'homme  <thomas.preudhomme@arm.com>
 
        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 (file)
index 0000000..530872b
--- /dev/null
@@ -0,0 +1,35 @@
+! { dg-do compile }
+!
+! PR 80983: [F03] memory leak when calling procedure-pointer component with allocatable result
+!
+! Contributed by Janus Weil <janus@gcc.gnu.org>
+
+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" } }