https://gcc.gnu.org/bugzilla/show_bug.cgi?id=125782

Jerry DeLisle <jvdelisle at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
           Assignee|unassigned at gcc dot gnu.org      |jvdelisle at gcc dot 
gnu.org
   Last reconfirmed|                            |2026-06-14
     Ever confirmed|0                           |1

--- Comment #1 from Jerry DeLisle <jvdelisle at gcc dot gnu.org> ---
This fixes it.

diff --git a/gcc/fortran/trans-stmt.cc b/gcc/fortran/trans-stmt.cc
index de9989a010f..08ae5744d5a 100644
--- a/gcc/fortran/trans-stmt.cc
+++ b/gcc/fortran/trans-stmt.cc
@@ -2377,8 +2377,12 @@ trans_associate_var (gfc_symbol *sym, gfc_wrapped_block
*block)
          gfc_add_modify (&se.pre, sym->ts.u.cl->backend_decl,
                          fold_convert (TREE_TYPE (sym->ts.u.cl->backend_decl),
                                        se.string_length));
-         if (e->expr_type == EXPR_FUNCTION)
+         if (e->expr_type == EXPR_FUNCTION && gfc_expr_attr (e).pointer)
            {
+             /* For an allocatable function result, the result temporary
+                is already freed by the procedure call's cleanup code;
+                freeing it again here would be a double free.  A pointer
+                result is not freed there, so do it here.  */
              tmp = gfc_call_free (sym->backend_decl);
              gfc_add_expr_to_block (&se.post, tmp);
            }

Reply via email to