https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65454
Bug ID: 65454 Summary: Extending both forms of relational operators Product: gcc Version: 4.9.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: fortran Assignee: unassigned at gcc dot gnu.org Reporter: wxcvbn789456123-nw6wda at yahoo dot fr Extending both forms of relational operators Dear Sirs, The F2008 Working Document, J3/12-007, states in 12.4.3.4.2 Defined operations: "Because both forms of each relational operator have the same interpretation (7.1.6.2), extending one form (such as <=) has the effect of defining both forms (<= and .LE.)." However, the following program does not compile with gfortran. This problem does not occur with ifort. Operating system = Microsoft Windows 7 SP1 gfortran: provided by cygwin Example under a Cygwin session: bash 1 : uname -smo CYGWIN_NT-6.1-WOW i686 Cygwin bash 2 : gfortran --version | head -3 GNU Fortran (GCC) 4.9.2 Copyright (C) 2014 Free Software Foundation, Inc. bash 3 : cat oper.f90 MODULE deriv_m IMPLICIT NONE TYPE deriv_t INTEGER :: i END TYPE deriv_t INTERFACE OPERATOR (<=) MODULE PROCEDURE :: deriv_LE_deriv END INTERFACE OPERATOR (<=) CONTAINS ELEMENTAL FUNCTION deriv_LE_deriv (a, b) RESULT (c) TYPE(deriv_t), INTENT(IN) :: a, b LOGICAL :: c c = a%i .LE. b%i END FUNCTION deriv_LE_deriv END MODULE deriv_m PROGRAM oper USE :: deriv_m, ONLY: deriv_t, OPERATOR(.LE.) IMPLICIT NONE TYPE(deriv_t) :: one = deriv_t(1), two = deriv_t(2) WRITE (*,'(A,L1)') '(one <= two) = ', one <= two WRITE (*,'(A,L1)') '(one .LE. two) = ', one .LE. two END PROGRAM oper bash 4 : gfortran oper.f90 -o g.exe oper.f90:19.33: USE :: deriv_m, ONLY: deriv_t, OPERATOR(.LE.) 1 Error: Intrinsic operator '.le.' referenced at (1) not found in module 'deriv_m' oper.f90:22.42: WRITE (*,'(A,L1)') '(one <= two) = ', one <= two 1 Error: Operands of comparison operator '<=' at (1) are TYPE(deriv_t)/TYPE(deriv_t) oper.f90:23.42: WRITE (*,'(A,L1)') '(one .LE. two) = ', one .LE. two 1 Error: Operands of comparison operator '.le.' at (1) are TYPE(deriv_t)/TYPE(deriv_t) bash 5 : ifort /nologo oper.f90 /exe:i.exe bash 6 : ./i.exe (one <= two) = T (one .LE. two) = T Can this behavior be considered as a bug? Greetings Paul