| ! { dg-do run } |
| ! { dg-additional-sources "fc-out-descriptor-2-c.c dump-descriptors.c" } |
| ! { dg-additional-options "-g" } |
| ! |
| ! This program checks that passing a fixed-size array as an intent(out) |
| ! assumed-rank argument to a C function called from Fortran works. |
| |
| module mm |
| use iso_c_binding |
| type, bind (c) :: m |
| integer(C_INT) :: i, j |
| end type |
| |
| integer, parameter :: imax=10, jmax=5 |
| end module |
| |
| program testit |
| use iso_c_binding |
| use mm |
| implicit none |
| |
| interface |
| subroutine ctest (ii, jj, a) bind (c) |
| use iso_c_binding |
| use mm |
| integer(C_INT), value :: ii, jj |
| type(m), intent(out) :: a(..) |
| end subroutine |
| end interface |
| |
| type(m) :: aa(imax,jmax) |
| integer :: i, j |
| |
| ! initialize the array to all zeros; ctest will overwrite it. |
| do j = 1, jmax |
| do i = 1, imax |
| aa(i,j)%i = 0 |
| aa(i,j)%j = 0 |
| end do |
| end do |
| |
| call ctest (imax, jmax, aa) |
| call verify (aa) |
| |
| contains |
| subroutine verify (a) |
| use iso_c_binding |
| use mm |
| type(m) :: a(:,:) |
| integer :: i, j |
| |
| if (rank (a) .ne. 2) stop 100 |
| if (lbound (a, 1) .ne. 1) stop 101 |
| if (lbound (a, 2) .ne. 1) stop 102 |
| if (ubound (a, 1) .ne. imax) stop 103 |
| if (ubound (a, 2) .ne. jmax) stop 104 |
| |
| do j = 1, jmax |
| do i = 1, imax |
| if (a(i,j)%i .ne. i) stop 201 |
| if (a(i,j)%j .ne. j) stop 202 |
| end do |
| end do |
| end subroutine |
| |
| end program |