|  | program main | 
|  | use omp_lib | 
|  | use iso_c_binding | 
|  | implicit none (external, type) | 
|  | integer :: d, id, i, j, k, l | 
|  | logical :: err | 
|  | integer, target :: q(0:127) | 
|  | type(c_ptr) :: p | 
|  |  | 
|  | integer(kind=c_size_t) :: volume(0:2) | 
|  | integer(kind=c_size_t) :: dst_offsets(0:2) | 
|  | integer(kind=c_size_t) :: src_offsets(0:2) | 
|  | integer(kind=c_size_t) :: dst_dimensions(0:2) | 
|  | integer(kind=c_size_t) :: src_dimensions(0:2) | 
|  | integer(kind=c_size_t) :: empty(1:0) | 
|  |  | 
|  | err = .false. | 
|  | d = omp_get_default_device () | 
|  | id = omp_get_initial_device () | 
|  |  | 
|  | if (d < 0 .or. d >= omp_get_num_devices ()) & | 
|  | d = id | 
|  |  | 
|  | q = [(i, i = 0, 127)] | 
|  | p = omp_target_alloc (130 * c_sizeof (q), d) | 
|  | if (.not. c_associated (p)) & | 
|  | stop 0  ! okay | 
|  |  | 
|  | if (omp_target_memcpy_rect (C_NULL_PTR, C_NULL_PTR, 0_c_size_t, 0, & | 
|  | empty, empty, empty, empty,  empty, d, id) < 3 & | 
|  | .or. omp_target_memcpy_rect (C_NULL_PTR, C_NULL_PTR, 0_c_size_t, 0, & | 
|  | empty, empty, empty, empty, empty, & | 
|  | id, d) < 3 & | 
|  | .or. omp_target_memcpy_rect (C_NULL_PTR, C_NULL_PTR, 0_c_size_t, 0, & | 
|  | empty, empty, empty, empty, empty, & | 
|  | id, id) < 3) & | 
|  | stop 1 | 
|  |  | 
|  | if (omp_target_associate_ptr (c_loc (q), p, 128 * c_sizeof (q(0)), & | 
|  | c_sizeof (q(0)), d) == 0) then | 
|  | volume = [ 128, 0, 0 ] | 
|  | dst_offsets = [ 0, 0, 0 ] | 
|  | src_offsets = [ 1, 0, 0 ] | 
|  | dst_dimensions = [ 128, 0, 0 ] | 
|  | src_dimensions = [ 128, 0, 0 ] | 
|  |  | 
|  |  | 
|  | if (omp_target_associate_ptr (c_loc (q), p, 128 * sizeof (q(0)), & | 
|  | sizeof (q(0)), d) /= 0) & | 
|  | stop 2 | 
|  |  | 
|  | if (omp_target_is_present (c_loc (q), d) /= 1 & | 
|  | .or. omp_target_is_present (c_loc (q(32)), d) /= 1 & | 
|  | .or. omp_target_is_present (c_loc (q(127)), d) /= 1) & | 
|  | stop 3 | 
|  |  | 
|  | if (omp_target_memcpy (p, c_loc (q), 128 * sizeof (q(0)), sizeof (q(0)), & | 
|  | 0_c_size_t, d, id) /= 0) & | 
|  | stop 4 | 
|  |  | 
|  | i = 0 | 
|  | if (d >= 0) i = d | 
|  | !$omp target if (d >= 0) device (i) map(alloc:q(0:31)) map(from:err) | 
|  | err = .false. | 
|  | do j = 0, 127 | 
|  | if (q(j) /= j) then | 
|  | err = .true. | 
|  | else | 
|  | q(j) = q(j) + 4 | 
|  | end if | 
|  | end do | 
|  | !$omp end target | 
|  |  | 
|  | if (err) & | 
|  | stop 5 | 
|  |  | 
|  | if (omp_target_memcpy_rect (c_loc (q), p, sizeof (q(0)), 1, volume, & | 
|  | dst_offsets, src_offsets, dst_dimensions, & | 
|  | src_dimensions, id, d) /= 0) & | 
|  | stop 6 | 
|  |  | 
|  | do i = 0, 127 | 
|  | if (q(i) /= i + 4) & | 
|  | stop 7 | 
|  | end do | 
|  |  | 
|  | volume(2) = 2 | 
|  | volume(1) = 3 | 
|  | volume(0) = 6 | 
|  | dst_offsets(2) = 1 | 
|  | dst_offsets(1) = 0 | 
|  | dst_offsets(0) = 0 | 
|  | src_offsets(2) = 1 | 
|  | src_offsets(1) = 0 | 
|  | src_offsets(0) = 3 | 
|  | dst_dimensions(2) = 2 | 
|  | dst_dimensions(1) = 3 | 
|  | dst_dimensions(0) = 6 | 
|  | src_dimensions(2) = 3 | 
|  | src_dimensions(1) = 4 | 
|  | src_dimensions(0) = 6 | 
|  |  | 
|  | if (omp_target_memcpy_rect (p, c_loc (q), sizeof (q(0)), 3, volume, & | 
|  | dst_offsets, src_offsets, dst_dimensions, & | 
|  | src_dimensions, d, id) /= 0) & | 
|  | stop 8 | 
|  |  | 
|  | i = 0 | 
|  | if (d >= 0) i = d | 
|  | !$omp target if (d >= 0) device (i) map(alloc:q(1:32)) map(from:err) | 
|  | err = .false. | 
|  | do j = 0, 5 | 
|  | do k = 0, 2 | 
|  | do l = 0, 1 | 
|  | if (q(j * 6 + k * 2 + l) /= 3 * 12 + 4 + 1 + l + k * 3 + j * 12) & | 
|  | err = .true. | 
|  | end do | 
|  | end do | 
|  | end do | 
|  | !$omp end target | 
|  |  | 
|  | if (err) & | 
|  | stop 9 | 
|  |  | 
|  | if (omp_target_memcpy (p, p, 10 * sizeof (q(1)), 51 * sizeof (q(1)), & | 
|  | 111 * sizeof (q(1)), d, d) /= 0) & | 
|  | stop 10 | 
|  |  | 
|  | i = 0 | 
|  | if (d >= 0) i = d | 
|  | !$omp target if (d >= 0) device (i) map(alloc:q(0:31)) map(from:err) | 
|  | err = .false. | 
|  | do j = 1, 9 | 
|  | if (q(50+j) /= q(110 + j)) & | 
|  | err = .true. | 
|  | end do | 
|  | !$omp end target | 
|  |  | 
|  | if (err) & | 
|  | stop 11 | 
|  |  | 
|  | if (omp_target_disassociate_ptr (c_loc (q), d) /= 0) & | 
|  | stop 12 | 
|  | end if | 
|  |  | 
|  | call omp_target_free (p, d) | 
|  | end program main |