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