| ! Basic test whether self_maps work |
| |
| module m |
| !$omp requires self_maps |
| implicit none (type, external) |
| type t |
| integer :: val |
| type(t), pointer :: next |
| end type t |
| contains |
| subroutine init(p) |
| integer :: i |
| type(t), pointer :: p, x |
| allocate(x) |
| p => x |
| do i = 1, 5 |
| x%val = i |
| if (i < 5) then |
| allocate(x%next) |
| x => x%next |
| end if |
| end do |
| end subroutine |
| |
| subroutine check(p) |
| !$omp declare target enter(check) |
| integer :: i |
| type(t), pointer :: p, x |
| x => p |
| do i = 1, 5 |
| if (x%val /= i) stop 1 |
| x => x%next |
| end do |
| end subroutine |
| end module |
| |
| use omp_lib |
| use m |
| implicit none (type, external) |
| type(t), pointer :: linked |
| integer :: i |
| |
| call init(linked) |
| do i = 0, omp_get_num_devices() |
| !$omp target device(i) |
| call check(linked) |
| !$omp end target |
| end do |
| end |