This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug fortran/24545] New: gfortran bug regarding interface block with named END INTERFACE statements


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]