Created attachment 50106 [details]
Module file to reproduce issue
The OpenACC standard states that "The routine directive with a name may appear in the specification part of a subroutine, function or module, and applies to the named subroutine or function."
However, the following does not compile with Gfortran:
function modifier(x) result(y)
!$acc routine seq
real(kind =8) :: x,y
y = 2 * x
end function modifier
!$acc routine(modifier) seq
integer(kind = 4) :: i
!$acc parallel loop collapse(3) independent private(i)
do i = 1,q
x(i,j,k) = 23.
x(i,j,k) = modifier(x(i))
end subroutine do_work
gfortran -fopenacc -Wall -Wextra -c mymodule.f90
26 | !$acc routine(modifier) seq
Error: Invalid NAME ‘modifier’ in !$ACC ROUTINE ( NAME ) at (1)
See attached file for reference, snippet in description is not quite correct as I was trying to be brief
(Now: OpenACC spec issue #345)
I am not sure that a use as in attachment 50106 [details] is really intended, namely: placing the "acc routine" into a sibling procedure.
However, gfortran seems to reject too much – at least with the current wording.
The problem is that the diagnostic already happens at call time (gfc_match_oacc_routine) which requires that the symbol has been encountered before (during parsing) and the usage is such that it has to be in the current scope and cannot be in the parent scope.