blob: c05f2e38dbc1ff39d86cd7047d65fc99932ee84e [file] [log] [blame]
! { dg-do run }
! { dg-additional-sources "cf-descriptor-4-c.c dump-descriptors.c" }
! { dg-additional-options "-g" }
!
! This program checks that building a descriptor for an allocatable
! or pointer array argument in C works and that you can use it to call
! back into a Fortran function declared to have c binding.
module mm
use iso_c_binding
type, bind (c) :: m
integer(C_INT) :: i, j
end type
integer(C_INT), parameter :: imax=3, jmax=6
end module
subroutine ftest (a, b, initp) bind (c, name="ftest")
use iso_c_binding
use mm
type(m), allocatable :: a(:,:)
type(m), pointer :: b(:,:)
integer(C_INT), value :: initp
integer :: i, j
if (rank(a) .ne. 2) stop 101
if (rank(b) .ne. 2) stop 101
if (initp .ne. 0 .and. .not. allocated(a)) stop 102
if (initp .eq. 0 .and. allocated(a)) stop 103
if (initp .ne. 0 .and. .not. associated(b)) stop 104
if (initp .eq. 0 .and. associated(b)) stop 105
if (initp .ne. 0) then
if (lbound (a, 1) .ne. 1) stop 201
if (lbound (a, 2) .ne. 1) stop 202
if (lbound (b, 2) .ne. 1) stop 203
if (lbound (b, 1) .ne. 1) stop 204
if (ubound (a, 1) .ne. imax) stop 205
if (ubound (a, 2) .ne. jmax) stop 206
if (ubound (b, 2) .ne. imax) stop 207
if (ubound (b, 1) .ne. jmax) stop 208
do i = 1, imax
do j = 1, jmax
if (a(i,j)%i .ne. i) stop 301
if (a(i,j)%j .ne. j) stop 302
if (b(j,i)%i .ne. i) stop 303
if (b(j,i)%j .ne. j) stop 303
end do
end do
end if
end subroutine
program testit
use iso_c_binding
use mm
implicit none
interface
subroutine ctest (i, j) bind (c)
use iso_c_binding
integer(C_INT), value :: i, j
end subroutine
end interface
! ctest will call ftest with both an unallocated and allocated argument.
call ctest (imax, jmax)
end program