| ! This test validates that declare mapper for a derived type with an | |
| ! allocatable component preserves TO/FROM semantics for the component, | |
| ! ensuring the payload is copied back to the host on target exit. | |
| ! REQUIRES: flang, amdgpu | |
| ! RUN: %libomptarget-compile-fortran-run-and-check-generic | |
| program target_declare_mapper_allocatable | |
| implicit none | |
| type :: real_t | |
| real, allocatable :: real_arr(:) | |
| end type real_t | |
| ! Map the allocatable array payload via a named mapper. | |
| !$omp declare mapper (xyz : real_t :: t) map(tofrom: t%real_arr) | |
| type(real_t) :: r | |
| integer :: i | |
| logical :: ok | |
| allocate(r%real_arr(10)) | |
| r%real_arr = 1.0 | |
| !$omp target map(mapper(xyz), tofrom: r) | |
| do i = 1, size(r%real_arr) | |
| r%real_arr(i) = 3.0 | |
| end do | |
| !$omp end target | |
| ok = .true. | |
| do i = 1, size(r%real_arr) | |
| if (r%real_arr(i) /= 3.0) ok = .false. | |
| end do | |
| if (ok) then | |
| print *, "Test passed!" | |
| else | |
| print *, "Test failed!" | |
| do i = 1, size(r%real_arr) | |
| print *, r%real_arr(i) | |
| end do | |
| end if | |
| deallocate(r%real_arr) | |
| end program target_declare_mapper_allocatable | |
| ! CHECK: Test passed! |