Dear all,

the attached patch fixes the following minor issues found by running
f951 under valgrind for the just added new testcases coindexed_6.f90
and coindexed_7.f90:

- minor front-end memleaks with non-freed strings and lost GMP variables
 (these are simple and obvious fixes)

- an inconsistency between pure/elemental functions being either
 non-intrinsic or intrinsic.  Checking for the latter was likely missed
 from the beginning.

No new testcase.

Regtested on x86_64-pc-linux-gnu.  OK for mainline?

Thanks,
Harald

From 1630d24e3e1d3ab5ae6450da0da555f4eed6339c Mon Sep 17 00:00:00 2001
From: Harald Anlauf <anl...@gmx.de>
Date: Tue, 1 Jul 2025 21:41:53 +0200
Subject: [PATCH] Fortran: fix minor issues with coarrays

gcc/fortran/ChangeLog:

	* coarray.cc (check_add_new_component): Treat pure and elemental
	intrinsic functions the same as non-intrinsic ones.
	(create_caf_add_data_parameter_type): Fix front-end memleaks.
	* trans-intrinsic.cc (conv_caf_func_index): Likewise.
---
 gcc/fortran/coarray.cc         | 7 +++++--
 gcc/fortran/trans-intrinsic.cc | 2 +-
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/gcc/fortran/coarray.cc b/gcc/fortran/coarray.cc
index 6914697c78b..ef8fd4e42d0 100644
--- a/gcc/fortran/coarray.cc
+++ b/gcc/fortran/coarray.cc
@@ -697,7 +697,10 @@ check_add_new_component (gfc_symbol *type, gfc_expr *e, gfc_symbol *add_data)
 	  break;
 	case EXPR_FUNCTION:
 	  if (!e->symtree->n.sym->attr.pure
-	      && !e->symtree->n.sym->attr.elemental)
+	      && !e->symtree->n.sym->attr.elemental
+	      && !(e->value.function.isym
+		   && (e->value.function.isym->pure
+		       || e->value.function.isym->elemental)))
 	    /* Treat non-pure/non-elemental functions.  */
 	    check_add_new_comp_handle_array (e, type, add_data);
 	  else
@@ -743,7 +746,6 @@ create_caf_add_data_parameter_type (gfc_expr *expr, gfc_namespace *ns,
   add_data->as->lower[0]
     = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
 			     &expr->where);
-  mpz_init (add_data->as->lower[0]->value.integer);
   mpz_set_si (add_data->as->lower[0]->value.integer, 1);
 
   for (gfc_ref *ref = expr->ref; ref; ref = ref->next)
@@ -763,6 +765,7 @@ create_caf_add_data_parameter_type (gfc_expr *expr, gfc_namespace *ns,
   type->declared_at = expr->where;
   gfc_set_sym_referenced (type);
   gfc_commit_symbol (type);
+  free (name);
   return type;
 }
 
diff --git a/gcc/fortran/trans-intrinsic.cc b/gcc/fortran/trans-intrinsic.cc
index fce5ee28de8..f1bfd3eee51 100644
--- a/gcc/fortran/trans-intrinsic.cc
+++ b/gcc/fortran/trans-intrinsic.cc
@@ -1052,7 +1052,7 @@ conv_caf_func_index (stmtblock_t *block, gfc_namespace *ns, const char *pat,
   index_st->n.sym->value
     = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
 			     &gfc_current_locus);
-  mpz_init_set_si (index_st->n.sym->value->value.integer, -1);
+  mpz_set_si (index_st->n.sym->value->value.integer, -1);
   index_st->n.sym->ts.type = BT_INTEGER;
   index_st->n.sym->ts.kind = gfc_default_integer_kind;
   gfc_set_sym_referenced (index_st->n.sym);
-- 
2.43.0

Reply via email to