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

Reply via email to