| ! { dg-do run } |
| ! |
| ! Test the fix for PR94022 |
| ! |
| |
| function isasa_f(a) result(s) |
| implicit none |
| |
| integer, intent(in) :: a(..) |
| |
| logical :: s |
| |
| select rank(a) |
| rank(*) |
| s = .true. |
| rank default |
| s = .false. |
| end select |
| return |
| end function isasa_f |
| |
| function isasa_c(a) result(s) bind(c) |
| use, intrinsic :: iso_c_binding, only: c_int, c_bool |
| |
| implicit none |
| |
| integer(kind=c_int), intent(in) :: a(..) |
| |
| logical(kind=c_bool) :: s |
| |
| select rank(a) |
| rank(*) |
| s = .true. |
| rank default |
| s = .false. |
| end select |
| return |
| end function isasa_c |
| |
| program isasa_p |
| |
| implicit none |
| |
| interface |
| function isasa_f(a) result(s) |
| implicit none |
| integer, intent(in) :: a(..) |
| logical :: s |
| end function isasa_f |
| function isasa_c(a) result(s) bind(c) |
| use, intrinsic :: iso_c_binding, only: c_int, c_bool |
| implicit none |
| integer(kind=c_int), intent(in) :: a(..) |
| logical(kind=c_bool) :: s |
| end function isasa_c |
| end interface |
| |
| integer, parameter :: sz = 7 |
| integer, parameter :: lb = 3 |
| integer, parameter :: ub = 9 |
| integer, parameter :: ex = ub-lb+1 |
| |
| integer :: arr(sz,lb:ub) |
| |
| arr = 1 |
| if (asaf_a(arr, lb+1, ub-1)) stop 1 |
| if (asaf_p(arr, lb+1, ub-1)) stop 2 |
| if (asaf_a(arr, 2, ex-1)) stop 3 |
| if (asaf_p(arr, 2, ex-1)) stop 4 |
| if (asac_a(arr, lb+1, ub-1)) stop 5 |
| if (asac_p(arr, lb+1, ub-1)) stop 6 |
| if (asac_a(arr, 2, ex-1)) stop 7 |
| if (asac_p(arr, 2, ex-1)) stop 8 |
| |
| stop |
| |
| contains |
| |
| function asaf_a(a, lb, ub) result(s) |
| integer, intent(in) :: lb |
| integer, target, intent(in) :: a(sz,lb:*) |
| integer, intent(in) :: ub |
| |
| logical :: s |
| |
| s = isasa_f(a(:,lb:ub)) |
| return |
| end function asaf_a |
| |
| function asaf_p(a, lb, ub) result(s) |
| integer, intent(in) :: lb |
| integer, target, intent(in) :: a(sz,lb:*) |
| integer, intent(in) :: ub |
| |
| logical :: s |
| |
| integer, pointer :: p(:,:) |
| |
| p => a(:,lb:ub) |
| s = isasa_f(p) |
| return |
| end function asaf_p |
| |
| function asac_a(a, lb, ub) result(s) |
| integer, intent(in) :: lb |
| integer, target, intent(in) :: a(sz,lb:*) |
| integer, intent(in) :: ub |
| |
| logical :: s |
| |
| s = logical(isasa_c(a(:,lb:ub))) |
| return |
| end function asac_a |
| |
| function asac_p(a, lb, ub) result(s) |
| integer, intent(in) :: lb |
| integer, target, intent(in) :: a(sz,lb:*) |
| integer, intent(in) :: ub |
| |
| logical :: s |
| |
| integer, pointer :: p(:,:) |
| |
| p => a(:,lb:ub) |
| s = logical(isasa_c(p)) |
| return |
| end function asac_p |
| |
| end program isasa_p |
| |
| |
| |