[fortran patch] Don't use TREE_LISTs for storing arguments to intrinsic functions

Brooks Moses brooks.moses@codesourcery.com
Wed May 9 00:31:00 GMT 2007


Lee Millward wrote:
> To illustrate this take gfc_conv_intrinsic_aint for example which
> creates space for two arguments, here the code is only interested in
> the first argument, but making the change to only pass a single
> argument to gfc_conv_intrinsic_function_args with the new assertion
> will trigger failures in tests like aint_anint_1.f90. From what I'm
> able to determine the need for allowing two arguments here (and in
> gfc_conv_intrinsic_int) dates back to Fortran 77 where intrinsics like
> AINT and INT can optionally have a "kind" parameter.

Right, yes, although this has nothing to do with Fortran 77.  The 
problem is that AINT, INT, and so on allow an optional KIND parameter, 
which is only used in the front-end to figure out which library function 
to call, and never has any generated code associated with it.

Am I correct in understanding that this is why you have things set up so 
that gfc_conv_intrinsic_aint (for example) declares args as a 
two-element array rather than a single value?  (Otherwise, I suppose it 
would trigger the "curr_arg < nargs" assertion if the KIND argument is 
present....)

I think this ends up being unfortunate in a number of ways.  The 
declaration of args in gfc_conv_intrinsic_aint as larger than we need is 
one of them, and the fact that we can't guarantee that the args array 
gets filled is another.  Thus, I would suggest rearranging things, as 
follows:

(1) Change the main loop in gfc_conv_intrinsic_function_args to:

   for (int curr_arg = 0; curr_arg < nargs; curr_arg++,
        actual = actual->next,
        formal = formal ? formal->next : NULL)

(2) Remove the gcc_assert(curr_arg < nargs), and add gcc_assert(actual) 
in its place.

The result of those two is that we guarantee that the args array gets 
filled, but we don't necessarily loop over the whole arglist.  That is, 
we now allow the arglist to be longer than the args array, and we no 
longer allow it to be shorter.  That leads to:

(3) Change gfc_conv_intrinsic_aint and other similar functions to only 
call for one argument, rather than two.

Oh, and:

(4) Add a comment somewhere that says that we are explicitly ignoring 
arguments past nargs in the arglist, in order to account for trailing 
KIND arguments that are not included in the generated code.  :)

Does that seem reasonable?

Thanks (and apologies for putting this through so many iterations!),
- Brooks



More information about the Fortran mailing list