Am 17.07.19 um 19:53 schrieb Kwok Cheung Yeung: > On 12/07/2019 12:41 pm, Jakub Jelinek wrote: >> This should be done through a langhook. >> Are really all PARM_DECLs wtih DECL_BY_REFERENCE and pointer type >> optional >> arguments? I mean, POINTER_TYPE is used for a lot of cases. > > Hmmm... I thought it was the case that if you pass an argument in by > reference (the default) in Fortran, the PARM_DECL will always be a > reference to the argument type if non-optional, or a pointer if > optional. However, fixed-shape arrays are passed in via a pointer > whether optional or not...
[I have to admit that I have not yet read the OpenACC (nor OpenMP 5) spec to know the semantics and whether it matters if something is a true pointer or just optional.] The following is a rather special case (matching a C "void *" pointer), which is useless without later casting the argument ("c_f_pointer" call), but it is a pointer argument which is not by reference and not optional. use iso_c_binding implicit none call foo(c_null_ptr) contains subroutine foo(x) type(c_ptr), value :: x ! Matches a C 'void *' pointer end subroutine foo end Maybe there are more methods, but that requires some pondering. > In the Fortran FE, optional arguments are indicated by setting > attr.optional on the gfc_symbol for the parameter, but the OMP > lowering works on a tree - is it somehow possible to get from the tree > back to the gfc_symbol? If so, that would be a more reliable method of > detecting optional arguments. The gfc_symbol etc. is gone. The only possibility is to store some extra data in the language-dependent part of the tree, i.e. using DECL_LANG_SPECIFIC. Cf. lang_decl in trans.h and the various #defines which use DECL_LANG_SPECIFIC. Cheers, Tobias