|  | ! { 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 | 
|  |  |