blob: c44beb7e4ec9a10764ad02ea67146310c2f7162c [file] [log] [blame]
! { dg-do run }
! PR fortran/120505
! Check that struct components are mapped in increasing address order.
module m
type t
integer, allocatable :: den1(:,:), den2(:,:), den3(:,:)
real, allocatable :: data1(:), data2(:)
end type t
type t2
type(t), allocatable :: tiles(:)
end type t2
type(t2) :: var
contains
! Helper subroutine to validate array contents
subroutine validate_arrays(test_id, expect_den1, expect_den2, expect_den3, &
expect_data1, expect_data2)
integer :: test_id, i, j
integer, intent(in) :: expect_den1(:,:), expect_den2(:,:), expect_den3(:,:)
real, intent(in) :: expect_data1(:), expect_data2(:)
if (any (var%tiles(1)%den1 /= expect_den1)) then
print *, "Test", test_id, ": den1 mismatch"
stop 1
end if
if (any (var%tiles(1)%den2 /= expect_den2)) then
print *, "Test", test_id, ": den2 mismatch"
stop 1
end if
if (any (var%tiles(1)%den3 /= expect_den3)) then
print *, "Test", test_id, ": den3 mismatch"
stop 1
end if
if (any (abs(var%tiles(1)%data1 - expect_data1) > 1.0e-6)) then
print *, "Test", test_id, ": data1 mismatch"
stop 1
end if
if (any (abs(var%tiles(1)%data2 - expect_data2) > 1.0e-2)) then
print *, "Test", test_id, ": data2 mismatch"
stop 1
end if
end subroutine validate_arrays
end module m
use m
! Initialize test data
allocate(var%tiles(1))
var%tiles(1)%den1 = reshape([1,2,3,4],[2,2])
var%tiles(1)%den2 = reshape([11,22,33,44],[2,2])
var%tiles(1)%den3 = reshape([111,222,333,444],[2,2])
var%tiles(1)%data1 = [1.5, 2.5, 3.5]
var%tiles(1)%data2 = [10.1, 20.2, 30.3]
! ========== TEST 1: Reverse mapping order (den2, den3, den1, data2, data1) ==========
!$omp target enter data map(var%tiles(1)%den2, var%tiles(1)%den3, &
!$omp& var%tiles(1)%den1, var%tiles(1)%data2, &
!$omp& var%tiles(1)%data1)
!$omp target
if (any (var%tiles(1)%den1 /= reshape([1,2,3,4],[2,2]))) stop 1
if (any (var%tiles(1)%den2 /= reshape([11,22,33,44],[2,2]))) stop 1
if (any (var%tiles(1)%den3 /= reshape([111,222,333,444],[2,2]))) stop 1
if (any (abs(var%tiles(1)%data1 - [1.5, 2.5, 3.5]) > 1.0e-6)) stop 1
if (any (abs(var%tiles(1)%data2 - [10.1, 20.2, 30.3]) > 1.0e-6)) stop 1
var%tiles(1)%den1 = var%tiles(1)%den1 + 5
var%tiles(1)%den2 = var%tiles(1)%den2 + 7
var%tiles(1)%den3 = var%tiles(1)%den3 + 9
var%tiles(1)%data1 = var%tiles(1)%data1 * 2.0
var%tiles(1)%data2 = var%tiles(1)%data2 * 3.0
!$omp end target
!$omp target exit data map(var%tiles(1)%den2, var%tiles(1)%den3, &
!$omp& var%tiles(1)%den1, var%tiles(1)%data2, &
!$omp& var%tiles(1)%data1)
call validate_arrays(1, &
reshape([6,7,8,9],[2,2]), reshape([18,29,40,51],[2,2]), reshape([120,231,342,453],[2,2]), &
[3.0, 5.0, 7.0], [30.3, 60.6, 90.9])
! Reset data
var%tiles(1)%den1 = reshape([1,2,3,4],[2,2])
var%tiles(1)%den2 = reshape([11,22,33,44],[2,2])
var%tiles(1)%den3 = reshape([111,222,333,444],[2,2])
var%tiles(1)%data1 = [1.5, 2.5, 3.5]
var%tiles(1)%data2 = [10.1, 20.2, 30.3]
! ========== TEST 2: Different permutation (den3, data1, den1, den2, data2) ==========
!$omp target enter data map(var%tiles(1)%den3, var%tiles(1)%data1, &
!$omp& var%tiles(1)%den1, var%tiles(1)%den2, &
!$omp& var%tiles(1)%data2)
!$omp target
var%tiles(1)%den1 = var%tiles(1)%den1 * 2
var%tiles(1)%den2 = var%tiles(1)%den2 * 2
var%tiles(1)%den3 = var%tiles(1)%den3 * 2
var%tiles(1)%data1 = var%tiles(1)%data1 + 100.0
var%tiles(1)%data2 = var%tiles(1)%data2 + 100.0
!$omp end target
!$omp target exit data map(var%tiles(1)%den3, var%tiles(1)%data1, &
!$omp& var%tiles(1)%den1, var%tiles(1)%den2, &
!$omp& var%tiles(1)%data2)
call validate_arrays(2, &
reshape([2,4,6,8],[2,2]), reshape([22,44,66,88],[2,2]), reshape([222,444,666,888],[2,2]), &
[101.5, 102.5, 103.5], [110.1, 120.2, 130.3])
! Reset data
var%tiles(1)%den1 = reshape([1,2,3,4],[2,2])
var%tiles(1)%den2 = reshape([11,22,33,44],[2,2])
var%tiles(1)%den3 = reshape([111,222,333,444],[2,2])
var%tiles(1)%data1 = [1.5, 2.5, 3.5]
var%tiles(1)%data2 = [10.1, 20.2, 30.3]
! ========== TEST 3: Subset of components mapped (den2, data1 only) ==========
!$omp target enter data map(var%tiles(1)%data1, var%tiles(1)%den2)
!$omp target
if (any (var%tiles(1)%den2 /= reshape([11,22,33,44],[2,2]))) stop 1
if (any (abs(var%tiles(1)%data1 - [1.5, 2.5, 3.5]) > 1.0e-6)) stop 1
var%tiles(1)%den2 = var%tiles(1)%den2 - 3
var%tiles(1)%data1 = var%tiles(1)%data1 * 10.0
!$omp end target
!$omp target exit data map(var%tiles(1)%data1, var%tiles(1)%den2)
call validate_arrays(3, &
reshape([1,2,3,4],[2,2]), reshape([8,19,30,41],[2,2]), reshape([111,222,333,444],[2,2]), &
[15.0, 25.0, 35.0], [10.1, 20.2, 30.3])
! Reset data
var%tiles(1)%den1 = reshape([1,2,3,4],[2,2])
var%tiles(1)%den2 = reshape([11,22,33,44],[2,2])
var%tiles(1)%den3 = reshape([111,222,333,444],[2,2])
var%tiles(1)%data1 = [1.5, 2.5, 3.5]
var%tiles(1)%data2 = [10.1, 20.2, 30.3]
! ========== TEST 4: Enter and exit maps in different orders ==========
!$omp target enter data map(var%tiles(1)%den1, var%tiles(1)%den3, &
!$omp& var%tiles(1)%data2)
!$omp target
if (any (var%tiles(1)%den1 /= reshape([1,2,3,4],[2,2]))) stop 1
if (any (var%tiles(1)%den3 /= reshape([111,222,333,444],[2,2]))) stop 1
if (any (abs(var%tiles(1)%data2 - [10.1, 20.2, 30.3]) > 1.0e-2)) stop 1
var%tiles(1)%den1 = var%tiles(1)%den1 * 3
var%tiles(1)%den3 = var%tiles(1)%den3 + 50
var%tiles(1)%data2 = var%tiles(1)%data2 * 2.0
!$omp end target
!$omp target exit data map(var%tiles(1)%data2, var%tiles(1)%den3, &
!$omp& var%tiles(1)%den1)
call validate_arrays(4, &
reshape([3,6,9,12],[2,2]), reshape([11,22,33,44],[2,2]), reshape([161,272,383,494],[2,2]), &
[1.5, 2.5, 3.5], [20.2, 40.4, 60.6])
print *, "All tests passed!"
end