When using a custom mapper outside of the module it was defined, it is not found and crashes the compilation. Below is a short reproducer for the issue:
MODULE field_mod
IMPLICIT NONE
TYPE :: field_t
REAL, ALLOCATABLE :: buf(:)
END TYPE field_t
!$omp declare mapper(custom: field_t :: t) map(t%buf)
END MODULE field_mod
PROGRAM reproducer
USE field_mod
IMPLICIT NONE
REAL :: validation(5)
TYPE(field_t) :: f_t
ALLOCATE(f_t%buf(5))
f_t%buf = 42.0
!$omp target map(mapper(custom), tofrom: f_t) map(from: validation)
validation(:) = f_t%buf(:)
!$omp end target
PRINT*, "Expected: 42. 42. 42. 42. 42."
PRINT*, "Actual:", validation
DEALLOCATE(f_t%buf)
END PROGRAM reproducer
Compiling this code (with cuda in my case) crashes...
flang -fopenmp -fopenmp-targets=nvptx64-nvidia-cuda -fopenmp-version=52 main.F90 -O3
...with the error message:
error: loc("f_t"("/home/jfuchs/reproducer/main.F90":18:22)): invalid mapper id
error: verification of lowering to FIR failed
We can cross check the correct behavior by moving the !$omp declare mapper... line below into the PROGRAM directly. Then compilation succeeds and the values are as expected after the target region.
I am using flang version 22.0.0git (git@github.com:llvm/llvm-project.git a8057ff12956b7dd6dec44f9610c446c828c4af8).