1! Test 'allocatable' with OpenMP 'target' 'map' clauses, subroutine in module, 2! pass by reference. 3 4! See also '../libgomp.oacc-fortran/allocatable-1-2.f90'. 5 6! { dg-do run } 7! { dg-additional-options "-cpp" } 8! { dg-additional-options "-DMEM_SHARED" { target offload_device_shared_as } } 9 10module m 11contains 12 subroutine r (a, b, c, d, e) 13 implicit none 14 integer, allocatable :: a, b, c, d, e 15 16 !$omp target map(to: a) map(tofrom: b, c, d) map(from: e) 17 18 if (.not. allocated (a)) stop 1 19 if (a .ne. 11) stop 2 20 a = 33 21 22 if (.not. allocated (b)) stop 3 23 if (b .ne. 25) stop 4 24 25 if (.not. allocated (c)) stop 5 26 if (c .ne. 52) stop 6 27 c = 10 28 29 if (allocated (d)) stop 7 30 d = 42 ! Implicit allocation, but on device only. 31 if (.not. allocated (d)) stop 8 32 deallocate (d) ! OpenMP requires must be "unallocated upon exit from the region". 33 34 if (allocated (e)) stop 9 35 e = 24 ! Implicit allocation, but on device only. 36 if (.not. allocated (e)) stop 10 37 deallocate (e) ! OpenMP requires must be "unallocated upon exit from the region". 38 39 !$omp end target 40 41 end subroutine r 42end module m 43 44program main 45 use m 46 implicit none 47 integer, allocatable :: a, b, c, d, e 48 49 allocate (a) 50 a = 11 51 52 b = 25 ! Implicit allocation. 53 54 c = 52 ! Implicit allocation. 55 56 !No 'allocate (d)' here. 57 58 !No 'allocate (e)' here. 59 60 call r(a, b, c, d, e) 61 62 if (.not. allocated (a)) stop 20 63#ifdef MEM_SHARED 64 if (a .ne. 33) stop 21 65#else 66 if (a .ne. 11) stop 22 67#endif 68 deallocate (a) 69 70 if (.not. allocated (b)) stop 23 71 if (b .ne. 25) stop 24 72 deallocate (b) 73 74 if (.not. allocated (c)) stop 25 75 if (c .ne. 10) stop 26 76 deallocate (c) 77 78 if (allocated (d)) stop 27 79 80 if (allocated (e)) stop 28 81 82end program main 83