! RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s ! Test that parameter (constant) arrays can be mapped to OpenMP target regions ! and are mapped as read-only when accessed with dynamic indices. module param_array_module implicit none integer, parameter :: dp = selected_real_kind(15, 307) ! Parameter arrays that should be mapped to device real(dp), parameter :: const_array(3) = [1.0_dp, 2.0_dp, 3.0_dp] integer, parameter :: int_array(4) = [10, 20, 30, 40] contains ! Parameter array with dynamic index in target region with teams distribute ! CHECK-LABEL: func.func @_QMparam_array_modulePtest_param_array_target subroutine test_param_array_target(idx) integer, intent(in) :: idx integer :: i real(dp) :: result ! CHECK: omp.map.info{{.*}}map_clauses(implicit, to){{.*}}{name = "const_array"} !$omp target teams distribute parallel do do i = 1, 3 ! Access parameter array with dynamic index result = const_array(idx) end do !$omp end target teams distribute parallel do end subroutine test_param_array_target ! Integer parameter array in simple target region ! CHECK-LABEL: func.func @_QMparam_array_modulePtest_int_param_array subroutine test_int_param_array(idx) integer, intent(in) :: idx integer :: result ! CHECK: omp.map.info{{.*}}map_clauses(implicit, to){{.*}}{name = "int_array"} !$omp target ! Access parameter array with dynamic index result = int_array(idx) !$omp end target end subroutine test_int_param_array ! Verify scalar parameters are NOT mapped (can be inlined) ! CHECK-LABEL: func.func @_QMparam_array_modulePtest_scalar_param subroutine test_scalar_param() integer, parameter :: scalar_const = 42 integer :: result ! CHECK-NOT: omp.map.info{{.*}}{name = "scalar_const"} !$omp target result = scalar_const !$omp end target end subroutine test_scalar_param ! Test character scalar parameter with dynamic substring access ! CHECK-LABEL: func.func @_QMparam_array_modulePtest_char_substring subroutine test_char_substring(start_idx, end_idx) integer, intent(in) :: start_idx, end_idx character(len=20), parameter :: char_scalar = "constant_string_data" character(len=10) :: result ! CHECK: omp.map.info{{.*}}map_clauses(implicit, to){{.*}}{name = "char_scalar"} !$omp target ! Dynamic substring access - character scalar must be mapped result = char_scalar(start_idx:end_idx) !$omp end target end subroutine test_char_substring ! Verify character scalar with constant substring is NOT mapped ! CHECK-LABEL: func.func @_QMparam_array_modulePtest_char_const_substring subroutine test_char_const_substring() character(len=20), parameter :: char_const = "constant_string_data" character(len=5) :: result ! CHECK-NOT: omp.map.info{{.*}}{name = "char_const"} !$omp target ! Constant substring access - can be inlined, no mapping needed result = char_const(1:5) !$omp end target end subroutine test_char_const_substring end module param_array_module