Hello,
The code example listed at the end of this email fails to compile with gfortran
4.1.0 20051025 (experimental). Compiling like so:
gfortran -c gfortran_test.f90
produces the error message:
In file gfortran_test.f90:16
END INTERFACE OPERATOR (.EqualTo.)
1
Error: Expecting 'END INTERFACE OPERATOR (.compare_float.)' at (1)
This problem with recognizing the end interface statement flows on and produces
a whole slew of (spurious) error messages on valid code.
If I change the source code line
END INTERFACE OPERATOR (.EqualTo.)
to simply
END INTERFACE
the code compiles just fine. However, I believe that using the syntax of
END INTERFACE OPERATOR (.EqualTo.)
is standard Fortran95.
Thanks,
paulv
------<<cut here for gfortran_test.f90>>------
MODULE Compare_Float_Numbers
IMPLICIT NONE
PRIVATE
PUBLIC :: Compare_Float
PUBLIC :: OPERATOR (.EqualTo.)
INTERFACE Compare_Float
MODULE PROCEDURE Compare_Float_Single
MODULE PROCEDURE Compare_Float_Double
END INTERFACE Compare_Float
INTERFACE OPERATOR (.EqualTo.)
MODULE PROCEDURE Is_Equal_To_Single
MODULE PROCEDURE Is_Equal_To_Double
END INTERFACE OPERATOR (.EqualTo.)
INTEGER, PARAMETER :: Single = SELECTED_REAL_KIND(6) ! Single precision
INTEGER, PARAMETER :: Double = SELECTED_REAL_KIND(15) ! Double precision
CONTAINS
! -- Is Equal To
ELEMENTAL FUNCTION Is_Equal_To_Single( x, y ) RESULT( Equal_To )
REAL( Single ), INTENT( IN ) :: x, y
LOGICAL :: Equal_To
Equal_To = ABS( x - y ) < SPACING( MAX(ABS(x),ABS(y)) )
END FUNCTION Is_Equal_To_Single
ELEMENTAL FUNCTION Is_Equal_To_Double( x, y ) RESULT( Equal_To )
REAL( Double ), INTENT( IN ) :: x, y
LOGICAL :: Equal_To
Equal_To = ABS( x - y ) < SPACING( MAX(ABS(x),ABS(y)) )
END FUNCTION Is_Equal_To_Double
! -- General floating point comparison
ELEMENTAL FUNCTION Compare_Float_Single( x, y, ulp ) RESULT( Compare )
REAL( Single ), INTENT( IN ) :: x
REAL( Single ), INTENT( IN ) :: y
INTEGER, OPTIONAL, INTENT( IN ) :: ulp
LOGICAL :: Compare
REAL( Single ) :: Rel
Rel = 1.0_Single
IF ( PRESENT( ulp ) ) THEN
Rel = REAL( ABS(ulp), Single )
END IF
Compare = ABS( x - y ) < ( Rel * SPACING( MAX(ABS(x),ABS(y)) ) )
END FUNCTION Compare_Float_Single
ELEMENTAL FUNCTION Compare_Float_Double( x, y, ulp ) RESULT( Compare )
REAL( Double ), INTENT( IN ) :: x
REAL( Double ), INTENT( IN ) :: y
INTEGER, OPTIONAL, INTENT( IN ) :: ulp
LOGICAL :: Compare
REAL( Double ) :: Rel
Rel = 1.0_Double
IF ( PRESENT( ulp ) ) THEN
Rel = REAL( ABS(ulp), Double )
END IF
Compare = ABS( x - y ) < ( Rel * SPACING( MAX(ABS(x),ABS(y)) ) )
END FUNCTION Compare_Float_Double
END MODULE Compare_Float_Numbers
------<<cut here for gfortran_test.f90>>------
--
Summary: gfortran bug regarding interface block with named END
INTERFACE statements
Product: gcc
Version: 4.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: fortran
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: paul dot vandelst at ssec dot wisc dot edu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24545