https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91196

            Bug ID: 91196
           Summary: Interface generated for proc with VALUE,OPTIONAL
                    misses hidden is-present argument
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: burnus at gcc dot gnu.org
  Target Milestone: ---

Cf. PR fortran/35203 for the original implementation.

The following code generates the procedure definition - note the last two
arguments:

  foo (void * x, integer(kind=4)[1] * y, integer(kind=4) * z, integer(kind=4)
z2, logical(kind=1) _z2)


In the main program, the interface / prototype is declared, but it lacks the
hidden logical argument:

  static logical(kind=1) foo (void *, integer(kind=4)[1] *, integer(kind=4) *,
integer(kind=4));


NOTE: The call does have the additional argument:
  is_present = foo (c_ptr.0, &y, 0B, 0, 0);


Example Fortran code - "z2" is the argument of interest.

  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

Reply via email to