| ! Regression test for default mappers on nested derived types with allocatable |
| ! members when mapping a parent object and running an optimized target region. |
| |
| ! REQUIRES: flang, amdgpu |
| |
| ! RUN: %libomptarget-compile-fortran-generic -O3 |
| ! RUN: %libomptarget-run-generic | %fcheck-generic |
| |
| program test_default_mapper_enter_data_teams_collapse |
| implicit none |
| |
| type inner_type |
| real, allocatable :: data(:) |
| end type inner_type |
| |
| type outer_type |
| type(inner_type) :: inner |
| character(len=19) :: desc = ' ' |
| end type outer_type |
| |
| type(outer_type) :: obj |
| integer, parameter :: n = 10 |
| integer :: i, j |
| real :: expected, actual |
| |
| allocate(obj%inner%data(n)) |
| obj%inner%data = 0.0 |
| |
| !$omp target enter data map(to: obj) |
| |
| !$omp target teams distribute parallel do collapse(2) |
| do i = 1, n |
| do j = 1, n |
| obj%inner%data(i) = real(i) |
| end do |
| end do |
| !$omp end target teams distribute parallel do |
| |
| !$omp target exit data map(from: obj) |
| |
| expected = real(n * (n + 1)) / 2.0 |
| actual = sum(obj%inner%data) |
| |
| if (abs(actual - expected) < 1.0e-6) then |
| print *, "PASS" |
| else |
| print *, "FAIL", actual, expected |
| end if |
| |
| deallocate(obj%inner%data) |
| end program test_default_mapper_enter_data_teams_collapse |
| |
| ! CHECK: PASS |