! Test custom mappers with target update to/from clauses ! REQUIRES: flang, amdgpu ! RUN: %libomptarget-compile-fortran-run-and-check-generic program target_update_mapper_test implicit none integer, parameter :: n = 100 type :: my_type integer :: a(n) integer :: b(n) end type my_type ! Declare custom mapper that only maps field 'a' !$omp declare mapper(custom : my_type :: t) map(t%a) ! Declare default mapper that maps both fields !$omp declare mapper(my_type :: t) map(t%a, t%b) type(my_type) :: obj1, obj2 integer :: i, sum_a, sum_b ! ========== Test 1: Custom mapper (field 'a' only) ========== ! Initialize data on host do i = 1, n obj1%a(i) = i obj1%b(i) = i * 2 end do ! Allocate and update using custom mapper (only 'a') !$omp target enter data map(mapper(custom), alloc: obj1) obj1%a = 10 !$omp target update to(mapper(custom): obj1) obj1%a = 0 !$omp target update from(mapper(custom): obj1) sum_a = sum(obj1%a) sum_b = sum(obj1%b) ! CHECK: Sum of a (custom mapper): 1000 print *, "Sum of a (custom mapper):", sum_a ! Field 'b' was never mapped with custom mapper ! CHECK: Sum of b (never mapped): 10100 print *, "Sum of b (never mapped):", sum_b !$omp target exit data map(mapper(custom), delete: obj1) ! ========== Test 2: Default mapper (both fields) ========== ! Initialize separate object for default mapper test do i = 1, n obj2%a(i) = 20 obj2%b(i) = 30 end do ! Allocate and update using default mapper (both 'a' and 'b') !$omp target enter data map(mapper(default), alloc: obj2) !$omp target update to(mapper(default): obj2) obj2%a = 0 obj2%b = 0 !$omp target update from(mapper(default): obj2) sum_a = sum(obj2%a) sum_b = sum(obj2%b) ! CHECK: Sum of a (default mapper): 2000 print *, "Sum of a (default mapper):", sum_a ! CHECK: Sum of b (default mapper): 3000 print *, "Sum of b (default mapper):", sum_b !$omp target exit data map(mapper(default), delete: obj2) ! CHECK: Test passed! print *, "Test passed!" end program target_update_mapper_test