blob: b85fb067803d2b745470454d950a7aaffa596851 [file] [log] [blame] [edit]
! Offload test for parameter (constant) arrays and character scalars accessed
! with dynamic indices/substrings in OpenMP target regions.
! REQUIRES: flang, amdgpu
! RUN: %libomptarget-compile-fortran-run-and-check-generic
program test_parameter_mapping
implicit none
integer, parameter :: dp = selected_real_kind(15, 307)
logical :: all_tests_pass
all_tests_pass = .true.
! Test 1: Parameter array with dynamic index
call test_param_array_dynamic_index(all_tests_pass)
! Test 2: Integer parameter array
call test_int_param_array(all_tests_pass)
! Test 3: Character scalar with dynamic substring
call test_char_substring(all_tests_pass)
! Test 4: Verify scalar parameters work (inlined)
call test_scalar_param(all_tests_pass)
if (all_tests_pass) then
print *, "PASS"
else
print *, "FAIL"
endif
contains
! Test 1: Parameter array with dynamic index in target region
subroutine test_param_array_dynamic_index(test_pass)
logical, intent(inout) :: test_pass
real(dp), parameter :: const_array(3) = [1.0_dp, 2.0_dp, 3.0_dp]
integer :: idx
real(dp) :: result
real(dp), parameter :: expected = 2.0_dp
real(dp), parameter :: tolerance = 1.0e-10_dp
idx = 2
result = 0.0_dp
!$omp target map(tofrom:result) map(to:idx)
! Access parameter array with dynamic index
result = const_array(idx)
!$omp end target
if (abs(result - expected) > tolerance) then
print *, "Test 1 FAILED: expected", expected, "got", result
test_pass = .false.
endif
end subroutine test_param_array_dynamic_index
! Test 2: Integer parameter array with different indices
subroutine test_int_param_array(test_pass)
logical, intent(inout) :: test_pass
integer, parameter :: int_array(4) = [10, 20, 30, 40]
integer :: idx1, idx2
integer :: result1, result2
idx1 = 1
idx2 = 4
result1 = 0
result2 = 0
!$omp target map(tofrom:result1, result2) map(to:idx1, idx2)
! Access parameter array with different dynamic indices
result1 = int_array(idx1)
result2 = int_array(idx2)
!$omp end target
if (result1 /= 10 .or. result2 /= 40) then
print *, "Test 2 FAILED: expected 10, 40 got", result1, result2
test_pass = .false.
endif
end subroutine test_int_param_array
! Test 3: Character scalar parameter with dynamic substring access
subroutine test_char_substring(test_pass)
logical, intent(inout) :: test_pass
character(len=20), parameter :: char_scalar = "constant_string_data"
integer :: start_idx, end_idx
character(len=8) :: result
character(len=8), parameter :: expected = "string_d"
start_idx = 10
end_idx = 17
result = ""
!$omp target map(tofrom:result) map(to:start_idx, end_idx)
! Dynamic substring access - character scalar must be mapped
result = char_scalar(start_idx:end_idx)
!$omp end target
if (result /= expected) then
print *, "Test 3 FAILED: expected '", expected, "' got '", result, "'"
test_pass = .false.
endif
end subroutine test_char_substring
! Test 4: Scalar parameter (can be inlined, no mapping needed)
subroutine test_scalar_param(test_pass)
logical, intent(inout) :: test_pass
integer, parameter :: scalar_const = 42
real(dp), parameter :: real_const = 3.14159_dp
integer :: int_result
real(dp) :: real_result
real(dp), parameter :: tolerance = 1.0e-5_dp
int_result = 0
real_result = 0.0_dp
!$omp target map(tofrom:int_result, real_result)
! Scalar parameters should be inlined (no mapping needed)
int_result = scalar_const
real_result = real_const
!$omp end target
if (int_result /= 42 .or. abs(real_result - real_const) > tolerance) then
print *, "Test 4 FAILED: expected 42, 3.14159 got", int_result, real_result
test_pass = .false.
endif
end subroutine test_scalar_param
end program test_parameter_mapping
! CHECK: PASS