(root)/
gcc-13.2.0/
gcc/
testsuite/
gfortran.dg/
coarray/
lock_2.f90
! { dg-do run }
!
! LOCK/UNLOCK check
!
! PR fortran/18918
!

use iso_fortran_env
implicit none

type(lock_type), allocatable :: lock1[:]
type(lock_type), allocatable :: lock2(:,:)[:]
type(lock_type) :: lock3(4)[*]
integer :: stat
logical :: acquired

allocate(lock1[*])
allocate(lock2(2,2)[*])

LOCK(lock1)
UNLOCK(lock1)

LOCK(lock2(1,1))
LOCK(lock2(2,2))
UNLOCK(lock2(1,1))
UNLOCK(lock2(2,2))

LOCK(lock3(3))
LOCK(lock3(4))
UNLOCK(lock3(3))
UNLOCK(lock3(4))

stat = 99
LOCK(lock1, stat=stat)
if (stat /= 0) STOP 1

LOCK(lock2(1,1), stat=stat)
if (stat /= 0) STOP 2
LOCK(lock2(2,2), stat=stat)
if (stat /= 0) STOP 3

LOCK(lock3(3), stat=stat)
if (stat /= 0) STOP 4
LOCK(lock3(4), stat=stat)
if (stat /= 0) STOP 5

stat = 99
UNLOCK(lock1, stat=stat)
if (stat /= 0) STOP 6

UNLOCK(lock2(1,1), stat=stat)
if (stat /= 0) STOP 7
UNLOCK(lock2(2,2), stat=stat)
if (stat /= 0) STOP 8

UNLOCK(lock3(3), stat=stat)
if (stat /= 0) STOP 9
UNLOCK(lock3(4), stat=stat)
if (stat /= 0) STOP 10

if (this_image() == 1) then
  acquired = .false.
  LOCK (lock1[this_image()], acquired_lock=acquired)
  if (.not. acquired) STOP 11

  acquired = .false.
  LOCK (lock2(1,1)[this_image()], acquired_lock=acquired)
  if (.not. acquired) STOP 12

  acquired = .false.
  LOCK (lock2(2,2)[this_image()], acquired_lock=acquired)
  if (.not. acquired) STOP 13

  acquired = .false.
  LOCK (lock3(3)[this_image()], acquired_lock=acquired)
  if (.not. acquired) STOP 14

  acquired = .false.
  LOCK (lock3(4)[this_image()], acquired_lock=acquired)
  if (.not. acquired) STOP 15

  UNLOCK (lock1[1])
  UNLOCK (lock2(1,1)[1])
  UNLOCK (lock2(2,2)[1])
  UNLOCK (lock3(3)[1])
  UNLOCK (lock3(4)[1])
end if
end