FTN95 8.51 fails to compile some of the files in Lapack95, a large package available from Netlib. I have narrowed down the problem, and find that the presence of unUSED overlaid module procedures in a module declaration file confuses the compiler into rejecting perfectly valid code.
File lapint.F90 contains two modules.
Module APACK contains overlaid routines SDTSVB and DDTSVB that differ only in the size of reals, and are both called by the interface name NEW_DTSVB. The module also contains a routine with the interface name PERR.
Module BPACK contains diferent versions of SDTSVB and DDTSVB, but one of the arguments, B, which was 2-dimensional in APACK, is now a 1-dimensional array.
File ddts.f90 uses only PERR from APACK and OLD_DTSVB from BPACK.
Compile as follows:
ftn95 /Cfp /define USE_NEW 1 lapint.F90
ftn95 ddts.f90
[FTN95/Win32 Ver. 8.51.0 Copyright (c) Silverfrost Ltd 1993-2019]
0013) CALL OLD_DTSVB(N,NRHS,DL,D,DU,B,LDB)
*** No matching specific procedure for generic overloaded name OLD_DTSVB
1 ERROR [<NEW_DDTSVB> FTN95 v8.51.0]
*** Compilation failed
To see that there is no bug, run the code through Gfortran:
gfortran -DUSE_NEW -c lapint.F90 ddts.f90
The module file, lapint.F90:
MODULE APACK
INTERFACE PERR
SUBROUTINE XERBLA(NAME)
CHARACTER(LEN=*), INTENT(IN) :: NAME
END SUBROUTINE XERBLA
END INTERFACE PERR
#ifdef USE_NEW
INTERFACE NEW_DTSVB
SUBROUTINE SDTSVB(N,NRHS,DL,D,DU,B,LDB)
INTEGER, PARAMETER :: WP = KIND(1.0E0)
REAL(WP), INTENT(INOUT) :: DL(*), D(*)
REAL(WP), INTENT(IN) :: DU(*)
REAL(WP), INTENT(INOUT) :: B(LDB,*)
INTEGER, INTENT(IN) :: N, NRHS, LDB
END SUBROUTINE SDTSVB
SUBROUTINE DDTSVB(N,NRHS,DL,D,DU,B,LDB)
INTEGER, PARAMETER :: WP = KIND(1.0D0)
REAL(WP), INTENT(INOUT) :: DL(*), D(*)
REAL(WP), INTENT(IN) :: DU(*)
REAL(WP), INTENT(INOUT) :: B(LDB,*)
INTEGER, INTENT(IN) :: N, NRHS, LDB
END SUBROUTINE DDTSVB
END INTERFACE NEW_DTSVB
#endif
END MODULE APACK
MODULE BPACK
INTERFACE OLD_DTSVB
SUBROUTINE SDTSVB(N,NRHS,DL,D,DU,B,LDB)
INTEGER, PARAMETER :: WP = KIND(1.0E0)
REAL(WP), INTENT(INOUT) :: DL(*), D(*)
REAL(WP), INTENT(IN) :: DU(*)
REAL(WP), INTENT(INOUT) :: B(*)
INTEGER, INTENT(IN) :: N, NRHS, LDB
END SUBROUTINE SDTSVB
SUBROUTINE DDTSVB(N,NRHS,DL,D,DU,B,LDB)
INTEGER, PARAMETER :: WP = KIND(1.0D0)
REAL(WP), INTENT(INOUT) :: DL(*), D(*)
REAL(WP), INTENT(IN) :: DU(*)
REAL(WP), INTENT(INOUT) :: B(*)
INTEGER, INTENT(IN) :: N, NRHS, LDB
END SUBROUTINE DDTSVB
END INTERFACE OLD_DTSVB
END MODULE BPACK
The second file, ddts.f90, has to be put into a follow-on post.