blob: 64a2a88fe2da652b2471dd61b387849857371488 [file] [log] [blame]
! { dg-do run }
! { dg-additional-sources PR100915.c }
!
! Test the fix for PR100915
!
module isof_m
use, intrinsic :: iso_c_binding, only: &
c_signed_char, c_int16_t
implicit none
private
public :: &
CFI_type_cptr, CFI_type_cfunptr
public :: &
check_fn_as, &
check_fn_ar
public :: &
mult2
public :: &
cfi_encode_type
integer, parameter :: CFI_type_t = c_int16_t
integer(kind=c_int16_t), parameter :: CFI_type_mask = int(z"FF", kind=c_int16_t)
integer(kind=c_int16_t), parameter :: CFI_type_kind_shift = 8_c_int16_t
! Intrinsic types. Their kind number defines their storage size. */
integer(kind=c_signed_char), parameter :: CFI_type_cptr = 7
integer(kind=c_signed_char), parameter :: CFI_type_cfunptr = 8
interface
subroutine check_fn_as(a, t, k, e, n) &
bind(c, name="check_fn")
use, intrinsic :: iso_c_binding, only: &
c_int16_t, c_signed_char, c_size_t
implicit none
type(*), intent(in) :: a(:)
integer(c_int16_t), value, intent(in) :: t
integer(c_signed_char), value, intent(in) :: k
integer(c_size_t), value, intent(in) :: e
integer(c_size_t), value, intent(in) :: n
end subroutine check_fn_as
subroutine check_fn_ar(a, t, k, e, n) &
bind(c, name="check_fn")
use, intrinsic :: iso_c_binding, only: &
c_int16_t, c_signed_char, c_size_t
implicit none
type(*), intent(in) :: a(..)
integer(c_int16_t), value, intent(in) :: t
integer(c_signed_char), value, intent(in) :: k
integer(c_size_t), value, intent(in) :: e
integer(c_size_t), value, intent(in) :: n
end subroutine check_fn_ar
end interface
contains
function mult2(a) result(b) bind(c)
use, intrinsic :: iso_c_binding, only: &
c_int
integer(kind=c_int), value, intent(in) :: a
integer(kind=c_int) :: b
b = 2_c_int * a
return
end function mult2
elemental function cfi_encode_type(type, kind) result(itype)
integer(kind=c_signed_char), intent(in) :: type
integer(kind=c_signed_char), intent(in) :: kind
integer(kind=c_int16_t) :: itype, ikind
itype = int(type, kind=c_int16_t)
itype = iand(itype, CFI_type_mask)
ikind = int(kind, kind=c_int16_t)
ikind = iand(ikind, CFI_type_mask)
ikind = shiftl(ikind, CFI_type_kind_shift)
itype = ior(ikind, itype)
return
end function cfi_encode_type
end module isof_m
module iso_check_m
use, intrinsic :: iso_c_binding, only: &
c_signed_char, c_int16_t, c_size_t
use, intrinsic :: iso_c_binding, only: &
c_funptr, c_funloc, c_associated
use :: isof_m, only: &
CFI_type_cptr, CFI_type_cfunptr
use :: isof_m, only: &
check_fn_as, &
check_fn_ar
use :: isof_m, only: &
mult2
use :: isof_m, only: &
cfi_encode_type
implicit none
integer :: i
integer(kind=c_size_t), parameter :: b = 8
integer, parameter :: n = 11
contains
subroutine check_c_funptr()
type(c_funptr) :: p(n)
integer :: i
!
p = [(c_funloc(mult2), i=1,n)]
call f_check_c_funptr_as(p)
do i = 1, n
if(.not.c_associated(p(i), c_funloc(mult2))) stop 1
end do
p = [(c_funloc(mult2), i=1,n)]
call c_check_c_funptr_as(p)
do i = 1, n
if(.not.c_associated(p(i), c_funloc(mult2))) stop 2
end do
p = [(c_funloc(mult2), i=1,n)]
call f_check_c_funptr_ar(p)
do i = 1, n
if(.not.c_associated(p(i), c_funloc(mult2))) stop 3
end do
p = [(c_funloc(mult2), i=1,n)]
call c_check_c_funptr_ar(p)
do i = 1, n
if(.not.c_associated(p(i), c_funloc(mult2))) stop 4
end do
return
end subroutine check_c_funptr
subroutine f_check_c_funptr_as(a)
type(c_funptr), intent(in) :: a(:)
!
integer(kind=c_int16_t) :: t
integer(kind=c_signed_char) :: k
integer(kind=c_size_t) :: e
!
k = 0
e = storage_size(a)/b
t = cfi_encode_type(CFI_type_cfunptr, k)
! Assumes 64-bit target.
! if(e/=8) stop 5
do i = 1, n
if(.not.c_associated(a(i), c_funloc(mult2))) stop 6
end do
call check_fn_as(a, t, k, e, 1_c_size_t)
do i = 1, n
if(.not.c_associated(a(i), c_funloc(mult2))) stop 7
end do
return
end subroutine f_check_c_funptr_as
subroutine c_check_c_funptr_as(a) bind(c)
type(c_funptr), intent(in) :: a(:)
integer(kind=c_int16_t) :: t
integer(kind=c_signed_char) :: k
integer(kind=c_size_t) :: e
!
k = 0
e = storage_size(a)/b
t = cfi_encode_type(CFI_type_cfunptr, k)
! Assumes 64-bit target.
! if(e/=8) stop 8
do i = 1, n
if(.not.c_associated(a(i), c_funloc(mult2))) stop 9
end do
call check_fn_as(a, t, k, e, 1_c_size_t)
do i = 1, n
if(.not.c_associated(a(i), c_funloc(mult2))) stop 10
end do
return
end subroutine c_check_c_funptr_as
subroutine f_check_c_funptr_ar(a)
type(c_funptr), intent(in) :: a(..)
!
integer(kind=c_int16_t) :: t
integer(kind=c_signed_char) :: k
integer(kind=c_size_t) :: e
!
k = 0
e = storage_size(a)/b
t = cfi_encode_type(CFI_type_cfunptr, k)
! Assumes 64-bit target.
! if(e/=8) stop 11
select rank(a)
rank(1)
do i = 1, n
if(.not.c_associated(a(i), c_funloc(mult2))) stop 12
end do
rank default
stop 13
end select
call check_fn_ar(a, t, k, e, 1_c_size_t)
select rank(a)
rank(1)
do i = 1, n
if(.not.c_associated(a(i), c_funloc(mult2))) stop 14
end do
rank default
stop 15
end select
return
end subroutine f_check_c_funptr_ar
subroutine c_check_c_funptr_ar(a) bind(c)
type(c_funptr), intent(in) :: a(..)
integer(kind=c_int16_t) :: t
integer(kind=c_signed_char) :: k
integer(kind=c_size_t) :: e
!
k = 0
e = storage_size(a)/b
t = cfi_encode_type(CFI_type_cfunptr, k)
! Assumes 64-bit target.
! if(e/=8) stop 16
select rank(a)
rank(1)
do i = 1, n
if(.not.c_associated(a(i), c_funloc(mult2))) stop 17
end do
rank default
stop 18
end select
call check_fn_ar(a, t, k, e, 1_c_size_t)
select rank(a)
rank(1)
do i = 1, n
if(.not.c_associated(a(i), c_funloc(mult2))) stop 19
end do
rank default
stop 20
end select
return
end subroutine c_check_c_funptr_ar
end module iso_check_m
program main_p
use :: iso_check_m, only: &
check_c_funptr
implicit none
call check_c_funptr()
stop
end program main_p
!! Local Variables:
!! mode: f90
!! End: