Fortran: Fix mpz and mpfr memory leaks [PR fortran/68800]
gcc/fortran/ChangeLog: PR fortran/68800 * expr.cc (find_array_section): Fix mpz memory leak. * simplify.cc (gfc_simplify_reshape): Fix mpz memory leaks in error paths.
This commit is contained in:
parent
d46b3db4bd
commit
2521390dd2
2 changed files with 9 additions and 4 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue