On 3 April 2023 21:50:49 CEST, Harald Anlauf <anl...@gmx.de> wrote: >Hi Bernhard, > >there is neither context nor a related PR with a testcase showing >that this patch fixes issues seen there.
Yes, i forgot to mention the PR: PR fortran/68800 I did not construct individual test cases but it should be obvious that we should not leak these. > >On 4/2/23 17:05, Bernhard Reutner-Fischer via Gcc-patches wrote: >> From: Bernhard Reutner-Fischer <al...@gcc.gnu.org> >> >> Cc: fort...@gcc.gnu.org >> >> gcc/fortran/ChangeLog: >> >> * array.cc (gfc_ref_dimen_size): Free mpz memory before ICEing. >> * expr.cc (find_array_section): Fix mpz memory leak. >> * simplify.cc (gfc_simplify_reshape): Fix mpz memory leaks in >> error paths. >> (gfc_simplify_set_exponent): Fix mpfr memory leak. >> --- >> gcc/fortran/array.cc | 3 +++ >> gcc/fortran/expr.cc | 8 ++++---- >> gcc/fortran/simplify.cc | 7 ++++++- >> 3 files changed, 13 insertions(+), 5 deletions(-) >> >> diff --git a/gcc/fortran/array.cc b/gcc/fortran/array.cc >> index be5eb8b6a0f..8b1e816a859 100644 >> --- a/gcc/fortran/array.cc >> +++ b/gcc/fortran/array.cc >> @@ -2541,6 +2541,9 @@ gfc_ref_dimen_size (gfc_array_ref *ar, int dimen, >> mpz_t *result, mpz_t *end) >> return t; >> >> default: >> + mpz_clear (lower); >> + mpz_clear (stride); >> + mpz_clear (upper); >> gfc_internal_error ("gfc_ref_dimen_size(): Bad dimen_type"); >> } > >What is the point of clearing variables before issuing a gfc_internal_error? To make it obvious that we are aware that we allocated these. thanks, > >> diff --git a/gcc/fortran/expr.cc b/gcc/fortran/expr.cc >> index 7fb33f81788..b4736804eda 100644 >> --- a/gcc/fortran/expr.cc >> +++ b/gcc/fortran/expr.cc >> @@ -1539,6 +1539,7 @@ find_array_section (gfc_expr *expr, gfc_ref *ref) >> mpz_init_set_ui (delta_mpz, one); >> mpz_init_set_ui (nelts, one); >> mpz_init (tmp_mpz); >> + mpz_init (ptr); >> >> /* Do the initialization now, so that we can cleanup without >> keeping track of where we were. */ >> @@ -1682,7 +1683,6 @@ find_array_section (gfc_expr *expr, gfc_ref *ref) >> mpz_mul (delta_mpz, delta_mpz, tmp_mpz); >> } >> >> - mpz_init (ptr); >> cons = gfc_constructor_first (base); >> >> /* Now clock through the array reference, calculating the index in >> @@ -1735,7 +1735,8 @@ find_array_section (gfc_expr *expr, gfc_ref *ref) >> "at %L requires an increase of the allowed %d " >> "upper limit. See %<-fmax-array-constructor%> " >> "option", &expr->where, flag_max_array_constructor); >> - return false; >> + t = false; >> + goto cleanup; >> } >> >> cons = gfc_constructor_lookup (base, limit); >> @@ -1750,8 +1751,6 @@ find_array_section (gfc_expr *expr, gfc_ref *ref) >> gfc_copy_expr (cons->expr), NULL); >> } >> >> - mpz_clear (ptr); >> - >> cleanup: >> >> mpz_clear (delta_mpz); >> @@ -1765,6 +1764,7 @@ cleanup: >> mpz_clear (ctr[d]); >> mpz_clear (stride[d]); >> } >> + mpz_clear (ptr); >> gfc_constructor_free (base); >> return t; >> } >> diff --git a/gcc/fortran/simplify.cc b/gcc/fortran/simplify.cc >> index ecf0e3558df..d1f06335e79 100644 >> --- a/gcc/fortran/simplify.cc >> +++ b/gcc/fortran/simplify.cc >> @@ -6866,6 +6866,7 @@ gfc_simplify_reshape (gfc_expr *source, gfc_expr >> *shape_exp, >> gfc_error ("The SHAPE array for the RESHAPE intrinsic at %L has a " >> "negative value %d for dimension %d", >> &shape_exp->where, shape[rank], rank+1); >> + mpz_clear (index); >> return &gfc_bad_expr; >> } >> >> @@ -6889,6 +6890,7 @@ gfc_simplify_reshape (gfc_expr *source, gfc_expr >> *shape_exp, >> { >> gfc_error ("Shapes of ORDER at %L and SHAPE at %L are different", >> &order_exp->where, &shape_exp->where); >> + mpz_clear (index); >> return &gfc_bad_expr; >> } >> >> @@ -6902,6 +6904,7 @@ gfc_simplify_reshape (gfc_expr *source, gfc_expr >> *shape_exp, >> { >> gfc_error ("Sizes of ORDER at %L and SHAPE at %L are different", >> &order_exp->where, &shape_exp->where); >> + mpz_clear (index); >> return &gfc_bad_expr; >> } >> >> @@ -6918,6 +6921,7 @@ gfc_simplify_reshape (gfc_expr *source, gfc_expr >> *shape_exp, >> "in the range [1, ..., %d] for the RESHAPE intrinsic " >> "near %L", order[i], &order_exp->where, rank, >> &shape_exp->where); >> + mpz_clear (index); >> return &gfc_bad_expr; >> } >> >> @@ -6926,6 +6930,7 @@ gfc_simplify_reshape (gfc_expr *source, gfc_expr >> *shape_exp, >> { >> gfc_error ("ORDER at %L is not a permutation of the size of " >> "SHAPE at %L", &order_exp->where, &shape_exp->where); >> + mpz_clear (index); >> return &gfc_bad_expr; >> } >> x[order[i]] = 1; >> @@ -7408,7 +7413,7 @@ gfc_simplify_set_exponent (gfc_expr *x, gfc_expr *i) >> exp2 = (unsigned long) mpz_get_d (i->value.integer); >> mpfr_mul_2exp (result->value.real, frac, exp2, GFC_RND_MODE); >> >> - mpfr_clears (absv, log2, pow2, frac, NULL); >> + mpfr_clears (exp, absv, log2, pow2, frac, NULL); >> >> return range_check (result, "SET_EXPONENT"); >> } >