re PR fortran/54384 (gfortran memory leaks)
authorTobias Burnus <burnus@net-b.de>
Tue, 28 Aug 2012 14:49:15 +0000 (16:49 +0200)
committerTobias Burnus <burnus@gcc.gnu.org>
Tue, 28 Aug 2012 14:49:15 +0000 (16:49 +0200)
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.

From-SVN: r190751

gcc/fortran/ChangeLog
gcc/fortran/data.c
gcc/fortran/decl.c

index 2b316774906e25383266fe6eb8800e368fe6cb4c..f9bbf8a167e7b495411692b0fd7969fbd69754fc 100644 (file)
@@ -1,3 +1,12 @@
+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
index 385ca898dcd44cb78a9f21ff52f4b2307d8fcc13..de8c0ca8f5c9e1612e370282182579431d08dd84 100644 (file)
@@ -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_typespec *ts,
        }
 
       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 *rvalue, mpz_t index,
 {
   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 *rvalue, mpz_t index,
   return SUCCESS;
 
 abort:
+  if (!init)
+    gfc_free_expr (expr);
   mpz_clear (offset);
   return FAILURE;
 }
index efd21dc7ec713b06c93c2746d1f0cd243e1a954f..6f609e9a5a79fe2e67a50de60820ab634f2a880b 100644 (file)
@@ -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);