]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fortran: fix several front-end memleaks
authorHarald Anlauf <anlauf@gmx.de>
Tue, 29 Oct 2024 20:52:27 +0000 (21:52 +0100)
committerHarald Anlauf <anlauf@gmx.de>
Wed, 30 Oct 2024 10:20:10 +0000 (11:20 +0100)
gcc/fortran/ChangeLog:

* trans-expr.cc (gfc_trans_class_init_assign): Free intermediate
gfc_expr's.
* trans.cc (get_final_proc_ref): Likewise.
(get_elem_size): Likewise.
(gfc_add_finalizer_call): Likewise.

gcc/fortran/trans-expr.cc
gcc/fortran/trans.cc

index ff8cde93ef4fc4e17e3c278bac7398270cbcb714..ddbb5ecf068a4433f629c36ad4df3417ebcd334b 100644 (file)
@@ -1890,6 +1890,8 @@ gfc_trans_class_init_assign (gfc_code *code)
     }
 
   gfc_add_expr_to_block (&block, tmp);
+  gfc_free_expr (lhs);
+  gfc_free_expr (rhs);
 
   return gfc_finish_block (&block);
 }
index 58b93e233a1cac83af39b81fec69b01e4515d7ec..1a0ba63705867c6e783888fb072cf166900b8854 100644 (file)
@@ -1128,6 +1128,9 @@ get_final_proc_ref (gfc_se *se, gfc_expr *expr, tree class_container)
 
   if (POINTER_TYPE_P (TREE_TYPE (se->expr)))
     se->expr = build_fold_indirect_ref_loc (input_location, se->expr);
+
+  if (expr->ts.type != BT_DERIVED && !using_class_container)
+    gfc_free_expr (final_wrapper);
 }
 
 
@@ -1155,6 +1158,7 @@ get_elem_size (gfc_se *se, gfc_expr *expr, tree class_container)
 
       gfc_conv_expr (se, class_size);
       gcc_assert (se->post.head == NULL_TREE);
+      gfc_free_expr (class_size);
     }
 }
 
@@ -1467,6 +1471,7 @@ gfc_add_finalizer_call (stmtblock_t *block, gfc_expr *expr2,
 
   gfc_add_expr_to_block (block, tmp);
   gfc_add_block_to_block (block, &final_se.post);
+  gfc_free_expr (expr);
 
   return true;
 }