Hi all, I played around and came up with another second way one gets a single "*" without 'optional'.
I haven't checked whether which of those match the proposed omp_is_optional_argument's + && DECL_BY_REFERENCE (decl) + && TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE; nor whether some checks reject any of those with OpenACC (or OpenMP). In any case, the dump of "type(c_ptr),value", "integer, dimension(1)" and "integer,optional" is: static void foo (void *, integer(kind=4)[1] *, integer(kind=4) *); Actually, if one combines VALUE with OPTIONAL, it gets even more interesting. To implement it, one has two choices: * pass a copy by reference (or NULL) * pass by value (including a dummy value if absent) and denote the state as extra argument. The latter is done in gfortran, cf. PR fortran/35203, following the IBM compiler. I am not sure whether it does need special care fore OpenACC (or OpenMP 5) offloading, but that's at least a case which is not handled by the patch. Actually, there is a bug: the declaration of the function and the definition of the function is not the same - one misses the hidden argument :-( That's now PR fortran/91196. Fortran code - which now also contains VALUE, OPTIONAL: use iso_c_binding implicit none logical(kind=c_bool) :: is_present integer :: y(1) y(1) = 5 is_present = foo(c_null_ptr, y) contains logical(kind=c_bool) function foo(x, y, z, z2) type(c_ptr), value :: x ! Matches a C 'void *' pointer integer, target :: y(1) integer, optional :: z integer, value, optional :: z2 foo = present(z2) end function foo end Tobias