llvm-project/flang/test/Semantics/OpenMP/defaultmap-clause-none.f90
agozillon 739a5a4685
[Flang][OpenMP] Fix defaultmap(none) being overly aggressive with symbol checks (#167806)
Currently we're picking up and complaining about builtin (and procedure)
symbols like null() when defaultmap(none) is set, so I've relaxed the
restriction a bit to allow for procedures and named constants to bypass
the restriction. It might be the case that we want to tighten it up
again in certain aspects in the future.
2025-11-14 19:03:33 +01:00

134 lines
5.0 KiB
Fortran

! RUN: %python %S/../test_errors.py %s %flang -fopenmp -fopenmp-version=51
subroutine defaultmap_all_none_no_errors
implicit none
real :: array(10)
integer, pointer :: ptr(:)
real, allocatable :: alloca
integer :: index
!$omp target defaultmap(none) map(to: index, alloca) map(tofrom: array, ptr)
do index = 1, 10
ptr(index) = array(index) + alloca
end do
!$omp end target
end subroutine defaultmap_all_none_no_errors
subroutine defaultmap_all_none
implicit none
real :: array(10)
integer, pointer :: ptr(:)
real, allocatable :: alloca
integer :: index
!$omp target defaultmap(none)
!ERROR: The DEFAULTMAP(NONE) clause requires that 'index' must be listed in a data-sharing attribute, data-mapping attribute, or is_device_ptr clause
do index = 1, 10
!ERROR: The DEFAULTMAP(NONE) clause requires that 'ptr' must be listed in a data-sharing attribute, data-mapping attribute, or is_device_ptr clause
!ERROR: The DEFAULTMAP(NONE) clause requires that 'index' must be listed in a data-sharing attribute, data-mapping attribute, or is_device_ptr clause
!ERROR: The DEFAULTMAP(NONE) clause requires that 'array' must be listed in a data-sharing attribute, data-mapping attribute, or is_device_ptr clause
!ERROR: The DEFAULTMAP(NONE) clause requires that 'index' must be listed in a data-sharing attribute, data-mapping attribute, or is_device_ptr clause
!ERROR: The DEFAULTMAP(NONE) clause requires that 'alloca' must be listed in a data-sharing attribute, data-mapping attribute, or is_device_ptr clause
ptr(index) = array(index) + alloca
end do
!$omp end target
end subroutine defaultmap_all_none
subroutine defaultmap_scalar_none
implicit none
real :: array(10)
integer, pointer :: ptr(:)
real, allocatable :: alloca
integer :: index
!$omp target defaultmap(none: scalar)
!ERROR: The DEFAULTMAP(NONE) clause requires that 'index' must be listed in a data-sharing attribute, data-mapping attribute, or is_device_ptr clause
do index = 1, 10
!ERROR: The DEFAULTMAP(NONE) clause requires that 'index' must be listed in a data-sharing attribute, data-mapping attribute, or is_device_ptr clause
!ERROR: The DEFAULTMAP(NONE) clause requires that 'index' must be listed in a data-sharing attribute, data-mapping attribute, or is_device_ptr clause
ptr(index) = array(index) + alloca
end do
!$omp end target
end subroutine defaultmap_scalar_none
subroutine defaultmap_pointer_none
implicit none
real :: array(10)
integer, pointer :: ptr(:)
real, allocatable :: alloca
integer :: index
!$omp target defaultmap(none: pointer)
do index = 1, 10
!ERROR: The DEFAULTMAP(NONE) clause requires that 'ptr' must be listed in a data-sharing attribute, data-mapping attribute, or is_device_ptr clause
ptr(index) = array(index) + alloca
end do
!$omp end target
end subroutine defaultmap_pointer_none
subroutine defaultmap_allocatable_none
implicit none
real :: array(10)
integer, pointer :: ptr(:)
real, allocatable :: alloca
integer :: index
!$omp target defaultmap(none: allocatable)
do index = 1, 10
!ERROR: The DEFAULTMAP(NONE) clause requires that 'alloca' must be listed in a data-sharing attribute, data-mapping attribute, or is_device_ptr clause
ptr(index) = array(index) + alloca
end do
!$omp end target
end subroutine defaultmap_allocatable_none
subroutine defaultmap_aggregate_none
implicit none
real :: array(10)
integer, pointer :: ptr(:)
real, allocatable :: alloca
integer :: index
!$omp target defaultmap(none: aggregate)
do index = 1, 10
!ERROR: The DEFAULTMAP(NONE) clause requires that 'array' must be listed in a data-sharing attribute, data-mapping attribute, or is_device_ptr clause
ptr(index) = array(index) + alloca
end do
!$omp end target
end subroutine defaultmap_aggregate_none
! Verify we do not catch null in defaultmap(none)
subroutine defaultmap_builtin_none
implicit none
integer, pointer :: ptr(:)
!$omp target defaultmap(none) map(ptr)
!CHECK-NOT: The DEFAULTMAP(NONE) clause requires that 'null' must be listed in a data-sharing attribute, data-mapping attribute, or is_device_ptr clause
ptr => null()
!$omp end target
end subroutine defaultmap_builtin_none
module pro
implicit none
contains
function test_procedure() result(ret)
integer :: ret
ret = 1
end function test_procedure
! Verify we do not catch a function symbol in defaultmap(none)
! but do catch procedure pointers
subroutine defaultmap_func_and_procedure_pointer()
implicit none
procedure(test_procedure), pointer :: f1
integer :: i
f1 => test_procedure
!$omp target defaultmap(none) map(i)
!ERROR: The DEFAULTMAP(NONE) clause requires that 'f1' must be listed in a data-sharing attribute, data-mapping attribute, or is_device_ptr clause
i = f1()
i = test_procedure()
!$omp end target
end subroutine defaultmap_func_and_procedure_pointer
end module