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

--- Comment #19 from Steve Kargl <sgk at troutmask dot apl.washington.edu> ---
On Thu, Apr 20, 2023 at 05:22:59AM +0000, kargl at gcc dot gnu.org wrote:
> 
> I think we agree on all points.  Here's the diff I envision.
> NOte, I've restricted it to user defined functions.  Remove 
> the esym check will enable it for any subprogram.
> 
> 
> diff --git a/gcc/fortran/interface.cc b/gcc/fortran/interface.cc
> index db79b104dc2..f3bcdd76d6a 100644
> --- a/gcc/fortran/interface.cc
> +++ b/gcc/fortran/interface.cc
> @@ -3622,6 +3622,18 @@ gfc_compare_actual_formal (gfc_actual_arglist **ap,
> gfc_formal_arglist *formal,
>           goto match;
>         }
> 
> +      if (a->expr->expr_type == EXPR_FUNCTION
> +         && a->expr->value.function.esym
> +         && f->sym->attr.allocatable)
> +       {
> +         if (where)
> +           gfc_error ("Actual argument for %qs at %L is a function result "
> +                       "and the dummy argument is ALLOCATABLE",
> +                       f->sym->name, &a->expr->where);
> +         ok = false;
> +         goto match;
> +       }
> +
>        /* Check intent = OUT/INOUT for definable actual argument.  */
>        if (!in_statement_function
>           && (f->sym->attr.intent == INTENT_OUT
> 

The patch passes regtesting.

PS: I think what you want to with a runtime check and an undefine
function result is a good idea.  I haven't looked to see where
and how hard this might be to implement.

Reply via email to