blob: d5439b8dca042fa980441a778c5c4a9269ac39bc [file] [log] [blame]
! { dg-do run }
!
! Check that the inline implementation of MAXLOC correctly supports indirect
! MASK, that is a MASK expression that is itself an optional variable.
program p
implicit none
integer, parameter :: data(*) = (/ 3, 7, 1, 0, 7, 0, 3, 5, 3, 0 /)
logical, parameter :: mask(*) = (/ .true. , .false., .true., .true. , &
& .false., .true. , .true., .false., &
& .true. , .true. /)
call check_int_const_shape_absent_back
call check_int_const_shape_false_back
call check_int_const_shape_true_back
call check_int_const_shape_scalar_mask_absent_back
call check_int_const_shape_scalar_mask_false_back
call check_int_const_shape_scalar_mask_true_back
call check_int_assumed_shape_absent_back
call check_int_assumed_shape_false_back
call check_int_assumed_shape_true_back
call check_int_assumed_shape_scalar_mask_absent_back
call check_int_assumed_shape_scalar_mask_false_back
call check_int_assumed_shape_scalar_mask_true_back
call check_int_func_absent_back
call check_int_func_false_back
call check_int_func_true_back
call check_int_func_scalar_mask_absent_back
call check_int_func_scalar_mask_false_back
call check_int_func_scalar_mask_true_back
call check_int_const_shape_array_mask_absent_back
call check_int_const_shape_array_mask_false_back
call check_int_const_shape_array_mask_true_back
call check_int_assumed_shape_array_mask_absent_back
call check_int_assumed_shape_array_mask_false_back
call check_int_assumed_shape_array_mask_true_back
call check_real_const_shape_absent_back
call check_real_const_shape_false_back
call check_real_const_shape_true_back
call check_real_const_shape_scalar_mask_absent_back
call check_real_const_shape_scalar_mask_false_back
call check_real_const_shape_scalar_mask_true_back
call check_real_assumed_shape_absent_back
call check_real_assumed_shape_false_back
call check_real_assumed_shape_true_back
call check_real_assumed_shape_scalar_mask_absent_back
call check_real_assumed_shape_scalar_mask_false_back
call check_real_assumed_shape_scalar_mask_true_back
contains
subroutine call_maxloc_int_const_shape(r, a, b)
integer :: r, a(10)
logical, optional :: b
r = maxloc(a, dim = 1, back = b)
end subroutine
subroutine check_int_const_shape_absent_back
integer :: r, a(10)
a = data
call call_maxloc_int_const_shape(r, a)
if (r /= 2) stop 9
end subroutine
subroutine check_int_const_shape_false_back
integer :: r, a(10)
a = data
call call_maxloc_int_const_shape(r, a, .false.)
if (r /= 2) stop 16
end subroutine
subroutine check_int_const_shape_true_back
integer :: r, a(10)
a = data
call call_maxloc_int_const_shape(r, a, .true.)
if (r /= 5) stop 23
end subroutine
subroutine call_maxloc_int_const_shape_scalar_mask(r, a, m, b)
integer :: r, a(10)
logical :: m
logical, optional :: b
r = maxloc(a, dim = 1, mask = m, back = b)
end subroutine
subroutine check_int_const_shape_scalar_mask_absent_back
integer :: r, a(10)
a = data
call call_maxloc_int_const_shape_scalar_mask(r, a, .true.)
if (r /= 2) stop 30
end subroutine
subroutine check_int_const_shape_scalar_mask_false_back
integer :: r, a(10)
a = data
call call_maxloc_int_const_shape_scalar_mask(r, a, .true., .false.)
if (r /= 2) stop 37
end subroutine
subroutine check_int_const_shape_scalar_mask_true_back
integer :: r, a(10)
a = data
call call_maxloc_int_const_shape_scalar_mask(r, a, .true., .true.)
if (r /= 5) stop 44
end subroutine
subroutine call_maxloc_int_assumed_shape(r, a, b)
integer :: r, a(:)
logical, optional :: b
r = maxloc(a, dim = 1, back = b)
end subroutine
subroutine check_int_assumed_shape_absent_back
integer :: r, a(10)
a = data
call call_maxloc_int_assumed_shape(r, a)
if (r /= 2) stop 51
end subroutine
subroutine check_int_assumed_shape_false_back
integer :: r, a(10)
a = data
call call_maxloc_int_assumed_shape(r, a, .false.)
if (r /= 2) stop 58
end subroutine
subroutine check_int_assumed_shape_true_back
integer :: r, a(10)
a = data
call call_maxloc_int_assumed_shape(r, a, .true.)
if (r /= 5) stop 65
end subroutine
subroutine call_maxloc_int_assumed_shape_scalar_mask(r, a, m, b)
integer :: r, a(:)
logical :: m
logical, optional :: b
r = maxloc(a, dim = 1, mask = m, back = b)
end subroutine
subroutine check_int_assumed_shape_scalar_mask_absent_back
integer :: r, a(10)
a = data
call call_maxloc_int_assumed_shape_scalar_mask(r, a, .true.)
if (r /= 2) stop 72
end subroutine
subroutine check_int_assumed_shape_scalar_mask_false_back
integer :: r, a(10)
a = data
call call_maxloc_int_assumed_shape_scalar_mask(r, a, .true., .false.)
if (r /= 2) stop 79
end subroutine
subroutine check_int_assumed_shape_scalar_mask_true_back
integer :: r, a(10)
a = data
call call_maxloc_int_assumed_shape_scalar_mask(r, a, .true., .true.)
if (r /= 5) stop 86
end subroutine
function id(a) result(r)
integer, dimension(:) :: a
integer, dimension(size(a, dim = 1)) :: r
r = a
end function
subroutine call_maxloc_int_func(r, a, b)
integer :: r, a(:)
logical, optional :: b
r = maxloc(id(a) + 1, dim = 1, back = b)
end subroutine
subroutine check_int_func_absent_back
integer :: r, a(10)
a = data
call call_maxloc_int_func(r, a)
if (r /= 2) stop 93
end subroutine
subroutine check_int_func_false_back
integer :: r, a(10)
a = data
call call_maxloc_int_func(r, a, .false.)
if (r /= 2) stop 100
end subroutine
subroutine check_int_func_true_back
integer :: r, a(10)
a = data
call call_maxloc_int_func(r, a, .true.)
if (r /= 5) stop 107
end subroutine
subroutine call_maxloc_int_func_scalar_mask(r, a, m, b)
integer :: r, a(:)
logical :: m
logical, optional :: b
r = maxloc(id(a) + 1, dim = 1, mask = m, back = b)
end subroutine
subroutine check_int_func_scalar_mask_absent_back
integer :: r, a(10)
a = data
call call_maxloc_int_func_scalar_mask(r, a, .true.)
if (r /= 2) stop 114
end subroutine
subroutine check_int_func_scalar_mask_false_back
integer :: r, a(10)
a = data
call call_maxloc_int_func_scalar_mask(r, a, .true., .false.)
if (r /= 2) stop 121
end subroutine
subroutine check_int_func_scalar_mask_true_back
integer :: r, a(10)
a = data
call call_maxloc_int_func_scalar_mask(r, a, .true., .true.)
if (r /= 5) stop 128
end subroutine
subroutine call_maxloc_int_const_shape_array_mask(r, a, m, b)
integer :: r, a(10)
logical :: m(10)
logical, optional :: b
r = maxloc(a, dim = 1, mask = m, back = b)
end subroutine
subroutine check_int_const_shape_array_mask_absent_back
integer :: r, a(10)
logical :: m(10)
a = data
m = mask
call call_maxloc_int_const_shape_array_mask(r, a, m)
if (r /= 1) stop 135
end subroutine
subroutine check_int_const_shape_array_mask_false_back
integer :: r, a(10)
logical :: m(10)
a = data
m = mask
call call_maxloc_int_const_shape_array_mask(r, a, m, .false.)
if (r /= 1) stop 142
end subroutine
subroutine check_int_const_shape_array_mask_true_back
integer :: r, a(10)
logical :: m(10)
a = data
m = mask
call call_maxloc_int_const_shape_array_mask(r, a, m, .true.)
if (r /= 9) stop 149
end subroutine
subroutine call_maxloc_int_assumed_shape_array_mask(r, a, m, b)
integer :: r, a(:)
logical :: m(:)
logical, optional :: b
r = maxloc(a, dim = 1, mask = m, back = b)
end subroutine
subroutine check_int_assumed_shape_array_mask_absent_back
integer :: r, a(10)
logical :: m(10)
a = data
m = mask
call call_maxloc_int_assumed_shape_array_mask(r, a, m)
if (r /= 1) stop 156
end subroutine
subroutine check_int_assumed_shape_array_mask_false_back
integer :: r, a(10)
logical :: m(10)
a = data
m = mask
call call_maxloc_int_assumed_shape_array_mask(r, a, m, .false.)
if (r /= 1) stop 163
end subroutine
subroutine check_int_assumed_shape_array_mask_true_back
integer :: r, a(10)
logical :: m(10)
a = data
m = mask
call call_maxloc_int_assumed_shape_array_mask(r, a, m, .true.)
if (r /= 9) stop 170
end subroutine
subroutine call_maxloc_real_const_shape(r, a, b)
integer :: r
real :: a(10)
logical, optional :: b
r = maxloc(a, dim = 1, back = b)
end subroutine
subroutine check_real_const_shape_absent_back
integer :: r
real :: a(10)
a = (/ real :: data /)
call call_maxloc_real_const_shape(r, a)
if (r /= 2) stop 177
end subroutine
subroutine check_real_const_shape_false_back
integer :: r
real :: a(10)
a = (/ real :: data /)
call call_maxloc_real_const_shape(r, a, .false.)
if (r /= 2) stop 184
end subroutine
subroutine check_real_const_shape_true_back
integer :: r
real :: a(10)
a = (/ real :: data /)
call call_maxloc_real_const_shape(r, a, .true.)
if (r /= 5) stop 191
end subroutine
subroutine call_maxloc_real_const_shape_scalar_mask(r, a, m, b)
integer :: r
real :: a(10)
logical :: m
logical, optional :: b
r = maxloc(a, dim = 1, mask = m, back = b)
end subroutine
subroutine check_real_const_shape_scalar_mask_absent_back
integer :: r
real :: a(10)
a = (/ real :: data /)
call call_maxloc_real_const_shape_scalar_mask(r, a, .true.)
if (r /= 2) stop 198
end subroutine
subroutine check_real_const_shape_scalar_mask_false_back
integer :: r
real :: a(10)
a = (/ real :: data /)
call call_maxloc_real_const_shape_scalar_mask(r, a, .true., .false.)
if (r /= 2) stop 205
end subroutine
subroutine check_real_const_shape_scalar_mask_true_back
integer :: r
real :: a(10)
a = (/ real :: data /)
call call_maxloc_real_const_shape_scalar_mask(r, a, .true., .true.)
if (r /= 5) stop 212
end subroutine
subroutine call_maxloc_real_assumed_shape(r, a, b)
integer :: r
real :: a(:)
logical, optional :: b
r = maxloc(a, dim = 1, back = b)
end subroutine
subroutine check_real_assumed_shape_absent_back
integer :: r
real :: a(10)
a = (/ real :: data /)
call call_maxloc_real_assumed_shape(r, a)
if (r /= 2) stop 219
end subroutine
subroutine check_real_assumed_shape_false_back
integer :: r
real :: a(10)
a = (/ real :: data /)
call call_maxloc_real_assumed_shape(r, a, .false.)
if (r /= 2) stop 226
end subroutine
subroutine check_real_assumed_shape_true_back
integer :: r
real :: a(10)
a = (/ real :: data /)
call call_maxloc_real_assumed_shape(r, a, .true.)
if (r /= 5) stop 233
end subroutine
subroutine call_maxloc_real_assumed_shape_scalar_mask(r, a, m, b)
integer :: r
real :: a(:)
logical :: m
logical, optional :: b
r = maxloc(a, dim = 1, mask = m, back = b)
end subroutine
subroutine check_real_assumed_shape_scalar_mask_absent_back
integer :: r
real :: a(10)
a = (/ real :: data /)
call call_maxloc_real_assumed_shape_scalar_mask(r, a, .true.)
if (r /= 2) stop 240
end subroutine
subroutine check_real_assumed_shape_scalar_mask_false_back
integer :: r
real :: a(10)
a = (/ real :: data /)
call call_maxloc_real_assumed_shape_scalar_mask(r, a, .true., .false.)
if (r /= 2) stop 247
end subroutine
subroutine check_real_assumed_shape_scalar_mask_true_back
integer :: r
real :: a(10)
a = data
a = (/ real :: data /)
call call_maxloc_real_assumed_shape_scalar_mask(r, a, .true., .true.)
if (r /= 5) stop 254
end subroutine
end program p