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