Skip to content

Commit 2a474c2

Browse files
committed
Fortran: fix front-end GMP memleaks
gcc/fortran/ChangeLog: * check.cc (gfc_check_random_seed): Clear gmp variables returned by gfc_array_size. * expr.cc (gfc_check_pointer_assign): Likewise.
1 parent 9e1063c commit 2a474c2

File tree

2 files changed

+31
-15
lines changed

2 files changed

+31
-15
lines changed

gcc/fortran/check.cc

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7155,12 +7155,16 @@ gfc_check_random_seed (gfc_expr *size, gfc_expr *put, gfc_expr *get)
71557155
if (!kind_value_check (put, 1, gfc_default_integer_kind))
71567156
return false;
71577157

7158-
if (gfc_array_size (put, &put_size)
7159-
&& mpz_get_ui (put_size) < seed_size)
7160-
gfc_error ("Size of %qs argument of %qs intrinsic at %L "
7161-
"too small (%i/%i)",
7162-
gfc_current_intrinsic_arg[1]->name, gfc_current_intrinsic,
7163-
&put->where, (int) mpz_get_ui (put_size), seed_size);
7158+
if (gfc_array_size (put, &put_size))
7159+
{
7160+
if (mpz_get_ui (put_size) < seed_size)
7161+
gfc_error ("Size of %qs argument of %qs intrinsic at %L "
7162+
"too small (%i/%i)",
7163+
gfc_current_intrinsic_arg[1]->name,
7164+
gfc_current_intrinsic,
7165+
&put->where, (int) mpz_get_ui (put_size), seed_size);
7166+
mpz_clear (put_size);
7167+
}
71647168
}
71657169

71667170
if (get != NULL)
@@ -7187,12 +7191,16 @@ gfc_check_random_seed (gfc_expr *size, gfc_expr *put, gfc_expr *get)
71877191
if (!kind_value_check (get, 2, gfc_default_integer_kind))
71887192
return false;
71897193

7190-
if (gfc_array_size (get, &get_size)
7191-
&& mpz_get_ui (get_size) < seed_size)
7192-
gfc_error ("Size of %qs argument of %qs intrinsic at %L "
7193-
"too small (%i/%i)",
7194-
gfc_current_intrinsic_arg[2]->name, gfc_current_intrinsic,
7195-
&get->where, (int) mpz_get_ui (get_size), seed_size);
7194+
if (gfc_array_size (get, &get_size))
7195+
{
7196+
if (mpz_get_ui (get_size) < seed_size)
7197+
gfc_error ("Size of %qs argument of %qs intrinsic at %L "
7198+
"too small (%i/%i)",
7199+
gfc_current_intrinsic_arg[2]->name,
7200+
gfc_current_intrinsic,
7201+
&get->where, (int) mpz_get_ui (get_size), seed_size);
7202+
mpz_clear (get_size);
7203+
}
71967204
}
71977205

71987206
/* RANDOM_SEED may not have more than one non-optional argument. */

gcc/fortran/expr.cc

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4364,16 +4364,24 @@ gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue,
43644364

43654365
/* If this can be determined, check that the target must be at least as
43664366
large as the pointer assigned to it is. */
4367-
if (gfc_array_size (lvalue, &lsize)
4368-
&& gfc_array_size (rvalue, &rsize)
4369-
&& mpz_cmp (rsize, lsize) < 0)
4367+
bool got_lsize = gfc_array_size (lvalue, &lsize);
4368+
bool got_rsize = got_lsize && gfc_array_size (rvalue, &rsize);
4369+
bool too_small = got_rsize && mpz_cmp (rsize, lsize) < 0;
4370+
4371+
if (too_small)
43704372
{
43714373
gfc_error ("Rank remapping target is smaller than size of the"
43724374
" pointer (%ld < %ld) at %L",
43734375
mpz_get_si (rsize), mpz_get_si (lsize),
43744376
&lvalue->where);
4377+
mpz_clear (lsize);
4378+
mpz_clear (rsize);
43754379
return false;
43764380
}
4381+
if (got_lsize)
4382+
mpz_clear (lsize);
4383+
if (got_rsize)
4384+
mpz_clear (rsize);
43774385

43784386
/* An assumed rank target is an experimental F202y feature. */
43794387
if (rvalue->rank == -1 && !(gfc_option.allow_std & GFC_STD_F202Y))

0 commit comments

Comments
 (0)