Where to allocate and release pointer variables is at the discretion of the programmer, and there may be good reasons why that should be done in one place rather than another -- reasons that may not be visible in a cut down example.
The following is a rearrangement of StamK's original code, in which the allocation of the pointer variable is done just-in-time. In this version, the pointer attribute is required for the dummy arguments, and FTN95 8.51 still displays the same errors as before. The error ('attempt to access undefined argument to routine') is clearly wrong, since the statement is assigning a value to CVAL, which is a component of the previously allocated variable PR.
MODULE TESTMOD
TYPE STRUCTTYPE
SEQUENCE
CHARACTER*60 :: COUNTRY
END TYPE STRUCTTYPE
TYPE (STRUCTTYPE), POINTER :: PR_ROOT
CONTAINS
SUBROUTINE RU_GetC (PAR, K, CVAL)
CHARACTER*(*) PAR, CVAL
CVAL = 'England' ! Line-14, where error occurs with /undef
END SUBROUTINE
SUBROUTINE A_DFLT (PR)
TYPE (STRUCTTYPE), POINTER :: PR
ALLOCATE(PR)
PR%COUNTRY = ' '
CALL RU_GetC ('country', 1, PR%COUNTRY)
END SUBROUTINE
SUBROUTINE A_INIT (PR)
TYPE (STRUCTTYPE), POINTER :: PR
CALL A_DFLT (PR)
END SUBROUTINE
SUBROUTINE START()
CALL A_INIT (PR_ROOT)
print*,'PR_ROOT%country=',PR_ROOT%country
NULLIFY(PR_ROOT)
END SUBROUTINE
END MODULE TESTMOD
PROGRAM MAIN
USE TESTMOD
CALL START()
END PROGRAM
I hope that the updated compiler works correctly on this modified version, too.