| ! 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 |