From: Mikael Morin Date: Wed, 28 Jul 2010 17:33:37 +0000 (+0000) Subject: decl.c (free_value): Also free repeat field. X-Git-Tag: releases/gcc-4.6.0~5351 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c9d75a48c4ea63ab27ccdb40f993236289b243f2;p=thirdparty%2Fgcc.git decl.c (free_value): Also free repeat field. 2010-07-28 Mikael Morin * decl.c (free_value): Also free repeat field. * data.c (gfc_assign_data_value): Always free offset before returning. From-SVN: r162649 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index c87b61190429..37da9fd5d44d 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2010-07-28 Mikael Morin + + * decl.c (free_value): Also free repeat field. + * data.c (gfc_assign_data_value): Always free offset before returning. + 2010-07-28 Daniel Kraft * gfortran.h (gfc_build_intrinsic_call): New method. diff --git a/gcc/fortran/data.c b/gcc/fortran/data.c index dd5e62cb2de4..6829fe9cd03f 100644 --- a/gcc/fortran/data.c +++ b/gcc/fortran/data.c @@ -244,7 +244,7 @@ gfc_assign_data_value (gfc_expr *lvalue, gfc_expr *rvalue, mpz_t index) gfc_error ("'%s' at %L already is initialized at %L", lvalue->symtree->n.sym->name, &lvalue->where, &init->where); - return FAILURE; + goto abort; } if (init == NULL) @@ -267,7 +267,7 @@ gfc_assign_data_value (gfc_expr *lvalue, gfc_expr *rvalue, mpz_t index) { gfc_error ("Data element below array lower bound at %L", &lvalue->where); - return FAILURE; + goto abort; } else { @@ -275,12 +275,12 @@ gfc_assign_data_value (gfc_expr *lvalue, gfc_expr *rvalue, mpz_t index) if (spec_size (ref->u.ar.as, &size) == SUCCESS) { if (mpz_cmp (offset, size) >= 0) - { - mpz_clear (size); - gfc_error ("Data element above array upper bound at %L", - &lvalue->where); - return FAILURE; - } + { + mpz_clear (size); + gfc_error ("Data element above array upper bound at %L", + &lvalue->where); + goto abort; + } mpz_clear (size); } } @@ -336,6 +336,8 @@ gfc_assign_data_value (gfc_expr *lvalue, gfc_expr *rvalue, mpz_t index) last_con = con; } + mpz_clear (offset); + if (ref || last_ts->type == BT_CHARACTER) { if (lvalue->ts.u.cl->length == NULL && !(ref && ref->u.ss.length != NULL)) @@ -371,6 +373,10 @@ gfc_assign_data_value (gfc_expr *lvalue, gfc_expr *rvalue, mpz_t index) last_con->expr = expr; return SUCCESS; + +abort: + mpz_clear (offset); + return FAILURE; } diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 9515676acc9b..acc85d25484d 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -134,6 +134,7 @@ free_value (gfc_data_value *p) for (; p; p = q) { q = p->next; + mpz_clear (p->repeat); gfc_free_expr (p->expr); gfc_free (p); }