blob: 73ad9ecd3b89d04e0778d3394494be9591a919a0 [file] [log] [blame]
! { dg-do run }
! { dg-additional-sources "section-2-c.c dump-descriptors.c" }
! { dg-additional-options "-g" }
!
! This program tests basic use of the CFI_section C library function on
! a 2-dimensional non-pointer array.
module mm
use ISO_C_BINDING
type, bind (c) :: m
integer(C_INT) :: x, y
end type
end module
program testit
use iso_c_binding
use mm
implicit none
interface
subroutine ctest (a, lb0, lb1, ub0, ub1, s0, s1, r) bind (c)
use iso_c_binding
use mm
type(m), target :: a(:,:)
integer(C_INT), value :: lb0, lb1, ub0, ub1, s0, s1
type(m), pointer, intent(out) :: r(:,:)
end subroutine
end interface
type(m), target :: aa(10, 20)
integer :: i0, i1
! Initialize the test array by numbering its elements.
do i1 = 1, 20
do i0 = 1, 10
aa(i0, i1)%x = i0
aa(i0, i1)%y = i1
end do
end do
call test (aa, 4, 3, 10, 15, 2, 3) ! basic test
call test (aa, 10, 15, 4, 3, -2, -3) ! negative step
stop
contains
! Test function for non-pointer array AA.
! LB, UB, and S describe the section to take.
subroutine test (aa, lb0, lb1, ub0, ub1, s0, s1)
use mm
type(m) :: aa(10,20)
integer :: lb0, lb1, ub0, ub1, s0, s1
type(m), pointer :: rr(:,:)
integer :: i0, i1, o0, o1
integer, parameter :: hi0 = 10
integer, parameter :: hi1 = 20
! Make sure the original array is OK.
do i1 = 1, hi1
do i0 = 1, hi0
if (aa(i0,i1)%x .ne. i0) stop 101
if (aa(i0,i1)%y .ne. i1) stop 101
end do
end do
! Call the C function to put a section in rr.
! The C function expects the section bounds to be 1-based.
nullify (rr)
call ctest (aa, lb0, lb1, ub0, ub1, s0, s1, rr)
! Make sure the original array has not been modified.
do i1 = 1, hi1
do i0 = 1, hi0
if (aa(i0,i1)%x .ne. i0) stop 103
if (aa(i0,i1)%y .ne. i1) stop 103
end do
end do
! Make sure the output array has the expected bounds and elements.
if (.not. associated (rr)) stop 111
if (lbound (rr, 1) .ne. 1) stop 112
if (lbound (rr, 2) .ne. 1) stop 112
if (ubound (rr, 1) .ne. (ub0 - lb0)/s0 + 1) stop 113
if (ubound (rr, 2) .ne. (ub1 - lb1)/s1 + 1) stop 113
o1 = 1
do i1 = lb1, ub1, s1
o0 = 1
do i0 = lb0, ub0, s0
! print 999, o0, o1, rr(o0,o1)%x, rr(o0,01)%y
! 999 format ('rr(', i3, ',', i3, ') = (', i3, ',', i3, ')')
if (rr(o0,o1)%x .ne. i0) stop 114
if (rr(o0,o1)%y .ne. i1) stop 114
o0 = o0 + 1
end do
o1 = o1 + 1
end do
end subroutine
end program