| ! This test validates that declare mapper for a derived type that extends | |
| ! a parent type with an allocatable component correctly maps the nested | |
| ! allocatable payload via the mapper when the whole object is mapped on | |
| ! target. | |
| ! REQUIRES: flang, amdgpu | |
| ! RUN: %libomptarget-compile-fortran-run-and-check-generic | |
| program target_declare_mapper_parent_allocatable | |
| implicit none | |
| type, abstract :: base_t | |
| real, allocatable :: base_arr(:) | |
| end type base_t | |
| type, extends(base_t) :: real_t | |
| real, allocatable :: real_arr(:) | |
| end type real_t | |
| !$omp declare mapper(custommapper: real_t :: t) map(t%base_arr, t%real_arr) | |
| type(real_t) :: r | |
| integer :: i | |
| allocate(r%base_arr(10), source=1.0) | |
| allocate(r%real_arr(10), source=1.0) | |
| !$omp target map(mapper(custommapper), tofrom: r) | |
| do i = 1, size(r%base_arr) | |
| r%base_arr(i) = 2.0 | |
| r%real_arr(i) = 3.0 | |
| r%real_arr(i) = r%base_arr(1) | |
| end do | |
| !$omp end target | |
| !CHECK: base_arr: 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. | |
| print*, "base_arr: ", r%base_arr | |
| !CHECK: real_arr: 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. | |
| print*, "real_arr: ", r%real_arr | |
| deallocate(r%real_arr) | |
| deallocate(r%base_arr) | |
| end program target_declare_mapper_parent_allocatable |