| program main |
| use omp_lib |
| use iso_c_binding |
| implicit none (external, type) |
| integer :: d, id |
| type(c_ptr) :: p, p1, p2 |
| integer, target :: a(1:0), b(1:2) |
| |
| d = omp_get_default_device () |
| id = omp_get_initial_device () |
| |
| if (d < 0 .or. d >= omp_get_num_devices ()) & |
| d = id |
| |
| p = omp_target_alloc (c_sizeof (c_int), d) |
| if (.not. c_associated (p)) & |
| stop 0 ! okay |
| |
| if (omp_target_associate_ptr (c_loc (a), p, c_sizeof (c_int), & |
| 0_c_size_t, d) == 0) then |
| |
| if(.not. c_associated (omp_get_mapped_ptr (c_loc (a), d), p)) & |
| stop 1 |
| |
| if (omp_target_disassociate_ptr (c_loc (a), d) /= 0) & |
| stop 2 |
| |
| if(c_associated (omp_get_mapped_ptr (c_loc (a), d))) & |
| stop 3 |
| |
| !$omp target data map(alloc: a) device(d) |
| !$omp target map(from: p1) map(alloc: a) device(d) |
| p1 = c_loc (a); |
| !$omp end target |
| if (c_associated (omp_get_mapped_ptr (c_loc (a), d))) & |
| stop 4 |
| !$omp end target data |
| |
| !$omp target data map(alloc: b(1:0)) device(d) |
| !$omp target map(from: p2) map(alloc: b(1:0)) device(d) |
| p2 = c_loc (b(1)); |
| !$omp end target |
| if (c_associated (omp_get_mapped_ptr (c_loc (b(1)), d))) & |
| stop 5 |
| !$omp end target data |
| end if |
| call omp_target_free (p, d) |
| end program main |