blob: 63b16d292be77ffd8de14cde9ffbda8613ca63f4 [file]
program main
use omp_lib
use iso_c_binding
implicit none
integer(c_intptr_t) :: iptr
integer (omp_allocator_handle_kind) :: my_alloc
type(omp_alloctrait), parameter :: trait(*) = &
[omp_alloctrait(omp_atk_alignment, 128)]
!$omp target uses_allocators(traits(trait) : my_alloc)
block
type(c_ptr) :: ptr
integer(c_size_t) :: sz = 32
ptr = omp_alloc (sz, my_alloc)
if (mod (TRANSFER (ptr, iptr), 128) /= 0) &
stop 1
call omp_free (ptr, my_alloc)
end block
my_alloc = transfer(int(z'ABCD', omp_allocator_handle_kind), my_alloc)
!$omp target uses_allocators(traits(trait) : my_alloc)
block
type(c_ptr) :: ptr
integer(c_size_t) :: sz = 32
ptr = omp_alloc (sz, my_alloc)
if (mod (TRANSFER (ptr, iptr), 128) /= 0) &
stop 2
call omp_free (ptr, my_alloc)
end block
if (transfer(my_alloc, 0_omp_allocator_handle_kind) /= int(z'ABCD', &
omp_allocator_handle_kind)) &
stop 3
! The following creates an allocator with empty traits + default mem space.
!$omp target uses_allocators(my_alloc)
block
type(c_ptr) :: ptr
integer(c_size_t) :: sz = 32
ptr = omp_aligned_alloc (128_c_size_t, sz, my_alloc)
if (mod (TRANSFER (ptr, iptr), 128) /= 0) &
stop 4
call omp_free (ptr, my_alloc)
end block
if (transfer(my_alloc, 0_omp_allocator_handle_kind) /= int(z'ABCD', &
omp_allocator_handle_kind)) &
stop 5
end program main