blob: 20f63a84bbe5f74b24f23f884a12cc3eb7ed04b9 [file] [log] [blame]
! { dg-do run }
!
! PR fortran/90608
! Check that the evaluation of MAXLOC's BACK argument is made only once
! before the scalarization loops, when the DIM argument is present.
program p
implicit none
integer, parameter :: data60(*) = (/ 7, 4, 5, 3, 9, 0, 6, 4, 5, 5, &
8, 2, 6, 7, 8, 7, 4, 5, 3, 9, &
0, 6, 4, 5, 5, 8, 2, 6, 7, 8, &
7, 4, 5, 3, 9, 0, 6, 4, 5, 5, &
8, 2, 6, 7, 8, 7, 4, 5, 3, 9, &
0, 6, 4, 5, 5, 8, 2, 6, 7, 8 /)
logical, parameter :: mask60(*) = (/ .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. /)
integer :: calls_count = 0
call check_int_const_shape_rank_3
call check_int_const_shape_rank_3_scalar_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_rank_3_array_mask
call check_int_const_shape_empty_4
call check_int_alloc_rank_3
call check_int_alloc_rank_3_scalar_mask
call check_int_alloc_rank_3_array_mask
call check_int_alloc_empty_4
call check_real_const_shape_rank_3
call check_real_const_shape_rank_3_scalar_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_rank_3_array_mask
call check_real_const_shape_empty_4
call check_real_alloc_rank_3
call check_real_alloc_rank_3_scalar_mask
call check_real_alloc_rank_3_array_mask
call check_real_alloc_empty_4
contains
function get_scalar_false()
logical :: get_scalar_false
calls_count = calls_count + 1
get_scalar_false = .false.
end function
subroutine check_int_const_shape_rank_3()
integer :: a(3,4,5)
integer, allocatable :: r(:,:)
a = reshape(data60, shape(a))
calls_count = 0
r = maxloc(a, dim = 1, back = get_scalar_false())
if (calls_count /= 1) error stop 12
r = maxloc(a, dim = 2, back = get_scalar_false())
if (calls_count /= 2) error stop 15
r = maxloc(a, dim = 3, back = get_scalar_false())
if (calls_count /= 3) error stop 18
end subroutine
subroutine check_int_const_shape_rank_3_scalar_mask()
integer :: a(3,4,5)
integer, allocatable :: r(:,:)
a = reshape(data60, shape(a))
calls_count = 0
! We only check the case of a .true. mask.
! If the mask is .false., the back argument is not necessary to deduce
! the value returned by maxloc, so the compiler is free to elide it,
! and the value of calls_count is undefined in that case.
r = maxloc(a, dim = 1, mask = .true., back = get_scalar_false())
if (calls_count /= 1) error stop 22
r = maxloc(a, dim = 2, mask = .true., back = get_scalar_false())
if (calls_count /= 2) error stop 25
r = maxloc(a, dim = 3, mask = .true., back = get_scalar_false())
if (calls_count /= 3) error stop 28
end subroutine
subroutine call_maxloc_int(r, a, m, b)
integer :: a(:,:,:)
logical, optional :: m(:,:,:)
logical, optional :: b
integer, allocatable :: r(:,:)
r = maxloc(a, dim = 2, mask = m, back = b)
end subroutine
subroutine check_int_const_shape_rank_3_optional_mask_present()
integer :: a(3,4,5)
logical :: m(3,4,5)
integer, allocatable :: r(:,:)
a = reshape(data60, shape(a))
m = reshape(mask60, shape(m))
calls_count = 0
call call_maxloc_int(r, a, m, get_scalar_false())
if (calls_count /= 1) error stop 45
end subroutine
subroutine check_int_const_shape_rank_3_optional_mask_absent()
integer :: a(3,4,5)
integer, allocatable :: r(:,:)
a = reshape(data60, shape(a))
calls_count = 0
call call_maxloc_int(r, a, b = get_scalar_false())
if (calls_count /= 1) error stop 55
end subroutine
subroutine check_int_const_shape_rank_3_array_mask()
integer :: a(3,4,5)
logical :: m(3,4,5)
integer, allocatable :: r(:,:)
a = reshape(data60, shape(a))
m = reshape(mask60, shape(m))
calls_count = 0
r = maxloc(a, dim = 1, mask = m, back = get_scalar_false())
if (calls_count /= 1) error stop 62
r = maxloc(a, dim = 2, mask = m, back = get_scalar_false())
if (calls_count /= 2) error stop 65
r = maxloc(a, dim = 3, mask = m, back = get_scalar_false())
if (calls_count /= 3) error stop 68
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))
calls_count = 0
r = maxloc(a, dim = 1, mask = m, back = get_scalar_false())
if (calls_count /= 1) error stop 72
r = maxloc(a, dim = 2, mask = m, back = get_scalar_false())
if (calls_count /= 2) error stop 74
r = maxloc(a, dim = 3, mask = m, back = get_scalar_false())
if (calls_count /= 3) error stop 76
r = maxloc(a, dim = 4, mask = m, back = get_scalar_false())
if (calls_count /= 4) error stop 78
end subroutine
subroutine check_int_alloc_rank_3()
integer, allocatable :: a(:,:,:)
integer, allocatable :: r(:,:)
allocate(a(3,4,5))
a(:,:,:) = reshape(data60, shape(a))
calls_count = 0
r = maxloc(a, dim = 1, back = get_scalar_false())
if (calls_count /= 1) error stop 82
r = maxloc(a, dim = 2, back = get_scalar_false())
if (calls_count /= 2) error stop 85
r = maxloc(a, dim = 3, back = get_scalar_false())
if (calls_count /= 3) error stop 88
end subroutine
subroutine check_int_alloc_rank_3_scalar_mask()
integer, allocatable :: a(:,:,:)
integer, allocatable :: r(:,:)
allocate(a(3,4,5))
a(:,:,:) = reshape(data60, shape(a))
calls_count = 0
! We only check the case of a .true. mask.
! If the mask is .false., the back argument is not necessary to deduce
! the value returned by maxloc, so the compiler is free to elide it,
! and the value of calls_count is undefined in that case.
r = maxloc(a, dim = 1, mask = .true., back = get_scalar_false())
if (calls_count /= 1) error stop 92
r = maxloc(a, dim = 2, mask = .true., back = get_scalar_false())
if (calls_count /= 2) error stop 95
r = maxloc(a, dim = 3, mask = .true., back = get_scalar_false())
if (calls_count /= 3) error stop 98
end subroutine
subroutine check_int_alloc_rank_3_array_mask()
integer, allocatable :: a(:,:,:)
logical, allocatable :: m(:,:,:)
integer, allocatable :: r(:,:)
allocate(a(3,4,5), m(3,4,5))
a(:,:,:) = reshape(data60, shape(a))
m(:,:,:) = reshape(mask60, shape(m))
calls_count = 0
r = maxloc(a, dim = 1, mask = m, back = get_scalar_false())
if (calls_count /= 1) error stop 102
r = maxloc(a, dim = 2, mask = m, back = get_scalar_false())
if (calls_count /= 2) error stop 105
r = maxloc(a, dim = 3, mask = m, back = get_scalar_false())
if (calls_count /= 3) error stop 108
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))
calls_count = 0
r = maxloc(a, dim = 1, mask = m, back = get_scalar_false())
if (calls_count /= 1) error stop 112
r = maxloc(a, dim = 2, mask = m, back = get_scalar_false())
if (calls_count /= 2) error stop 114
r = maxloc(a, dim = 3, mask = m, back = get_scalar_false())
if (calls_count /= 3) error stop 116
r = maxloc(a, dim = 4, mask = m, back = get_scalar_false())
if (calls_count /= 4) error stop 118
end subroutine
subroutine check_real_const_shape_rank_3()
real :: a(3,4,5)
logical :: m(3,4,5)
integer, allocatable :: r(:,:)
a = reshape((/ real:: data60 /), shape(a))
m = reshape(mask60, shape(m))
calls_count = 0
r = maxloc(a, dim = 1, back = get_scalar_false())
if (calls_count /= 1) error stop 122
r = maxloc(a, dim = 2, back = get_scalar_false())
if (calls_count /= 2) error stop 125
r = maxloc(a, dim = 3, back = get_scalar_false())
if (calls_count /= 3) error stop 128
end subroutine
subroutine check_real_const_shape_rank_3_scalar_mask()
real :: a(3,4,5)
integer, allocatable :: r(:,:)
a = reshape((/ real:: data60 /), shape(a))
calls_count = 0
! We only check the case of a .true. mask.
! If the mask is .false., the back argument is not necessary to deduce
! the value returned by maxloc, so the compiler is free to elide it,
! and the value of calls_count is undefined in that case.
r = maxloc(a, dim = 1, mask = .true., back = get_scalar_false())
if (calls_count /= 1) error stop 132
r = maxloc(a, dim = 2, mask = .true., back = get_scalar_false())
if (calls_count /= 2) error stop 135
r = maxloc(a, dim = 3, mask = .true., back = get_scalar_false())
if (calls_count /= 3) error stop 138
end subroutine
subroutine check_real_const_shape_rank_3_array_mask()
real :: a(3,4,5)
logical :: m(3,4,5)
integer, allocatable :: r(:,:)
a = reshape((/ real:: data60 /), shape(a))
m = reshape(mask60, shape(m))
calls_count = 0
r = maxloc(a, dim = 1, mask = m, back = get_scalar_false())
if (calls_count /= 1) error stop 142
r = maxloc(a, dim = 2, mask = m, back = get_scalar_false())
if (calls_count /= 2) error stop 145
r = maxloc(a, dim = 3, mask = m, back = get_scalar_false())
if (calls_count /= 3) error stop 148
end subroutine
subroutine call_maxloc_real(r, a, m, b)
real :: a(:,:,:)
logical, optional :: m(:,:,:)
logical, optional :: b
integer, allocatable :: r(:,:)
r = maxloc(a, dim = 2, mask = m, back = b)
end subroutine
subroutine check_real_const_shape_rank_3_optional_mask_present()
real :: a(3,4,5)
logical :: m(3,4,5)
integer, allocatable :: r(:,:)
a = reshape((/ real:: data60 /), shape(a))
m = reshape(mask60, shape(m))
calls_count = 0
call call_maxloc_real(r, a, m, get_scalar_false())
if (calls_count /= 1) error stop 155
end subroutine
subroutine check_real_const_shape_rank_3_optional_mask_absent()
real :: a(3,4,5)
integer, allocatable :: r(:,:)
a = reshape((/ real:: data60 /), shape(a))
calls_count = 0
call call_maxloc_real(r, a, b = get_scalar_false())
if (calls_count /= 1) error stop 165
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))
calls_count = 0
r = maxloc(a, dim = 1, mask = m, back = get_scalar_false())
if (calls_count /= 1) error stop 172
r = maxloc(a, dim = 2, mask = m, back = get_scalar_false())
if (calls_count /= 2) error stop 174
r = maxloc(a, dim = 3, mask = m, back = get_scalar_false())
if (calls_count /= 3) error stop 176
r = maxloc(a, dim = 4, mask = m, back = get_scalar_false())
if (calls_count /= 4) error stop 178
end subroutine
subroutine check_real_alloc_rank_3()
real, allocatable :: a(:,:,:)
integer, allocatable :: r(:,:)
allocate(a(3,4,5))
a(:,:,:) = reshape((/ real:: data60 /), shape(a))
calls_count = 0
r = maxloc(a, dim = 1, back = get_scalar_false())
if (calls_count /= 1) error stop 182
r = maxloc(a, dim = 2, back = get_scalar_false())
if (calls_count /= 2) error stop 185
r = maxloc(a, dim = 3, back = get_scalar_false())
if (calls_count /= 3) error stop 188
end subroutine
subroutine check_real_alloc_rank_3_scalar_mask()
real, allocatable :: a(:,:,:)
integer, allocatable :: r(:,:)
allocate(a(3,4,5))
a(:,:,:) = reshape((/ real:: data60 /), shape(a))
calls_count = 0
! We only check the case of a .true. mask.
! If the mask is .false., the back argument is not necessary to deduce
! the value returned by maxloc, so the compiler is free to elide it,
! and the value of calls_count is undefined in that case.
r = maxloc(a, dim = 1, mask = .true., back = get_scalar_false())
if (calls_count /= 1) error stop 192
r = maxloc(a, dim = 2, mask = .true., back = get_scalar_false())
if (calls_count /= 2) error stop 195
r = maxloc(a, dim = 3, mask = .true., back = get_scalar_false())
if (calls_count /= 3) error stop 198
end subroutine
subroutine check_real_alloc_rank_3_array_mask()
real, allocatable :: a(:,:,:)
logical, allocatable :: m(:,:,:)
integer, allocatable :: r(:,:)
allocate(a(3,4,5), m(3,4,5))
a(:,:,:) = reshape((/ real:: data60 /), shape(a))
m(:,:,:) = reshape(mask60, shape(m))
calls_count = 0
r = maxloc(a, dim = 1, mask = m, back = get_scalar_false())
if (calls_count /= 1) error stop 202
r = maxloc(a, dim = 2, mask = m, back = get_scalar_false())
if (calls_count /= 2) error stop 205
r = maxloc(a, dim = 3, mask = m, back = get_scalar_false())
if (calls_count /= 3) error stop 208
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))
calls_count = 0
r = maxloc(a, dim = 1, mask = m, back = get_scalar_false())
if (calls_count /= 1) error stop 212
r = maxloc(a, dim = 2, mask = m, back = get_scalar_false())
if (calls_count /= 2) error stop 214
r = maxloc(a, dim = 3, mask = m, back = get_scalar_false())
if (calls_count /= 3) error stop 216
r = maxloc(a, dim = 4, mask = m, back = get_scalar_false())
if (calls_count /= 4) error stop 218
end subroutine
end program p