! Test 'allocatable' with OpenMP 'target' 'map' clauses.

! See also '../libgomp.oacc-fortran/allocatable-1-1.f90'.

! { dg-do run }
! { dg-additional-options "-cpp" }
! { dg-additional-options "-DMEM_SHARED" { target offload_device_shared_as } }

program main
  implicit none
  integer, allocatable :: a, b, c, d, e

  allocate (a)
  a = 11

  b = 25 ! Implicit allocation.

  c = 52 ! Implicit allocation.

  !No 'allocate (d)' here.

  !No 'allocate (e)' here.

  !$omp target map(to: a) map(tofrom: b, c, d) map(from: e)

  if (.not. allocated (a)) stop 1
  if (a .ne. 11) stop 2
  a = 33

  if (.not. allocated (b)) stop 3
  if (b .ne. 25) stop 4

  if (.not. allocated (c)) stop 5
  if (c .ne. 52) stop 6
  c = 10

  if (allocated (d)) stop 7
  d = 42 ! Implicit allocation, but on device only.
  if (.not. allocated (d)) stop 8
  deallocate (d) ! OpenMP requires must be "unallocated upon exit from the region".

  if (allocated (e)) stop 9
  e = 24 ! Implicit allocation, but on device only.
  if (.not. allocated (e)) stop 10
  deallocate (e) ! OpenMP requires must be "unallocated upon exit from the region".

  !$omp end target

  if (.not. allocated (a)) stop 20
#ifdef MEM_SHARED
  if (a .ne. 33) stop 21
#else
  if (a .ne. 11) stop 22
#endif
  deallocate (a)

  if (.not. allocated (b)) stop 23
  if (b .ne. 25) stop 24
  deallocate (b)

  if (.not. allocated (c)) stop 25
  if (c .ne. 10) stop 26
  deallocate (c)

  if (allocated (d)) stop 27

  if (allocated (e)) stop 28

end program main
