blob: 6769d7fe061049456291e46b6517e74d92a5cdd0 [file] [log] [blame]
! { dg-do run }
! { dg-additional-options "-fdump-tree-original" }
!
! Test the fix for PR93963
!
module m
contains
function rank_p(this) result(rnk) bind(c)
use, intrinsic :: iso_c_binding, only: c_int
implicit none
integer(kind=c_int), pointer, intent(in) :: this(..)
integer(kind=c_int) :: rnk
select rank(this)
rank(0)
rnk = 0
rank(1)
rnk = 1
rank(2)
rnk = 2
rank(3)
rnk = 3
rank(4)
rnk = 4
rank(5)
rnk = 5
rank(6)
rnk = 6
rank(7)
rnk = 7
rank(8)
rnk = 8
rank(9)
rnk = 9
rank(10)
rnk = 10
rank(11)
rnk = 11
rank(12)
rnk = 12
rank(13)
rnk = 13
rank(14)
rnk = 14
rank(15)
rnk = 15
rank default
rnk = -1000
end select
return
end function rank_p
function rank_a(this) result(rnk) bind(c)
use, intrinsic :: iso_c_binding, only: c_int
implicit none
integer(kind=c_int), allocatable, intent(in) :: this(..)
integer(kind=c_int) :: rnk
select rank(this)
rank(0)
rnk = 0
rank(1)
rnk = 1
rank(2)
rnk = 2
rank(3)
rnk = 3
rank(4)
rnk = 4
rank(5)
rnk = 5
rank(6)
rnk = 6
rank(7)
rnk = 7
rank(8)
rnk = 8
rank(9)
rnk = 9
rank(10)
rnk = 10
rank(11)
rnk = 11
rank(12)
rnk = 12
rank(13)
rnk = 13
rank(14)
rnk = 14
rank(15)
rnk = 15
rank default
rnk = -1000
end select
return
end function rank_a
function rank_o(this) result(rnk) bind(c)
use, intrinsic :: iso_c_binding, only: c_int
implicit none
integer(kind=c_int), intent(in) :: this(..)
integer(kind=c_int) :: rnk
select rank(this)
rank(0)
rnk = 0
rank(1)
rnk = 1
rank(2)
rnk = 2
rank(3)
rnk = 3
rank(4)
rnk = 4
rank(5)
rnk = 5
rank(6)
rnk = 6
rank(7)
rnk = 7
rank(8)
rnk = 8
rank(9)
rnk = 9
rank(10)
rnk = 10
rank(11)
rnk = 11
rank(12)
rnk = 12
rank(13)
rnk = 13
rank(14)
rnk = 14
rank(15)
rnk = 15
rank default
rnk = -1000
end select
return
end function rank_o
end module m
program selr_p
use m
use, intrinsic :: iso_c_binding, only: c_int
implicit none
integer(kind=c_int), parameter :: siz = 7
integer(kind=c_int), parameter :: rnk = 1
integer(kind=c_int), pointer :: intp(:)
integer(kind=c_int), allocatable :: inta(:)
integer(kind=c_int) :: irnk
nullify(intp)
irnk = rank_p(intp)
if (irnk /= rnk) stop 1
if (irnk /= rank(intp)) stop 2
!
irnk = rank_a(inta)
if (irnk /= rnk) stop 3
if (irnk /= rank(inta)) stop 4
!
allocate(intp(siz))
irnk = rank_p(intp)
if (irnk /= rnk) stop 5
if (irnk /= rank(intp)) stop 6
irnk = rank_o(intp)
if (irnk /= rnk) stop 7
if (irnk /= rank(intp)) stop 8
deallocate(intp)
nullify(intp)
!
allocate(inta(siz))
irnk = rank_a(inta)
if (irnk /= rnk) stop 9
if (irnk /= rank(inta)) stop 10
irnk = rank_o(inta)
if (irnk /= rnk) stop 11
if (irnk /= rank(inta)) stop 12
deallocate(inta)
end program selr_p
! Special code for assumed rank - but only if not allocatable/pointer
! Thus, expect it only once for subroutine rank_o but not for rank_a or rank_p
! { dg-final { scan-tree-dump-times "ubound != -1" 1 "original" } }