Patchwork [Fortran] ANother two memory leaks plugged

login
register
mail settings
Submitter Tobias Burnus
Date Aug. 28, 2012, 2:50 p.m.
Message ID <503CDAB8.3020504@net-b.de>
Download mbox | patch
Permalink /patch/180509/
State New
Headers show

Comments

Tobias Burnus - Aug. 28, 2012, 2:50 p.m.
First, I have now regtested and committed the show_locus bug fix as Rev. 
190752.
Cf. http://gcc.gnu.org/ml/fortran/2012-08/msg00197.html

Secondly, the attached patch fixes two valgrind-reported memory issues 
when compiling the Polyhedron 2005 files:

a) decl.c: DATA statement's value matching. Here, one calls 
gfc_match_rvalue, but if one doesn't have a structure constructor, one 
ignores the result and continues by trying to match other kinds of 
expressions, without freeing the previous result.

b) When resolving DATA, temporary variables weren't released.

Build and regtested on x86-64-linux.
Committed as Rev. 190751.

Tobias

Patch

Index: gcc/fortran/ChangeLog
===================================================================
--- gcc/fortran/ChangeLog	(revision 190750)
+++ gcc/fortran/ChangeLog	(working copy)
@@ -1,6 +1,15 @@ 
 2012-08-28  Tobias Burnus  <burnus@net-b.de>
 
 	PR fortran/54384
+	* decl.c (match_data_constant): Add missing gfc_free_expr.
+	(top_val_list): Remove always-true condition.
+	* data.c (get_array_index, create_character_initializer):
+	Free temporary expressions.
+	(gfc_assign_data_value): Free expression when aborting.
+
+2012-08-28  Tobias Burnus  <burnus@net-b.de>
+
+	PR fortran/54384
 	* symbol.c (gfc_copy_formal_args): Set also sym->formal_ns.
 
 2012-08-27  Tobias Burnus  <burnus@net-b.de>
Index: gcc/fortran/data.c
===================================================================
--- gcc/fortran/data.c	(revision 190750)
+++ gcc/fortran/data.c	(working copy)
@@ -66,6 +66,7 @@  get_array_index (gfc_array_ref *ar, mpz_t *offset)
 	gfc_error ("non-constant array in DATA statement %L", &ar->where);
 
       mpz_set (tmp, e->value.integer);
+      gfc_free_expr (e);
       mpz_sub (tmp, tmp, ar->as->lower[i]->value.integer);
       mpz_mul (tmp, tmp, delta);
       mpz_add (*offset, tmp, *offset);
@@ -138,8 +139,10 @@  create_character_initializer (gfc_expr *init, gfc_
 	}
 
       gfc_extract_int (start_expr, &start);
+      gfc_free_expr (start_expr);
       start--;
       gfc_extract_int (end_expr, &end);
+      gfc_free_expr (end_expr);
     }
   else
     {
@@ -200,7 +203,7 @@  gfc_assign_data_value (gfc_expr *lvalue, gfc_expr
 {
   gfc_ref *ref;
   gfc_expr *init;
-  gfc_expr *expr;
+  gfc_expr *expr = NULL;
   gfc_constructor *con;
   gfc_constructor *last_con;
   gfc_symbol *symbol;
@@ -500,6 +503,8 @@  gfc_assign_data_value (gfc_expr *lvalue, gfc_expr
   return SUCCESS;
 
 abort:
+  if (!init)
+    gfc_free_expr (expr);
   mpz_clear (offset);
   return FAILURE;
 }
Index: gcc/fortran/decl.c
===================================================================
--- gcc/fortran/decl.c	(revision 190750)
+++ gcc/fortran/decl.c	(working copy)
@@ -361,6 +361,8 @@  match_data_constant (gfc_expr **result)
 	m = MATCH_ERROR;
       return m;
     }
+  else if (m == MATCH_YES)
+    gfc_free_expr (*result);
 
   gfc_current_locus = old_loc;
 
@@ -451,8 +453,7 @@  top_val_list (gfc_data *data)
 	}
       else
 	{
-	  if (expr->ts.type == BT_INTEGER)
-	    mpz_set (tail->repeat, expr->value.integer);
+	  mpz_set (tail->repeat, expr->value.integer);
 	  gfc_free_expr (expr);
 
 	  m = match_data_constant (&tail->expr);