blob: b8d5dda676175fe1974e2df3ace37d4ad4bd00f2 [file] [log] [blame]
! { dg-do run }
!
! PR fortran/90608
! Check the correct behaviour of the inline MAXLOC implementation,
! when there is a mask argument.
program p
implicit none
integer, parameter :: data10(*) = (/ 7, 4, 7, 6, 6, 4, 6, 3, 9, 8 /)
logical, parameter :: mask10(*) = (/ .false., .true., .false., &
.false., .true., .true., &
.true. , .true., .false., &
.false. /)
integer, parameter :: data64(*) = (/ 2, 5, 4, 6, 0, 9, 3, 5, &
4, 4, 1, 7, 3, 2, 1, 2, &
5, 4, 6, 0, 9, 3, 5, 4, &
4, 1, 7, 3, 2, 1, 2, 5, &
4, 6, 0, 9, 3, 5, 4, 4, &
1, 7, 3, 2, 1, 2, 5, 4, &
6, 0, 9, 3, 5, 4, 4, 1, &
7, 3, 2, 1, 2, 5, 4, 6 /)
logical, parameter :: mask64(*) = (/ .true. , .false., .false., .false., &
.true. , .false., .true. , .false., &
.false., .true. , .true. , .false., &
.true. , .true. , .true. , .true. , &
.false., .true. , .false., .true. , &
.false., .true. , .false., .true. , &
.true. , .false., .false., .true. , &
.true. , .true. , .true. , .false., &
.false., .false., .true. , .false., &
.true. , .false., .true. , .true. , &
.true. , .false., .true. , .true. , &
.false., .true. , .false., .true. , &
.false., .true. , .false., .false., &
.false., .true. , .true. , .true. , &
.false., .true. , .false., .true. , &
.true. , .false., .false., .false. /)
call check_int_const_shape_rank_1
call check_int_const_shape_rank_3
call check_int_const_shape_rank_3_true_mask
call check_int_const_shape_rank_3_false_mask
call check_int_const_shape_rank_3_optional_mask_present
call check_int_const_shape_rank_3_optional_mask_absent
call check_int_const_shape_empty_4
call check_int_alloc_rank_1
call check_int_alloc_rank_3
call check_int_alloc_rank_3_true_mask
call check_int_alloc_rank_3_false_mask
call check_int_alloc_empty_4
call check_real_const_shape_rank_1
call check_real_const_shape_rank_3
call check_real_const_shape_rank_3_true_mask
call check_real_const_shape_rank_3_false_mask
call check_real_const_shape_rank_3_optional_mask_present
call check_real_const_shape_rank_3_optional_mask_absent
call check_real_const_shape_empty_4
call check_real_alloc_rank_1
call check_real_alloc_rank_3
call check_real_alloc_rank_3_true_mask
call check_real_alloc_rank_3_false_mask
call check_real_alloc_empty_4
call check_lower_bounds
call check_dependencies
contains
subroutine check_int_const_shape_rank_1()
integer :: a(10)
logical :: m(10)
integer, allocatable :: r(:)
a = data10
m = mask10
r = maxloc(a, mask = m)
if (size(r, dim = 1) /= 1) stop 11
if (any(r /= (/ 5 /))) stop 12
end subroutine
subroutine check_int_const_shape_rank_3()
integer :: a(4,4,4)
logical :: m(4,4,4)
integer, allocatable :: r(:)
a = reshape(data64, shape(a))
m = reshape(mask64, shape(m))
r = maxloc(a, mask = m)
if (size(r, dim = 1) /= 3) stop 21
if (any(r /= (/ 2, 3, 1 /))) stop 22
end subroutine
subroutine check_int_const_shape_rank_3_true_mask()
integer :: a(4,4,4)
integer, allocatable :: r(:)
a = reshape(data64, shape(a))
r = maxloc(a, mask = .true.)
if (size(r, dim = 1) /= 3) stop 31
if (any(r /= (/ 2, 2, 1 /))) stop 32
end subroutine
subroutine check_int_const_shape_rank_3_false_mask()
integer :: a(4,4,4)
integer, allocatable :: r(:)
a = reshape(data64, shape(a))
r = maxloc(a, mask = .false.)
if (size(r, dim = 1) /= 3) stop 41
if (any(r /= (/ 0, 0, 0 /))) stop 42
end subroutine
subroutine call_maxloc_int(r, a, m)
integer :: a(:,:,:)
logical, optional :: m(:,:,:)
integer, allocatable :: r(:)
r = maxloc(a, mask = m)
end subroutine
subroutine check_int_const_shape_rank_3_optional_mask_present()
integer :: a(4,4,4)
logical :: m(4,4,4)
integer, allocatable :: r(:)
a = reshape(data64, shape(a))
m = reshape(mask64, shape(m))
call call_maxloc_int(r, a, m)
if (size(r, dim = 1) /= 3) stop 51
if (any(r /= (/ 2, 3, 1 /))) stop 52
end subroutine
subroutine check_int_const_shape_rank_3_optional_mask_absent()
integer :: a(4,4,4)
integer, allocatable :: r(:)
a = reshape(data64, shape(a))
call call_maxloc_int(r, a)
if (size(r, dim = 1) /= 3) stop 61
if (any(r /= (/ 2, 2, 1 /))) stop 62
end subroutine
subroutine check_int_const_shape_empty_4()
integer :: a(9,3,0,7)
logical :: m(9,3,0,7)
integer, allocatable :: r(:)
a = reshape((/ integer:: /), shape(a))
m = reshape((/ logical:: /), shape(m))
r = maxloc(a, mask = m)
if (size(r, dim = 1) /= 4) stop 71
if (any(r /= (/ 0, 0, 0, 0 /))) stop 72
end subroutine
subroutine check_int_alloc_rank_1()
integer, allocatable :: a(:)
logical, allocatable :: m(:)
integer, allocatable :: r(:)
allocate(a(10), m(10))
a(:) = data10
m(:) = mask10
r = maxloc(a, mask = m)
if (size(r, dim = 1) /= 1) stop 81
if (any(r /= (/ 5 /))) stop 82
end subroutine
subroutine check_int_alloc_rank_3()
integer, allocatable :: a(:,:,:)
logical, allocatable :: m(:,:,:)
integer, allocatable :: r(:)
allocate(a(4,4,4), m(4,4,4))
a(:,:,:) = reshape(data64, shape(a))
m(:,:,:) = reshape(mask64, shape(m))
r = maxloc(a, mask = m)
if (size(r, dim = 1) /= 3) stop 91
if (any(r /= (/ 2, 3, 1 /))) stop 92
end subroutine
subroutine check_int_alloc_rank_3_true_mask()
integer, allocatable :: a(:,:,:)
integer, allocatable :: r(:)
allocate(a(4,4,4))
a(:,:,:) = reshape(data64, shape(a))
r = maxloc(a, mask = .true.)
if (size(r, dim = 1) /= 3) stop 101
if (any(r /= (/ 2, 2, 1 /))) stop 102
end subroutine
subroutine check_int_alloc_rank_3_false_mask()
integer, allocatable :: a(:,:,:)
integer, allocatable :: r(:)
allocate(a(4,4,4))
a(:,:,:) = reshape(data64, shape(a))
r = maxloc(a, mask = .false.)
if (size(r, dim = 1) /= 3) stop 111
if (any(r /= (/ 0, 0, 0 /))) stop 112
end subroutine
subroutine check_int_alloc_empty_4()
integer, allocatable :: a(:,:,:,:)
logical, allocatable :: m(:,:,:,:)
integer, allocatable :: r(:)
allocate(a(9,3,0,7), m(9,3,0,7))
a(:,:,:,:) = reshape((/ integer:: /), shape(a))
m(:,:,:,:) = reshape((/ logical:: /), shape(m))
r = maxloc(a, mask = m)
if (size(r, dim = 1) /= 4) stop 121
if (any(r /= (/ 0, 0, 0, 0 /))) stop 122
end subroutine
subroutine check_real_const_shape_rank_1()
real :: a(10)
logical :: m(10)
integer, allocatable :: r(:)
a = (/ real:: data10 /)
m = mask10
r = maxloc(a, mask = m)
if (size(r, dim = 1) /= 1) stop 131
if (any(r /= (/ 5 /))) stop 132
end subroutine
subroutine check_real_const_shape_rank_3()
real :: a(4,4,4)
logical :: m(4,4,4)
integer, allocatable :: r(:)
a = reshape((/ real:: data64 /), shape(a))
m = reshape(mask64, shape(m))
r = maxloc(a, mask = m)
if (size(r, dim = 1) /= 3) stop 141
if (any(r /= (/ 2, 3, 1 /))) stop 142
end subroutine
subroutine check_real_const_shape_rank_3_true_mask()
real :: a(4,4,4)
integer, allocatable :: r(:)
a = reshape((/ real:: data64 /), shape(a))
r = maxloc(a, mask = .true.)
if (size(r, dim = 1) /= 3) stop 151
if (any(r /= (/ 2, 2, 1 /))) stop 152
end subroutine
subroutine check_real_const_shape_rank_3_false_mask()
real :: a(4,4,4)
integer, allocatable :: r(:)
a = reshape((/ real:: data64 /), shape(a))
r = maxloc(a, mask = .false.)
if (size(r, dim = 1) /= 3) stop 161
if (any(r /= (/ 0, 0, 0 /))) stop 162
end subroutine
subroutine call_maxloc_real(r, a, m)
real :: a(:,:,:)
logical, optional :: m(:,:,:)
integer, allocatable :: r(:)
r = maxloc(a, mask = m)
end subroutine
subroutine check_real_const_shape_rank_3_optional_mask_present()
real :: a(4,4,4)
logical :: m(4,4,4)
integer, allocatable :: r(:)
a = reshape((/ real:: data64 /), shape(a))
m = reshape(mask64, shape(m))
call call_maxloc_real(r, a, m)
if (size(r, dim = 1) /= 3) stop 171
if (any(r /= (/ 2, 3, 1 /))) stop 172
end subroutine
subroutine check_real_const_shape_rank_3_optional_mask_absent()
real :: a(4,4,4)
integer, allocatable :: r(:)
a = reshape((/ real:: data64 /), shape(a))
call call_maxloc_real(r, a)
if (size(r, dim = 1) /= 3) stop 181
if (any(r /= (/ 2, 2, 1 /))) stop 182
end subroutine
subroutine check_real_const_shape_empty_4()
real :: a(9,3,0,7)
logical :: m(9,3,0,7)
integer, allocatable :: r(:)
a = reshape((/ real:: /), shape(a))
m = reshape((/ logical:: /), shape(m))
r = maxloc(a, mask = m)
if (size(r, dim = 1) /= 4) stop 191
if (any(r /= (/ 0, 0, 0, 0 /))) stop 192
end subroutine
subroutine check_real_alloc_rank_1()
real, allocatable :: a(:)
logical, allocatable :: m(:)
integer, allocatable :: r(:)
allocate(a(10), m(10))
a(:) = (/ real:: data10 /)
m(:) = mask10
r = maxloc(a, mask = m)
if (size(r, dim = 1) /= 1) stop 201
if (any(r /= (/ 5 /))) stop 202
end subroutine
subroutine check_real_alloc_rank_3()
real, allocatable :: a(:,:,:)
logical, allocatable :: m(:,:,:)
integer, allocatable :: r(:)
allocate(a(4,4,4), m(4,4,4))
a(:,:,:) = reshape((/ real:: data64 /), shape(a))
m(:,:,:) = reshape(mask64, shape(m))
r = maxloc(a, mask = m)
if (size(r, dim = 1) /= 3) stop 211
if (any(r /= (/ 2, 3, 1 /))) stop 212
end subroutine
subroutine check_real_alloc_rank_3_true_mask()
real, allocatable :: a(:,:,:)
integer, allocatable :: r(:)
allocate(a(4,4,4))
a(:,:,:) = reshape((/ real:: data64 /), shape(a))
r = maxloc(a, mask = .true.)
if (size(r, dim = 1) /= 3) stop 221
if (any(r /= (/ 2, 2, 1 /))) stop 222
end subroutine
subroutine check_real_alloc_rank_3_false_mask()
real, allocatable :: a(:,:,:)
integer, allocatable :: r(:)
allocate(a(4,4,4))
a(:,:,:) = reshape((/ real:: data64 /), shape(a))
r = maxloc(a, mask = .false.)
if (size(r, dim = 1) /= 3) stop 231
if (any(r /= (/ 0, 0, 0 /))) stop 232
end subroutine
subroutine check_real_alloc_empty_4()
real, allocatable :: a(:,:,:,:)
logical, allocatable :: m(:,:,:,:)
integer, allocatable :: r(:)
allocate(a(9,3,0,7), m(9,3,0,7))
a(:,:,:,:) = reshape((/ real:: /), shape(a))
m(:,:,:,:) = reshape((/ logical :: /), shape(m))
r = maxloc(a, mask = m)
if (size(r, dim = 1) /= 4) stop 241
if (any(r /= (/ 0, 0, 0, 0 /))) stop 242
end subroutine
subroutine check_lower_bounds()
real, allocatable :: a(:,:,:)
logical, allocatable :: m(:,:,:)
integer, allocatable :: r(:)
allocate(a(3:6,-1:2,4), m(3:6,-1:2,4))
a(:,:,:) = reshape((/ real:: data64 /), shape(a))
m = reshape(mask64, shape(m))
r = maxloc(a, mask = m)
if (size(r, dim = 1) /= 3) stop 251
if (any(r /= (/ 2, 3, 1 /))) stop 252
end subroutine
elemental subroutine set(o, i)
integer, intent(out) :: o
integer, intent(in) :: i
o = i
end subroutine
subroutine check_dependencies()
integer, allocatable :: a(:,:,:)
allocate(a(3,3,3))
! Direct assignment
a(:,:,:) = reshape(data64(1:27), shape(a))
a(1,1,:) = maxloc(a, mask=a>1)
print *, a(1,1,:)
if (any(a(1,1,:) /= (/ 3, 2, 1 /))) stop 171
a(:,:,:) = reshape(data64(2:28), shape(a))
a(3,3,:) = maxloc(a, mask=a>1)
if (any(a(3,3,:) /= (/ 2, 2, 1 /))) stop 172
a(:,:,:) = reshape(data64(3:29), shape(a))
a(1,:,1) = maxloc(a, mask=a>1)
if (any(a(1,:,1) /= (/ 1, 2, 1 /))) stop 173
a(:,:,:) = reshape(data64(5:31), shape(a))
a(2,:,2) = maxloc(a, mask=a>1)
if (any(a(2,:,2) /= (/ 2, 1, 1 /))) stop 174
a(:,:,:) = reshape(data64(6:32), shape(a))
a(3,:,3) = maxloc(a, mask=a>1)
if (any(a(3,:,3) /= (/ 1, 1, 1 /))) stop 175
a(:,:,:) = reshape(data64(7:33), shape(a))
a(:,1,1) = maxloc(a, mask=a>1)
if (any(a(:,1,1) /= (/ 3, 2, 2 /))) stop 176
a(:,:,:) = reshape(data64(8:34), shape(a))
a(:,3,3) = maxloc(a, mask=a>1)
if (any(a(:,3,3) /= (/ 2, 2, 2 /))) stop 177
! Subroutine assignment
a(:,:,:) = reshape(data64(9:35), shape(a))
call set(a(1,1,:), maxloc(a, mask=a>1))
if (any(a(1,1,:) /= (/ 1, 2, 2 /))) stop 181
a(:,:,:) = reshape(data64(10:36), shape(a))
call set(a(3,3,:), maxloc(a, mask=a>1))
if (any(a(3,3,:) /= (/ 3, 1, 2 /))) stop 182
a(:,:,:) = reshape(data64(11:37), shape(a))
call set(a(1,:,1), maxloc(a, mask=a>1))
if (any(a(1,:,1) /= (/ 2, 1, 2 /))) stop 183
a(:,:,:) = reshape(data64(12:38), shape(a))
call set(a(2,:,2), maxloc(a, mask=a>1))
if (any(a(2,:,2) /= (/ 1, 1, 2 /))) stop 184
a(:,:,:) = reshape(data64(13:39), shape(a))
call set(a(3,:,3), maxloc(a, mask=a>1))
if (any(a(3,:,3) /= (/ 3, 3, 1 /))) stop 185
a(:,:,:) = reshape(data64(14:40), shape(a))
call set(a(:,1,1), maxloc(a, mask=a>1))
if (any(a(:,1,1) /= (/ 2, 3, 1 /))) stop 186
a(:,:,:) = reshape(data64(15:41), shape(a))
call set(a(:,3,3), maxloc(a, mask=a>1))
if (any(a(:,3,3) /= (/ 1, 3, 1 /))) stop 187
call set(a(1,:,:), maxloc(a, dim=1))
end subroutine check_dependencies
end program p