]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fortran: fix minor front-end memleaks
authorHarald Anlauf <anlauf@gmx.de>
Tue, 26 Nov 2024 19:37:35 +0000 (20:37 +0100)
committerHarald Anlauf <anlauf@gmx.de>
Tue, 26 Nov 2024 22:09:40 +0000 (23:09 +0100)
gcc/fortran/ChangeLog:

* expr.cc (find_inquiry_ref): Fix memleak introduced by scanning
the reference chain to find and simplify inquiry references.
* symbol.cc (gfc_copy_formal_args_intr): Free formal namespace
when not needed to avoid a front-end memleak.

gcc/fortran/expr.cc
gcc/fortran/symbol.cc

index 6b40e8e0aa5b62dfb7090cdcfcfec05111d8c31c..a997bdae726a1aaf57075f7ba08002d23c4d4ffa 100644 (file)
@@ -1833,6 +1833,7 @@ find_inquiry_ref (gfc_expr *p, gfc_expr **newp)
 {
   gfc_ref *ref;
   gfc_ref *inquiry = NULL;
+  gfc_ref *inquiry_head;
   gfc_expr *tmp;
 
   tmp = gfc_copy_expr (p);
@@ -1858,6 +1859,7 @@ find_inquiry_ref (gfc_expr *p, gfc_expr **newp)
       return false;
     }
 
+  inquiry_head = inquiry;
   gfc_resolve_expr (tmp);
 
   /* Leave these to the backend since the type and kind is not confirmed until
@@ -1930,7 +1932,7 @@ find_inquiry_ref (gfc_expr *p, gfc_expr **newp)
                    mpc_imagref (tmp->value.complex), GFC_RND_MODE);
          break;
        }
-      // TODO: Fix leaking expr tmp, when simplify is done twice.
+
       if (inquiry->next)
        gfc_replace_expr (tmp, *newp);
     }
@@ -1944,10 +1946,12 @@ find_inquiry_ref (gfc_expr *p, gfc_expr **newp)
     }
 
   gfc_free_expr (tmp);
+  gfc_free_ref_list (inquiry_head);
   return true;
 
 cleanup:
   gfc_free_expr (tmp);
+  gfc_free_ref_list (inquiry_head);
   return false;
 }
 
index e803cdd93c9a7f1cbf0d6bcbf4d9e47b8ddb8ba2..f13cb1883ead1b6eff63fe493d779cd53e45a2e6 100644 (file)
@@ -4910,6 +4910,8 @@ gfc_copy_formal_args_intr (gfc_symbol *dest, gfc_intrinsic_sym *src,
   if (dest->formal != NULL)
     /* The current ns should be that for the dest proc.  */
     dest->formal_ns = gfc_current_ns;
+  else
+    gfc_free_namespace (gfc_current_ns);
   /* Restore the current namespace to what it was on entry.  */
   gfc_current_ns = parent_ns;
 }