In a program unit that contains a CALL <SNAME>(arglist) statement, SNAME is understood to be the name of a subroutine, typeless, and endowed with the EXTERNAL attribute. The F95 standard says:
If the interface of the dummy procedure is implicit and a reference to the procedure appears as a subroutine reference, the actual argument shall be a subroutine or dummy procedure.
Given the following source code
subroutine sub(a,b)
integer a,b
b=a+2
return
end subroutine
subroutine eval(a,b,proc)
integer a,b
call proc(a,b)
return
end subroutine eval
program tst
external sub
integer p,q
p=2
call eval(p,q,sub)
print *,q
end program
FTN95 says
[FTN95/x64 Ver. 8.10.0 Copyright (c) Silverfrost Ltd 1993-2017]
NO ERRORS [<SUB> FTN95 v8.10.0]
NO ERRORS [<EVAL> FTN95 v8.10.0]
0017) call eval(p,q,sub)
WARNING - In a previous call to EVAL, the third argument was of type SUBROUTINE, it is now REAL(KIND=1) FUNCTION
NO ERRORS, 1 WARNING [<TST> FTN95 v8.10.0]
There is only one call to EVAL! If I compile with /IMP, I then get
NO ERRORS [<SUB> FTN95 v8.10.0]
0007) subroutine eval(a,b,proc)
*** PROC must appear in a type declaration because IMPLICIT NONE has been used
1 ERROR [<EVAL> FTN95 v8.10.0]
NO ERRORS [<TST> FTN95 v8.10.0]
*** Compilation failed