| ! { dg-do run } |
| ! { dg-additional-sources "optional-c.c dump-descriptors.c" } |
| ! { dg-additional-options "-g" } |
| ! |
| ! TS 29113 |
| ! 8.7 An absent actual argument in a reference to an interoperable |
| ! procedure is indicated by a corresponding formal parameter with the |
| ! value of a null pointer. An absent optional dummy argument in a |
| ! reference to an interoperable procedure from a C function is indicated |
| ! by a corresponding argument with the value of a null pointer. |
| |
| module m |
| use iso_c_binding |
| integer(C_INT) :: aa(32) |
| integer(C_INT) :: bb |
| character(C_CHAR) :: cc |
| real(C_DOUBLE) :: dd |
| end module |
| |
| subroutine ftest (n, a, b, c, d) bind (c) |
| use iso_c_binding |
| use m |
| implicit none |
| integer(C_INT), value :: n |
| integer(C_INT), optional :: a(:) |
| integer(C_INT), optional :: b |
| character(C_CHAR), optional :: c |
| real(C_DOUBLE), optional :: d |
| |
| if (n .ge. 1) then |
| if (.not. present (a)) stop 101 |
| if (any (a .ne. aa)) stop 201 |
| else |
| if (present (a)) stop 301 |
| end if |
| |
| if (n .ge. 2) then |
| if (.not. present (b)) stop 102 |
| if (b .ne. bb) stop 201 |
| else |
| if (present (b)) stop 302 |
| end if |
| |
| if (n .ge. 3) then |
| if (.not. present (c)) stop 103 |
| if (c .ne. cc) stop 201 |
| else |
| if (present (c)) stop 303 |
| end if |
| |
| if (n .ge. 4) then |
| if (.not. present (d)) stop 104 |
| if (d .ne. dd) stop 201 |
| else |
| if (present (d)) stop 304 |
| end if |
| end subroutine |
| |
| program testit |
| use iso_c_binding |
| use m |
| implicit none |
| |
| interface |
| subroutine ctest1 (a, b, c, d) bind (c) |
| use iso_c_binding |
| integer(C_INT) :: a(:) |
| integer(C_INT) :: b |
| character(C_CHAR) :: c |
| real(C_DOUBLE) :: d |
| end subroutine |
| subroutine ctest2 (n, a, b, c, d) bind (c) |
| use iso_c_binding |
| integer(C_INT), value :: n |
| integer(C_INT), optional :: a(:) |
| integer(C_INT), optional :: b |
| character(C_CHAR), optional :: c |
| real(C_DOUBLE), optional :: d |
| end subroutine |
| subroutine ftest (n, a, b, c, d) bind (c) |
| use iso_c_binding |
| integer(C_INT), value :: n |
| integer(C_INT), optional :: a(:) |
| integer(C_INT), optional :: b |
| character(C_CHAR), optional :: c |
| real(C_DOUBLE), optional :: d |
| end subroutine |
| end interface |
| |
| |
| ! Initialize the variables above. |
| integer :: i |
| do i = 1, 32 |
| aa(i) = i |
| end do |
| bb = 42 |
| cc = '$' |
| dd = acos(-1.D0) |
| |
| call ftest (0) |
| call ftest (1, aa) |
| call ftest (2, aa, bb) |
| call ftest (3, aa, bb, cc) |
| call ftest (4, aa, bb, cc, dd) |
| |
| call ctest1 (aa, bb, cc, dd) |
| call ctest2 (0) |
| call ctest2 (1, aa) |
| call ctest2 (2, aa, bb) |
| call ctest2 (3, aa, bb, cc) |
| call ctest2 (4, aa, bb, cc, dd) |
| |
| end program |
| |