Gfortran type mismatch error flag
Gfortran 10 added the default behavior to make type mismatches an error instead of a warning.
Legacy Fortran programs too often did not explicitly specify the procedure interfaces to allow implicit polymorphism.
The Fortran 2008 standard cleaned up this situation in part with type(*)
.
Workaround: Gfortran flag -fallow-argument-mismatch
can be used to degrade the errors to warnings.
It is however
strongly recommended
to fix the problem in the legacy code, if it’s part of your code ownership.
Possible workaround
For external libraries like MPI-2, the interfaces are intended to be polymorphic but use Fortran 90-style interfaces. The user code can declare an explicit interface.
However, this is not recommended – we have seen intermittent runtime errors with MPI-2 using the technique below, that were entirely fixed by using the “mpi_f08” MPI-3+ interface.
use mpi, only : MPI_STATUS_SIZE
implicit none
interface
!! This avoids GCC >= 10 type mismatch warnings for MPI-2
subroutine mpi_send(BUF, COUNT, DATATYPE, DEST, TAG, COMM, IERROR)
type(*), dimension(..), intent(in) :: BUF
integer, intent(in) :: COUNT, DATATYPE, DEST, TAG, COMM
integer, intent(out) :: IERROR
end subroutine
subroutine mpi_recv(BUF, COUNT, DATATYPE, SOURCE, TAG, COMM, STATUS, IERROR)
import MPI_STATUS_SIZE
type(*), dimension(..), intent(in) :: BUF
integer, intent(in) :: COUNT, DATATYPE, SOURCE, TAG, COMM
integer, intent(out) :: STATUS(MPI_STATUS_SIZE), IERROR
end subroutine
end interface