[PATCH] fortran/28548 -- Optional argument fails.
Paul Thomas
paulthomas2@wanadoo.fr
Fri Aug 4 16:42:00 GMT 2006
Steve,
OK with the proviso that the error is turned into a warning; yes, I
think that Martin is correct about the standard stating that this is
only an error if the argument is missing. Applying a runtime error
looked horribly messy, although a library function might be the way
around it. I have suggested a new wording in a Bugzilla atachment to
the PR. This means that the dg-error's in the original testcase must be
changed to dg-warning's. Would it be an idea to make this conditional
on -pedantic too?
I do apologise for not reading the section 12.4.1.5 carefully enough and
thank you, Steve, for covering my a**e whilst I was away. An upside is
that we have all learned that attr.elemental is not always what it
appears to be!
Best regards and thanks
Paul
>The attach patch appears to fix the problem noted in
>fortran/28548. The problem is that the internal functions
>__convert_* are marked as elemental Fortran procedures,
>so that the elemental infrastructure can be used to deal
>with both scalar and array arguments. Enforcement of
>section 12.4.1.5 of the standard is catching these
>functions (as it should if these weren't internal functions).
>
>I've bootstrapped and regression tested this patch on
>i386-*-freebsd.
>
>2006-08-01 Steven G. Kargl <kargls@comcast.net>
>
> PR fortran/28548
> * resolve.c (resolve_elemental_actual): Special case __convert_*
> with respect to section 12.4.1.5.
>
> * gfortran.dg/internal_convert.f90: New test.
>
>
>
>------------------------------------------------------------------------
>
>Index: resolve.c
>===================================================================
>--- resolve.c (revision 115827)
>+++ resolve.c (working copy)
>@@ -1012,7 +1012,8 @@
> && arg->expr->symtree->n.sym->attr.optional
> && formal_optional
> && arg->expr->rank
>- && (set_by_optional || arg->expr->rank != rank))
>+ && (set_by_optional || arg->expr->rank != rank)
>+ && !(isym && isym->generic_id == GFC_ISYM_CONVERSION))
> {
> gfc_error ("'%s' at %L is an array and OPTIONAL; it cannot "
> "therefore be an actual argument of an ELEMENTAL "
>
>
>------------------------------------------------------------------------
>
>! { dg-do compile }
>! Test fix for PR fortran/28548.
>!
>SUBROUTINE foo(a, d)
> real a
> integer, dimension(3), optional :: d
> if (present(d)) d = d + a
>END SUBROUTINE
>
>
More information about the Gcc-patches
mailing list