Hi Thomas,

OK for master.

Thanks for working on this one!

Paul


On Fri, 16 Oct 2020 at 20:33, Thomas Koenig via Fortran <fort...@gcc.gnu.org>
wrote:

> Hello world,
>
> here's a patch which corrects some wrong declarations (and fixes
> the segfault for FINDLOC on Darwin ARM).
>
> Regression-tested. OK for trunk?
>
> Best regards
>
>         Thomas
>
> Correct decls for functions which do not pass actual arguments.
>
> A wrong decl for findloc caused segfaults at runtime on
> Darwin for ARM; however, this is only a symptom of a larger
> disease: The declarations for our library functions are often
> inconsistent.  This patch solves that problem for the functions
> specifically for the functions for which we do not pass optional
> arguments, i.e. findloc and (min|max)loc.
>
> It works by saving the symbols of the specific functions in
> gfc_intrinsic_namespace and by generating the formal argument
> lists from the actual argument lists.  Because symbols are
> re-used, so are the backend decls.
>
> gcc/fortran/ChangeLog:
>
>         PR fortran/97454
>         * gfortran.h (gfc_symbol): Add pass_as_value flag.
>         (gfc_copy_formal_args_intr): Add optional argument
>         copy_type.
>         (gfc_get_intrinsic_function_symbol): Add prototype.
>         (gfc_find_intrinsic_symbol): Add prototype.
>         * intrinsic.c (gfc_get_intrinsic_function_symbol): New function.
>         (gfc_find_intrinsic_symbol): New function.
>         * symbol.c (gfc_copy_formal_args_intr): Add argument. Handle case
>         where the type needs to be copied from the actual argument.
>         * trans-intrinsic.c (remove_empty_actual_arguments): New function.
>         (specific_intrinsic_symbol): New function.
>         (gfc_conv_intrinsic_funcall): Use it.
>         (strip_kind_from_actual): Adjust so that the expression pointer
>         is set to NULL.
>         (gfc_conv_intrinsic_minmaxloc): Likewise.
>         (gfc_conv_intrinsic_minmaxval): Adjust removal of dim.
>         * trans-types.c (gfc_sym_type): If sym->pass_as_value is set, do
>         not pass by reference.
>


-- 
"If you can't explain it simply, you don't understand it well enough" -
Albert Einstein

Reply via email to