Dear all,

the attached patch fixes two minor front-end memleaks I saw when working
on recent PRs (pr117774 is one of them) and running f951 under valgrind.

Regtested on x86_64-pc-linux-gnu.  OK for mainline?

Thanks,
Harald

From d5236446302a01eb11c017862a0813fafd0b95a1 Mon Sep 17 00:00:00 2001
From: Harald Anlauf <anl...@gmx.de>
Date: Tue, 26 Nov 2024 20:37:35 +0100
Subject: [PATCH] Fortran: fix minor front-end memleaks

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   | 6 +++++-
 gcc/fortran/symbol.cc | 2 ++
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/gcc/fortran/expr.cc b/gcc/fortran/expr.cc
index 6b40e8e0aa5..a997bdae726 100644
--- a/gcc/fortran/expr.cc
+++ b/gcc/fortran/expr.cc
@@ -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;
 }

diff --git a/gcc/fortran/symbol.cc b/gcc/fortran/symbol.cc
index e803cdd93c9..f13cb1883ea 100644
--- a/gcc/fortran/symbol.cc
+++ b/gcc/fortran/symbol.cc
@@ -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;
 }
--
2.35.3

Reply via email to